From 9e552ea3953e2f277db68c585dcddfa84d5ce8b9 Mon Sep 17 00:00:00 2001 From: DuRuofu Date: Mon, 17 Feb 2025 17:40:08 +0800 Subject: [PATCH] =?UTF-8?q?code:=20=E6=B7=BB=E5=8A=A0=E7=8E=B0=E6=9C=89?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/01.start/blink/.gitignore | 6 + code/01.start/blink/CMakeLists.txt | 6 + code/01.start/blink/README.md | 77 + code/01.start/blink/main/CMakeLists.txt | 2 + code/01.start/blink/main/blink_example_main.c | 91 + code/01.start/blink/main/idf_component.yml | 2 + code/01.start/blink/pytest_blink.py | 17 + .../task/任务优先级/CMakeLists.txt | 8 + .../task/任务优先级/main/CMakeLists.txt | 4 + .../task/任务优先级/main/main.c | 42 + .../task/任务优先级/sdkconfig.defaults | 5 + .../task/任务列表信息显示/CMakeLists.txt | 8 + .../task/任务列表信息显示/main/CMakeLists.txt | 4 + .../task/任务列表信息显示/main/main.c | 41 + .../task/任务列表信息显示/sdkconfig.defaults | 7 + .../task/任务创建/CMakeLists.txt | 8 + .../task/任务创建/main/CMakeLists.txt | 2 + .../task/任务创建/main/main.c | 29 + .../task/任务创建/sdkconfig.defaults | 5 + .../task/任务创建时传递参数/CMakeLists.txt | 8 + .../任务创建时传递参数/main/CMakeLists.txt | 4 + .../task/任务创建时传递参数/main/main.c | 64 + .../任务创建时传递参数/sdkconfig.defaults | 5 + .../task/任务删除_1/CMakeLists.txt | 8 + .../task/任务删除_1/main/CMakeLists.txt | 2 + .../task/任务删除_1/main/main.c | 32 + .../task/任务删除_1/sdkconfig.defaults | 5 + .../task/任务删除_2/CMakeLists.txt | 8 + .../task/任务删除_2/main/CMakeLists.txt | 2 + .../task/任务删除_2/main/main.c | 28 + .../task/任务删除_2/sdkconfig.defaults | 5 + code/03.freertos_basic/timer/CMakeLists.txt | 8 + .../timer/main/CMakeLists.txt | 4 + code/03.freertos_basic/timer/main/main.c | 40 + .../timer/sdkconfig.defaults | 7 + code/03.freertos_basic/watchdog/readme.md | 0 .../basics/adc_continuous/.gitignore | 6 + .../basics/adc_continuous/CMakeLists.txt | 8 + .../basics/adc_continuous/main/CMakeLists.txt | 2 + .../adc_continuous/main/adc_continuous.c | 165 ++ .../basics/adc_oneshot/.gitignore | 6 + .../basics/adc_oneshot/CMakeLists.txt | 8 + .../basics/adc_oneshot/main/CMakeLists.txt | 2 + .../basics/adc_oneshot/main/adc_oneshot.c | 46 + .../basics/dac_cosine/.gitignore | 6 + .../basics/dac_cosine/CMakeLists.txt | 8 + .../basics/dac_cosine/main/CMakeLists.txt | 2 + .../basics/dac_cosine/main/dac_cosine.c | 36 + .../basics/dac_oneshot/.gitignore | 6 + .../basics/dac_oneshot/CMakeLists.txt | 8 + .../basics/dac_oneshot/main/CMakeLists.txt | 2 + .../basics/dac_oneshot/main/dac_oneshot.c | 39 + code/04.peripheral/basics/gpio/.gitignore | 6 + code/04.peripheral/basics/gpio/CMakeLists.txt | 8 + .../basics/gpio/main/CMakeLists.txt | 2 + code/04.peripheral/basics/gpio/main/gpio.c | 31 + .../04.peripheral/basics/gpio_exit/.gitignore | 6 + .../basics/gpio_exit/CMakeLists.txt | 8 + .../basics/gpio_exit/main/CMakeLists.txt | 2 + .../basics/gpio_exit/main/gpio_exit.c | 34 + code/04.peripheral/basics/gptimer/.gitignore | 6 + .../basics/gptimer/CMakeLists.txt | 8 + .../basics/gptimer/main/CMakeLists.txt | 2 + .../basics/gptimer/main/gptimer.c | 196 ++ .../basics/i2c_bh1750/.gitignore | 6 + .../basics/i2c_bh1750/CMakeLists.txt | 8 + .../basics/i2c_bh1750/main/CMakeLists.txt | 2 + .../basics/i2c_bh1750/main/main.c | 127 + .../04.peripheral/basics/i2c_tools/.gitignore | 6 + .../basics/i2c_tools/CMakeLists.txt | 8 + code/04.peripheral/basics/i2c_tools/README.md | 209 ++ .../basics/i2c_tools/main/CMakeLists.txt | 3 + .../basics/i2c_tools/main/Kconfig.projbuild | 10 + .../basics/i2c_tools/main/cmd_i2ctools.c | 414 +++ .../basics/i2c_tools/main/cmd_i2ctools.h | 20 + .../i2c_tools/main/i2ctools_example_main.c | 80 + .../basics/i2c_tools/partitions_example.csv | 6 + .../basics/i2c_tools/sdkconfig.defaults | 17 + code/04.peripheral/basics/led_pwm/.gitignore | 6 + .../basics/led_pwm/CMakeLists.txt | 8 + .../basics/led_pwm/main/CMakeLists.txt | 2 + .../basics/led_pwm/main/led_pwm.c | 65 + code/04.peripheral/basics/uart/.gitignore | 6 + code/04.peripheral/basics/uart/CMakeLists.txt | 8 + .../basics/uart/main/CMakeLists.txt | 2 + code/04.peripheral/basics/uart/main/uart.c | 64 + .../storage/flash_fatfs/.gitignore | 6 + .../storage/flash_fatfs/.gitignore copy | 6 + .../storage/flash_fatfs/CMakeLists.txt | 8 + .../storage/flash_fatfs/fatfs_image/hello.txt | 1 + .../storage/flash_fatfs/main/CMakeLists.txt | 5 + .../flash_fatfs/main/flash_fatfs-backups.c | 85 + .../storage/flash_fatfs/main/flash_fatfs.c | 73 + .../storage/flash_fatfs/partitions.csv | 7 + .../storage/flash_spiffs/.gitignore | 6 + .../storage/flash_spiffs/CMakeLists.txt | 8 + .../storage/flash_spiffs/main/CMakeLists.txt | 8 + .../storage/flash_spiffs/main/flash_spiffs.c | 122 + .../storage/flash_spiffs/partitions.csv | 7 + .../flash_spiffs/spiffs_image/hello.txt | 1 + .../flash_spiffs/spiffs_image/sub/alice.txt | 21 + code/04.peripheral/storage/nvs/.gitignore | 6 + code/04.peripheral/storage/nvs/CMakeLists.txt | 8 + .../storage/nvs/main/CMakeLists.txt | 2 + code/04.peripheral/storage/nvs/main/nvs.c | 75 + .../storage/partition/.gitignore | 6 + .../storage/partition/CMakeLists.txt | 6 + .../storage/partition/main/CMakeLists.txt | 2 + .../storage/partition/main/partition.c | 51 + .../storage/partition/partitions.csv | 8 + .../storage/partition/sdkconfig.ci | 0 code/04.peripheral/storage/sdmmc/.gitignore | 6 + .../storage/sdmmc/CMakeLists.txt | 8 + .../storage/sdmmc/main/CMakeLists.txt | 9 + .../storage/sdmmc/main/Kconfig.projbuild | 63 + code/04.peripheral/storage/sdmmc/main/main.c | 217 ++ .../event_group/事件组同步/CMakeLists.txt | 8 + .../事件组同步/main/CMakeLists.txt | 4 + .../event_group/事件组同步/main/main.c | 99 + .../event_group/事件组同步/sdkconfig.defaults | 7 + .../event_group/事件组等待/CMakeLists.txt | 8 + .../事件组等待/main/CMakeLists.txt | 4 + .../event_group/事件组等待/main/main.c | 71 + .../event_group/事件组等待/sdkconfig.defaults | 7 + .../queue/队列传参_常量/CMakeLists.txt | 8 + .../queue/队列传参_常量/main/CMakeLists.txt | 4 + .../queue/队列传参_常量/main/main.c | 78 + .../queue/队列传参_常量/sdkconfig.defaults | 7 + .../queue/队列传参_指针/CMakeLists.txt | 8 + .../queue/队列传参_指针/main/CMakeLists.txt | 4 + .../queue/队列传参_指针/main/main.c | 85 + .../queue/队列传参_指针/sdkconfig.defaults | 7 + .../queue/队列传参_结构体/CMakeLists.txt | 8 + .../queue/队列传参_结构体/main/CMakeLists.txt | 4 + .../queue/队列传参_结构体/main/main.c | 86 + .../queue/队列传参_结构体/sdkconfig.defaults | 7 + .../queue/队列多进单出模型/CMakeLists.txt | 8 + .../队列多进单出模型/main/CMakeLists.txt | 4 + .../queue/队列多进单出模型/main/main.c | 97 + .../queue/队列多进单出模型/sdkconfig.defaults | 7 + .../queue/队列邮箱/CMakeLists.txt | 8 + .../queue/队列邮箱/main/CMakeLists.txt | 4 + .../queue/队列邮箱/main/main.c | 127 + .../queue/队列邮箱/sdkconfig.defaults | 7 + .../queue/队列集合/CMakeLists.txt | 8 + .../queue/队列集合/main/CMakeLists.txt | 4 + .../queue/队列集合/main/main.c | 110 + .../queue/队列集合/sdkconfig.defaults | 7 + .../semphr/二进制信号量/CMakeLists.txt | 8 + .../semphr/二进制信号量/main/CMakeLists.txt | 4 + .../semphr/二进制信号量/main/main.c | 60 + .../semphr/二进制信号量/sdkconfig.defaults | 7 + .../semphr/互斥量/CMakeLists.txt | 8 + .../semphr/互斥量/main/CMakeLists.txt | 4 + .../semphr/互斥量/main/main.c | 80 + .../semphr/互斥量/sdkconfig.defaults | 7 + .../semphr/计数信号量/CMakeLists.txt | 8 + .../semphr/计数信号量/main/CMakeLists.txt | 4 + .../semphr/计数信号量/main/main.c | 59 + .../semphr/计数信号量/sdkconfig.defaults | 7 + .../semphr/递归互斥量/CMakeLists.txt | 8 + .../semphr/递归互斥量/main/CMakeLists.txt | 4 + .../semphr/递归互斥量/main/main.c | 79 + .../semphr/递归互斥量/sdkconfig.defaults | 7 + .../task_notify/任务通知值/CMakeLists.txt | 8 + .../任务通知值/main/CMakeLists.txt | 4 + .../task_notify/任务通知值/main/main.c | 65 + .../task_notify/任务通知值/sdkconfig.defaults | 7 + .../task_notify/直接任务通知/CMakeLists.txt | 8 + .../直接任务通知/main/CMakeLists.txt | 4 + .../task_notify/直接任务通知/main/main.c | 44 + .../直接任务通知/sdkconfig.defaults | 7 + code/05.wifi/espnow/recv/.gitignore | 6 + code/05.wifi/espnow/recv/CMakeLists.txt | 8 + code/05.wifi/espnow/recv/main/CMakeLists.txt | 2 + code/05.wifi/espnow/recv/main/main.c | 83 + code/05.wifi/espnow/send/.gitignore | 6 + code/05.wifi/espnow/send/CMakeLists.txt | 8 + code/05.wifi/espnow/send/main/CMakeLists.txt | 2 + code/05.wifi/espnow/send/main/main.c | 113 + code/05.wifi/http/http_client/.gitignore | 6 + code/05.wifi/http/http_client/CMakeLists.txt | 8 + .../http/http_client/main/CMakeLists.txt | 2 + code/05.wifi/http/http_client/main/main.c | 200 ++ code/05.wifi/http/http_server/.gitignore | 6 + code/05.wifi/http/http_server/CMakeLists.txt | 8 + .../http/http_server/main/CMakeLists.txt | 2 + code/05.wifi/http/http_server/main/main.c | 440 +++ code/05.wifi/mqtt/mqtt_tcp/.gitignore | 6 + code/05.wifi/mqtt/mqtt_tcp/CMakeLists.txt | 8 + .../05.wifi/mqtt/mqtt_tcp/main/CMakeLists.txt | 2 + code/05.wifi/mqtt/mqtt_tcp/main/main.c | 228 ++ code/05.wifi/mqtt/mqtt_ws/.gitignore | 6 + code/05.wifi/mqtt/mqtt_ws/CMakeLists.txt | 8 + code/05.wifi/mqtt/mqtt_ws/main/CMakeLists.txt | 2 + code/05.wifi/mqtt/mqtt_ws/main/main.c | 6 + code/05.wifi/sntp/.gitignore | 6 + code/05.wifi/sntp/CMakeLists.txt | 8 + code/05.wifi/sntp/main/CMakeLists.txt | 2 + code/05.wifi/sntp/main/main.c | 188 ++ code/05.wifi/tcp/wifi_tcp_client/.gitignore | 6 + .../tcp/wifi_tcp_client/CMakeLists.txt | 8 + .../tcp/wifi_tcp_client/main/CMakeLists.txt | 2 + code/05.wifi/tcp/wifi_tcp_client/main/main.c | 185 ++ code/05.wifi/tcp/wifi_tcp_server/.gitignore | 6 + .../tcp/wifi_tcp_server/CMakeLists.txt | 8 + .../tcp/wifi_tcp_server/main/CMakeLists.txt | 2 + code/05.wifi/tcp/wifi_tcp_server/main/main.c | 240 ++ code/05.wifi/udp/wifi_udp_client/.gitignore | 6 + .../udp/wifi_udp_client/CMakeLists.txt | 8 + .../udp/wifi_udp_client/main/CMakeLists.txt | 2 + code/05.wifi/udp/wifi_udp_client/main/main.c | 176 ++ code/05.wifi/udp/wifi_udp_server/.gitignore | 6 + .../udp/wifi_udp_server/CMakeLists.txt | 8 + .../udp/wifi_udp_server/main/CMakeLists.txt | 2 + code/05.wifi/udp/wifi_udp_server/main/main.c | 185 ++ code/05.wifi/websocket/client/.gitignore | 6 + code/05.wifi/websocket/client/CMakeLists.txt | 8 + .../websocket/client/main/CMakeLists.txt | 2 + .../websocket/client/main/idf_component.yml | 17 + code/05.wifi/websocket/client/main/main.c | 264 ++ .../websocket/client/websocket_echo_server.py | 18 + code/05.wifi/websocket/server/.gitignore | 6 + code/05.wifi/websocket/server/CMakeLists.txt | 8 + .../websocket/server/main/CMakeLists.txt | 2 + code/05.wifi/websocket/server/main/main.c | 262 ++ code/05.wifi/wifi_ap/.gitignore | 6 + code/05.wifi/wifi_ap/CMakeLists.txt | 8 + code/05.wifi/wifi_ap/main/CMakeLists.txt | 2 + code/05.wifi/wifi_ap/main/main.c | 83 + code/05.wifi/wifi_scan/.gitignore | 6 + code/05.wifi/wifi_scan/CMakeLists.txt | 8 + code/05.wifi/wifi_scan/main/CMakeLists.txt | 2 + code/05.wifi/wifi_scan/main/main.c | 183 ++ code/05.wifi/wifi_sta/.gitignore | 6 + code/05.wifi/wifi_sta/CMakeLists.txt | 8 + code/05.wifi/wifi_sta/main/CMakeLists.txt | 2 + code/05.wifi/wifi_sta/main/main.c | 100 + code/05.wifi/wifi_sta_static_ip/.gitignore | 6 + .../05.wifi/wifi_sta_static_ip/CMakeLists.txt | 8 + .../wifi_sta_static_ip/main/CMakeLists.txt | 2 + code/05.wifi/wifi_sta_static_ip/main/main.c | 114 + code/07.bluetooth/README.md | 0 code/08.gui/lvgl_spd2010_gui/.gitignore | 6 + code/08.gui/lvgl_spd2010_gui/CMakeLists.txt | 8 + .../lvgl_spd2010_gui/main/CMakeLists.txt | 23 + .../lvgl_spd2010_gui/main/idf_component.yml | 19 + code/08.gui/lvgl_spd2010_gui/main/main.c | 416 +++ .../lvgl_spd2010_gui/main/ui/custom/custom.c | 42 + .../lvgl_spd2010_gui/main/ui/custom/custom.h | 23 + .../lvgl_spd2010_gui/main/ui/custom/custom.mk | 7 + .../main/ui/custom/lv_conf_ext.h | 42 + .../main/ui/generated/events_init.c | 19 + .../main/ui/generated/events_init.h | 26 + .../main/ui/generated/generated.mk | 16 + .../main/ui/generated/gui_guider.c | 34 + .../main/ui/generated/gui_guider.h | 42 + .../guider_customer_fonts.h | 21 + .../guider_customer_fonts.mk | 6 + .../ui/generated/guider_fonts/guider_fonts.mk | 6 + .../lv_font_montserratMedium_12.c | 1880 +++++++++++++ .../lv_font_montserratMedium_16.c | 2411 +++++++++++++++++ .../main/ui/generated/images/images.mk | 6 + .../main/ui/generated/setup_scr_screen.c | 90 + .../main/ui/generated/widgets_init.c | 78 + .../main/ui/generated/widgets_init.h | 30 + code/08.gui/lvgl_spd2010_gui/partitions.csv | 5 + code/08.gui/lvgl_transplant_gc9a01/.gitignore | 6 + .../lvgl_transplant_gc9a01/CMakeLists.txt | 8 + ...8寸ESP32圆形TFT屏幕开发板说明书 V1.01.pdf | Bin 0 -> 673114 bytes .../lvgl_transplant_gc9a01/docs/原理图.pdf | Bin 0 -> 27385 bytes .../main/CMakeLists.txt | 2 + .../main/idf_component.yml | 18 + .../08.gui/lvgl_transplant_gc9a01/main/main.c | 245 ++ .../lvgl_transplant_gc9a01/partitions.csv | 5 + .../08.gui/lvgl_transplant_spd2010/.gitignore | 6 + .../lvgl_transplant_spd2010/CMakeLists.txt | 8 + .../main/CMakeLists.txt | 2 + .../main/idf_component.yml | 19 + .../lvgl_transplant_spd2010/main/main.c | 408 +++ .../lvgl_transplant_spd2010/partitions.csv | 5 + 281 files changed, 13912 insertions(+) create mode 100644 code/01.start/blink/.gitignore create mode 100644 code/01.start/blink/CMakeLists.txt create mode 100644 code/01.start/blink/README.md create mode 100644 code/01.start/blink/main/CMakeLists.txt create mode 100644 code/01.start/blink/main/blink_example_main.c create mode 100644 code/01.start/blink/main/idf_component.yml create mode 100644 code/01.start/blink/pytest_blink.py create mode 100644 code/03.freertos_basic/task/任务优先级/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务优先级/main/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务优先级/main/main.c create mode 100644 code/03.freertos_basic/task/任务优先级/sdkconfig.defaults create mode 100644 code/03.freertos_basic/task/任务列表信息显示/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务列表信息显示/main/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务列表信息显示/main/main.c create mode 100644 code/03.freertos_basic/task/任务列表信息显示/sdkconfig.defaults create mode 100644 code/03.freertos_basic/task/任务创建/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务创建/main/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务创建/main/main.c create mode 100644 code/03.freertos_basic/task/任务创建/sdkconfig.defaults create mode 100644 code/03.freertos_basic/task/任务创建时传递参数/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务创建时传递参数/main/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务创建时传递参数/main/main.c create mode 100644 code/03.freertos_basic/task/任务创建时传递参数/sdkconfig.defaults create mode 100644 code/03.freertos_basic/task/任务删除_1/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务删除_1/main/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务删除_1/main/main.c create mode 100644 code/03.freertos_basic/task/任务删除_1/sdkconfig.defaults create mode 100644 code/03.freertos_basic/task/任务删除_2/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务删除_2/main/CMakeLists.txt create mode 100644 code/03.freertos_basic/task/任务删除_2/main/main.c create mode 100644 code/03.freertos_basic/task/任务删除_2/sdkconfig.defaults create mode 100644 code/03.freertos_basic/timer/CMakeLists.txt create mode 100644 code/03.freertos_basic/timer/main/CMakeLists.txt create mode 100644 code/03.freertos_basic/timer/main/main.c create mode 100644 code/03.freertos_basic/timer/sdkconfig.defaults create mode 100644 code/03.freertos_basic/watchdog/readme.md create mode 100644 code/04.peripheral/basics/adc_continuous/.gitignore create mode 100644 code/04.peripheral/basics/adc_continuous/CMakeLists.txt create mode 100644 code/04.peripheral/basics/adc_continuous/main/CMakeLists.txt create mode 100644 code/04.peripheral/basics/adc_continuous/main/adc_continuous.c create mode 100644 code/04.peripheral/basics/adc_oneshot/.gitignore create mode 100644 code/04.peripheral/basics/adc_oneshot/CMakeLists.txt create mode 100644 code/04.peripheral/basics/adc_oneshot/main/CMakeLists.txt create mode 100644 code/04.peripheral/basics/adc_oneshot/main/adc_oneshot.c create mode 100644 code/04.peripheral/basics/dac_cosine/.gitignore create mode 100644 code/04.peripheral/basics/dac_cosine/CMakeLists.txt create mode 100644 code/04.peripheral/basics/dac_cosine/main/CMakeLists.txt create mode 100644 code/04.peripheral/basics/dac_cosine/main/dac_cosine.c create mode 100644 code/04.peripheral/basics/dac_oneshot/.gitignore create mode 100644 code/04.peripheral/basics/dac_oneshot/CMakeLists.txt create mode 100644 code/04.peripheral/basics/dac_oneshot/main/CMakeLists.txt create mode 100644 code/04.peripheral/basics/dac_oneshot/main/dac_oneshot.c create mode 100644 code/04.peripheral/basics/gpio/.gitignore create mode 100644 code/04.peripheral/basics/gpio/CMakeLists.txt create mode 100644 code/04.peripheral/basics/gpio/main/CMakeLists.txt create mode 100644 code/04.peripheral/basics/gpio/main/gpio.c create mode 100644 code/04.peripheral/basics/gpio_exit/.gitignore create mode 100644 code/04.peripheral/basics/gpio_exit/CMakeLists.txt create mode 100644 code/04.peripheral/basics/gpio_exit/main/CMakeLists.txt create mode 100644 code/04.peripheral/basics/gpio_exit/main/gpio_exit.c create mode 100644 code/04.peripheral/basics/gptimer/.gitignore create mode 100644 code/04.peripheral/basics/gptimer/CMakeLists.txt create mode 100644 code/04.peripheral/basics/gptimer/main/CMakeLists.txt create mode 100644 code/04.peripheral/basics/gptimer/main/gptimer.c create mode 100644 code/04.peripheral/basics/i2c_bh1750/.gitignore create mode 100644 code/04.peripheral/basics/i2c_bh1750/CMakeLists.txt create mode 100644 code/04.peripheral/basics/i2c_bh1750/main/CMakeLists.txt create mode 100644 code/04.peripheral/basics/i2c_bh1750/main/main.c create mode 100644 code/04.peripheral/basics/i2c_tools/.gitignore create mode 100644 code/04.peripheral/basics/i2c_tools/CMakeLists.txt create mode 100644 code/04.peripheral/basics/i2c_tools/README.md create mode 100644 code/04.peripheral/basics/i2c_tools/main/CMakeLists.txt create mode 100644 code/04.peripheral/basics/i2c_tools/main/Kconfig.projbuild create mode 100644 code/04.peripheral/basics/i2c_tools/main/cmd_i2ctools.c create mode 100644 code/04.peripheral/basics/i2c_tools/main/cmd_i2ctools.h create mode 100644 code/04.peripheral/basics/i2c_tools/main/i2ctools_example_main.c create mode 100644 code/04.peripheral/basics/i2c_tools/partitions_example.csv create mode 100644 code/04.peripheral/basics/i2c_tools/sdkconfig.defaults create mode 100644 code/04.peripheral/basics/led_pwm/.gitignore create mode 100644 code/04.peripheral/basics/led_pwm/CMakeLists.txt create mode 100644 code/04.peripheral/basics/led_pwm/main/CMakeLists.txt create mode 100644 code/04.peripheral/basics/led_pwm/main/led_pwm.c create mode 100644 code/04.peripheral/basics/uart/.gitignore create mode 100644 code/04.peripheral/basics/uart/CMakeLists.txt create mode 100644 code/04.peripheral/basics/uart/main/CMakeLists.txt create mode 100644 code/04.peripheral/basics/uart/main/uart.c create mode 100644 code/04.peripheral/storage/flash_fatfs/.gitignore create mode 100644 code/04.peripheral/storage/flash_fatfs/.gitignore copy create mode 100644 code/04.peripheral/storage/flash_fatfs/CMakeLists.txt create mode 100644 code/04.peripheral/storage/flash_fatfs/fatfs_image/hello.txt create mode 100644 code/04.peripheral/storage/flash_fatfs/main/CMakeLists.txt create mode 100644 code/04.peripheral/storage/flash_fatfs/main/flash_fatfs-backups.c create mode 100644 code/04.peripheral/storage/flash_fatfs/main/flash_fatfs.c create mode 100644 code/04.peripheral/storage/flash_fatfs/partitions.csv create mode 100644 code/04.peripheral/storage/flash_spiffs/.gitignore create mode 100644 code/04.peripheral/storage/flash_spiffs/CMakeLists.txt create mode 100644 code/04.peripheral/storage/flash_spiffs/main/CMakeLists.txt create mode 100644 code/04.peripheral/storage/flash_spiffs/main/flash_spiffs.c create mode 100644 code/04.peripheral/storage/flash_spiffs/partitions.csv create mode 100644 code/04.peripheral/storage/flash_spiffs/spiffs_image/hello.txt create mode 100644 code/04.peripheral/storage/flash_spiffs/spiffs_image/sub/alice.txt create mode 100644 code/04.peripheral/storage/nvs/.gitignore create mode 100644 code/04.peripheral/storage/nvs/CMakeLists.txt create mode 100644 code/04.peripheral/storage/nvs/main/CMakeLists.txt create mode 100644 code/04.peripheral/storage/nvs/main/nvs.c create mode 100644 code/04.peripheral/storage/partition/.gitignore create mode 100644 code/04.peripheral/storage/partition/CMakeLists.txt create mode 100644 code/04.peripheral/storage/partition/main/CMakeLists.txt create mode 100644 code/04.peripheral/storage/partition/main/partition.c create mode 100644 code/04.peripheral/storage/partition/partitions.csv create mode 100644 code/04.peripheral/storage/partition/sdkconfig.ci create mode 100644 code/04.peripheral/storage/sdmmc/.gitignore create mode 100644 code/04.peripheral/storage/sdmmc/CMakeLists.txt create mode 100644 code/04.peripheral/storage/sdmmc/main/CMakeLists.txt create mode 100644 code/04.peripheral/storage/sdmmc/main/Kconfig.projbuild create mode 100644 code/04.peripheral/storage/sdmmc/main/main.c create mode 100644 code/05.freertos_advanced/event_group/事件组同步/CMakeLists.txt create mode 100644 code/05.freertos_advanced/event_group/事件组同步/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/event_group/事件组同步/main/main.c create mode 100644 code/05.freertos_advanced/event_group/事件组同步/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/event_group/事件组等待/CMakeLists.txt create mode 100644 code/05.freertos_advanced/event_group/事件组等待/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/event_group/事件组等待/main/main.c create mode 100644 code/05.freertos_advanced/event_group/事件组等待/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/queue/队列传参_常量/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列传参_常量/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列传参_常量/main/main.c create mode 100644 code/05.freertos_advanced/queue/队列传参_常量/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/queue/队列传参_指针/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列传参_指针/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列传参_指针/main/main.c create mode 100644 code/05.freertos_advanced/queue/队列传参_指针/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/queue/队列传参_结构体/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列传参_结构体/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列传参_结构体/main/main.c create mode 100644 code/05.freertos_advanced/queue/队列传参_结构体/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/queue/队列多进单出模型/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列多进单出模型/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列多进单出模型/main/main.c create mode 100644 code/05.freertos_advanced/queue/队列多进单出模型/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/queue/队列邮箱/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列邮箱/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列邮箱/main/main.c create mode 100644 code/05.freertos_advanced/queue/队列邮箱/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/queue/队列集合/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列集合/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/queue/队列集合/main/main.c create mode 100644 code/05.freertos_advanced/queue/队列集合/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/semphr/二进制信号量/CMakeLists.txt create mode 100644 code/05.freertos_advanced/semphr/二进制信号量/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/semphr/二进制信号量/main/main.c create mode 100644 code/05.freertos_advanced/semphr/二进制信号量/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/semphr/互斥量/CMakeLists.txt create mode 100644 code/05.freertos_advanced/semphr/互斥量/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/semphr/互斥量/main/main.c create mode 100644 code/05.freertos_advanced/semphr/互斥量/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/semphr/计数信号量/CMakeLists.txt create mode 100644 code/05.freertos_advanced/semphr/计数信号量/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/semphr/计数信号量/main/main.c create mode 100644 code/05.freertos_advanced/semphr/计数信号量/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/semphr/递归互斥量/CMakeLists.txt create mode 100644 code/05.freertos_advanced/semphr/递归互斥量/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/semphr/递归互斥量/main/main.c create mode 100644 code/05.freertos_advanced/semphr/递归互斥量/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/task_notify/任务通知值/CMakeLists.txt create mode 100644 code/05.freertos_advanced/task_notify/任务通知值/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/task_notify/任务通知值/main/main.c create mode 100644 code/05.freertos_advanced/task_notify/任务通知值/sdkconfig.defaults create mode 100644 code/05.freertos_advanced/task_notify/直接任务通知/CMakeLists.txt create mode 100644 code/05.freertos_advanced/task_notify/直接任务通知/main/CMakeLists.txt create mode 100644 code/05.freertos_advanced/task_notify/直接任务通知/main/main.c create mode 100644 code/05.freertos_advanced/task_notify/直接任务通知/sdkconfig.defaults create mode 100644 code/05.wifi/espnow/recv/.gitignore create mode 100644 code/05.wifi/espnow/recv/CMakeLists.txt create mode 100644 code/05.wifi/espnow/recv/main/CMakeLists.txt create mode 100644 code/05.wifi/espnow/recv/main/main.c create mode 100644 code/05.wifi/espnow/send/.gitignore create mode 100644 code/05.wifi/espnow/send/CMakeLists.txt create mode 100644 code/05.wifi/espnow/send/main/CMakeLists.txt create mode 100644 code/05.wifi/espnow/send/main/main.c create mode 100644 code/05.wifi/http/http_client/.gitignore create mode 100644 code/05.wifi/http/http_client/CMakeLists.txt create mode 100644 code/05.wifi/http/http_client/main/CMakeLists.txt create mode 100644 code/05.wifi/http/http_client/main/main.c create mode 100644 code/05.wifi/http/http_server/.gitignore create mode 100644 code/05.wifi/http/http_server/CMakeLists.txt create mode 100644 code/05.wifi/http/http_server/main/CMakeLists.txt create mode 100644 code/05.wifi/http/http_server/main/main.c create mode 100644 code/05.wifi/mqtt/mqtt_tcp/.gitignore create mode 100644 code/05.wifi/mqtt/mqtt_tcp/CMakeLists.txt create mode 100644 code/05.wifi/mqtt/mqtt_tcp/main/CMakeLists.txt create mode 100644 code/05.wifi/mqtt/mqtt_tcp/main/main.c create mode 100644 code/05.wifi/mqtt/mqtt_ws/.gitignore create mode 100644 code/05.wifi/mqtt/mqtt_ws/CMakeLists.txt create mode 100644 code/05.wifi/mqtt/mqtt_ws/main/CMakeLists.txt create mode 100644 code/05.wifi/mqtt/mqtt_ws/main/main.c create mode 100644 code/05.wifi/sntp/.gitignore create mode 100644 code/05.wifi/sntp/CMakeLists.txt create mode 100644 code/05.wifi/sntp/main/CMakeLists.txt create mode 100644 code/05.wifi/sntp/main/main.c create mode 100644 code/05.wifi/tcp/wifi_tcp_client/.gitignore create mode 100644 code/05.wifi/tcp/wifi_tcp_client/CMakeLists.txt create mode 100644 code/05.wifi/tcp/wifi_tcp_client/main/CMakeLists.txt create mode 100644 code/05.wifi/tcp/wifi_tcp_client/main/main.c create mode 100644 code/05.wifi/tcp/wifi_tcp_server/.gitignore create mode 100644 code/05.wifi/tcp/wifi_tcp_server/CMakeLists.txt create mode 100644 code/05.wifi/tcp/wifi_tcp_server/main/CMakeLists.txt create mode 100644 code/05.wifi/tcp/wifi_tcp_server/main/main.c create mode 100644 code/05.wifi/udp/wifi_udp_client/.gitignore create mode 100644 code/05.wifi/udp/wifi_udp_client/CMakeLists.txt create mode 100644 code/05.wifi/udp/wifi_udp_client/main/CMakeLists.txt create mode 100644 code/05.wifi/udp/wifi_udp_client/main/main.c create mode 100644 code/05.wifi/udp/wifi_udp_server/.gitignore create mode 100644 code/05.wifi/udp/wifi_udp_server/CMakeLists.txt create mode 100644 code/05.wifi/udp/wifi_udp_server/main/CMakeLists.txt create mode 100644 code/05.wifi/udp/wifi_udp_server/main/main.c create mode 100644 code/05.wifi/websocket/client/.gitignore create mode 100644 code/05.wifi/websocket/client/CMakeLists.txt create mode 100644 code/05.wifi/websocket/client/main/CMakeLists.txt create mode 100644 code/05.wifi/websocket/client/main/idf_component.yml create mode 100644 code/05.wifi/websocket/client/main/main.c create mode 100644 code/05.wifi/websocket/client/websocket_echo_server.py create mode 100644 code/05.wifi/websocket/server/.gitignore create mode 100644 code/05.wifi/websocket/server/CMakeLists.txt create mode 100644 code/05.wifi/websocket/server/main/CMakeLists.txt create mode 100644 code/05.wifi/websocket/server/main/main.c create mode 100644 code/05.wifi/wifi_ap/.gitignore create mode 100644 code/05.wifi/wifi_ap/CMakeLists.txt create mode 100644 code/05.wifi/wifi_ap/main/CMakeLists.txt create mode 100644 code/05.wifi/wifi_ap/main/main.c create mode 100644 code/05.wifi/wifi_scan/.gitignore create mode 100644 code/05.wifi/wifi_scan/CMakeLists.txt create mode 100644 code/05.wifi/wifi_scan/main/CMakeLists.txt create mode 100644 code/05.wifi/wifi_scan/main/main.c create mode 100644 code/05.wifi/wifi_sta/.gitignore create mode 100644 code/05.wifi/wifi_sta/CMakeLists.txt create mode 100644 code/05.wifi/wifi_sta/main/CMakeLists.txt create mode 100644 code/05.wifi/wifi_sta/main/main.c create mode 100644 code/05.wifi/wifi_sta_static_ip/.gitignore create mode 100644 code/05.wifi/wifi_sta_static_ip/CMakeLists.txt create mode 100644 code/05.wifi/wifi_sta_static_ip/main/CMakeLists.txt create mode 100644 code/05.wifi/wifi_sta_static_ip/main/main.c create mode 100644 code/07.bluetooth/README.md create mode 100644 code/08.gui/lvgl_spd2010_gui/.gitignore create mode 100644 code/08.gui/lvgl_spd2010_gui/CMakeLists.txt create mode 100644 code/08.gui/lvgl_spd2010_gui/main/CMakeLists.txt create mode 100644 code/08.gui/lvgl_spd2010_gui/main/idf_component.yml create mode 100644 code/08.gui/lvgl_spd2010_gui/main/main.c create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.c create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.h create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.mk create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/custom/lv_conf_ext.h create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/events_init.c create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/events_init.h create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/generated.mk create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/gui_guider.c create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/gui_guider.h create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_customer_fonts/guider_customer_fonts.h create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_customer_fonts/guider_customer_fonts.mk create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/guider_fonts.mk create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/lv_font_montserratMedium_12.c create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/lv_font_montserratMedium_16.c create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/images/images.mk create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/setup_scr_screen.c create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/widgets_init.c create mode 100644 code/08.gui/lvgl_spd2010_gui/main/ui/generated/widgets_init.h create mode 100644 code/08.gui/lvgl_spd2010_gui/partitions.csv create mode 100644 code/08.gui/lvgl_transplant_gc9a01/.gitignore create mode 100644 code/08.gui/lvgl_transplant_gc9a01/CMakeLists.txt create mode 100644 code/08.gui/lvgl_transplant_gc9a01/docs/1.28寸ESP32圆形TFT屏幕开发板说明书 V1.01.pdf create mode 100644 code/08.gui/lvgl_transplant_gc9a01/docs/原理图.pdf create mode 100644 code/08.gui/lvgl_transplant_gc9a01/main/CMakeLists.txt create mode 100644 code/08.gui/lvgl_transplant_gc9a01/main/idf_component.yml create mode 100644 code/08.gui/lvgl_transplant_gc9a01/main/main.c create mode 100644 code/08.gui/lvgl_transplant_gc9a01/partitions.csv create mode 100644 code/08.gui/lvgl_transplant_spd2010/.gitignore create mode 100644 code/08.gui/lvgl_transplant_spd2010/CMakeLists.txt create mode 100644 code/08.gui/lvgl_transplant_spd2010/main/CMakeLists.txt create mode 100644 code/08.gui/lvgl_transplant_spd2010/main/idf_component.yml create mode 100644 code/08.gui/lvgl_transplant_spd2010/main/main.c create mode 100644 code/08.gui/lvgl_transplant_spd2010/partitions.csv diff --git a/code/01.start/blink/.gitignore b/code/01.start/blink/.gitignore new file mode 100644 index 0000000..ee2dc29 --- /dev/null +++ b/code/01.start/blink/.gitignore @@ -0,0 +1,6 @@ +*build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/01.start/blink/CMakeLists.txt b/code/01.start/blink/CMakeLists.txt new file mode 100644 index 0000000..489742a --- /dev/null +++ b/code/01.start/blink/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(blink) diff --git a/code/01.start/blink/README.md b/code/01.start/blink/README.md new file mode 100644 index 0000000..4ec579e --- /dev/null +++ b/code/01.start/blink/README.md @@ -0,0 +1,77 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | + +# Blink Example + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example demonstrates how to blink a LED using GPIO or using the [led_strip](https://components.espressif.com/component/espressif/led_strip) component for the addressable LED, i.e. [WS2812](https://cdn-shop.adafruit.com/datasheets/WS2812B.pdf). + +The `led_strip` is installed via [component manager](main/idf_component.yml). + +## How to Use Example + +Before project configuration and build, be sure to set the correct chip target using `idf.py set-target `. + +### Hardware Required + +* A development board with Espressif SoC (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) +* A USB cable for Power supply and programming + +Some development boards use an addressable LED instead of a regular one. These development boards include: + +| Board | LED type | Pin | +| -------------------- | -------------------- | -------------------- | +| ESP32-C3-DevKitC-1 | Addressable | GPIO8 | +| ESP32-C3-DevKitM-1 | Addressable | GPIO8 | +| ESP32-S2-DevKitM-1 | Addressable | GPIO18 | +| ESP32-S2-Saola-1 | Addressable | GPIO18 | +| ESP32-S3-DevKitC-1 | Addressable | GPIO48 | + +See [Development Boards](https://www.espressif.com/en/products/devkits) for more information about it. + +### Configure the Project + +Open the project configuration menu (`idf.py menuconfig`). + +In the `Example Configuration` menu: + +* Select the LED type in the `Blink LED type` option. + * Use `GPIO` for regular LED blink. +* Set the GPIO number used for the signal in the `Blink GPIO number` option. +* Set the blinking period in the `Blink period in ms` option. + +### Build and Flash + +Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +As you run the example, you will see the LED blinking, according to the previously defined period. For the addressable LED, you can also change the LED color by setting the `led_strip_set_pixel(led_strip, 0, 16, 16, 16);` (LED Strip, Pixel Number, Red, Green, Blue) with values from 0 to 255 in the [source file](main/blink_example_main.c). + +```text +I (315) example: Example configured to blink addressable LED! +I (325) example: Turning the LED OFF! +I (1325) example: Turning the LED ON! +I (2325) example: Turning the LED OFF! +I (3325) example: Turning the LED ON! +I (4325) example: Turning the LED OFF! +I (5325) example: Turning the LED ON! +I (6325) example: Turning the LED OFF! +I (7325) example: Turning the LED ON! +I (8325) example: Turning the LED OFF! +``` + +Note: The color order could be different according to the LED model. + +The pixel number indicates the pixel position in the LED strip. For a single LED, use 0. + +## Troubleshooting + +* If the LED isn't blinking, check the GPIO or the LED type selection in the `Example Configuration` menu. + +For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/code/01.start/blink/main/CMakeLists.txt b/code/01.start/blink/main/CMakeLists.txt new file mode 100644 index 0000000..a7f0bac --- /dev/null +++ b/code/01.start/blink/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "blink_example_main.c" + INCLUDE_DIRS ".") diff --git a/code/01.start/blink/main/blink_example_main.c b/code/01.start/blink/main/blink_example_main.c new file mode 100644 index 0000000..8a7c4ed --- /dev/null +++ b/code/01.start/blink/main/blink_example_main.c @@ -0,0 +1,91 @@ +/* Blink Example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "esp_log.h" +#include "led_strip.h" +#include "sdkconfig.h" + +static const char *TAG = "example"; + +/* Use project configuration menu (idf.py menuconfig) to choose the GPIO to blink, + or you can edit the following line and set a number here. +*/ +#define BLINK_GPIO CONFIG_BLINK_GPIO + +static uint8_t s_led_state = 0; + +#ifdef CONFIG_BLINK_LED_RMT + +static led_strip_handle_t led_strip; + +static void blink_led(void) +{ + /* If the addressable LED is enabled */ + if (s_led_state) { + /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */ + led_strip_set_pixel(led_strip, 0, 16, 16, 16); + /* Refresh the strip to send data */ + led_strip_refresh(led_strip); + } else { + /* Set all LED off to clear all pixels */ + led_strip_clear(led_strip); + } +} + +static void configure_led(void) +{ + ESP_LOGI(TAG, "Example configured to blink addressable LED!"); + /* LED strip initialization with the GPIO and pixels number*/ + led_strip_config_t strip_config = { + .strip_gpio_num = BLINK_GPIO, + .max_leds = 1, // at least one LED on board + }; + led_strip_rmt_config_t rmt_config = { + .resolution_hz = 10 * 1000 * 1000, // 10MHz + }; + ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip)); + /* Set all LED off to clear all pixels */ + led_strip_clear(led_strip); +} + +#elif CONFIG_BLINK_LED_GPIO + +static void blink_led(void) +{ + /* Set the GPIO level according to the state (LOW or HIGH)*/ + gpio_set_level(BLINK_GPIO, s_led_state); +} + +static void configure_led(void) +{ + ESP_LOGI(TAG, "Example configured to blink GPIO LED!"); + gpio_reset_pin(BLINK_GPIO); + /* Set the GPIO as a push/pull output */ + gpio_set_direction(BLINK_GPIO, GPIO_MODE_OUTPUT); +} + +#endif + +void app_main(void) +{ + + /* Configure the peripheral according to the LED type */ + configure_led(); + + while (1) { + ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF"); + blink_led(); + /* Toggle the LED state */ + s_led_state = !s_led_state; + vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS); + } +} diff --git a/code/01.start/blink/main/idf_component.yml b/code/01.start/blink/main/idf_component.yml new file mode 100644 index 0000000..234f978 --- /dev/null +++ b/code/01.start/blink/main/idf_component.yml @@ -0,0 +1,2 @@ +dependencies: + espressif/led_strip: "^2.0.0" diff --git a/code/01.start/blink/pytest_blink.py b/code/01.start/blink/pytest_blink.py new file mode 100644 index 0000000..b7ea802 --- /dev/null +++ b/code/01.start/blink/pytest_blink.py @@ -0,0 +1,17 @@ +# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 + +import logging +import os + +import pytest +from pytest_embedded_idf.dut import IdfDut + + +@pytest.mark.supported_targets +@pytest.mark.generic +def test_blink(dut: IdfDut) -> None: + # check and log bin size + binary_file = os.path.join(dut.app.binary_path, 'blink.bin') + bin_size = os.path.getsize(binary_file) + logging.info('blink_bin_size : {}KB'.format(bin_size // 1024)) diff --git a/code/03.freertos_basic/task/任务优先级/CMakeLists.txt b/code/03.freertos_basic/task/任务优先级/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/03.freertos_basic/task/任务优先级/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/03.freertos_basic/task/任务优先级/main/CMakeLists.txt b/code/03.freertos_basic/task/任务优先级/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/03.freertos_basic/task/任务优先级/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/03.freertos_basic/task/任务优先级/main/main.c b/code/03.freertos_basic/task/任务优先级/main/main.c new file mode 100644 index 0000000..772b0bc --- /dev/null +++ b/code/03.freertos_basic/task/任务优先级/main/main.c @@ -0,0 +1,42 @@ +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +static const char *TAG = "main"; + +void Task_1(void *pvParameters) +{ + for (;;) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "Task_1"); + } + vTaskDelete(NULL); +} + +void Task_2(void *pvParameters) +{ + for (;;) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "Task_2"); + } + vTaskDelete(NULL); +} + +void app_main(void) +{ + UBaseType_t taskPriority_1 = 0; + UBaseType_t taskPriority_2 = 0; + TaskHandle_t taskHandle_1 = NULL; + TaskHandle_t taskHandle_2 = NULL; + + xTaskCreate(Task_1, "Task_1", 2048, NULL, 12, &taskHandle_1); + taskPriority_1 = uxTaskPriorityGet(taskHandle_1); + ESP_LOGI(TAG, "Task_1 优先级:%d", taskPriority_1); + + xTaskCreate(Task_2, "Task_1", 2048, NULL, 12, &taskHandle_2); + taskPriority_2 = uxTaskPriorityGet(taskHandle_2); + ESP_LOGI(TAG, "Task_1 优先级:%d", taskPriority_2); +} diff --git a/code/03.freertos_basic/task/任务优先级/sdkconfig.defaults b/code/03.freertos_basic/task/任务优先级/sdkconfig.defaults new file mode 100644 index 0000000..0f4b284 --- /dev/null +++ b/code/03.freertos_basic/task/任务优先级/sdkconfig.defaults @@ -0,0 +1,5 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y diff --git a/code/03.freertos_basic/task/任务列表信息显示/CMakeLists.txt b/code/03.freertos_basic/task/任务列表信息显示/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/03.freertos_basic/task/任务列表信息显示/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/03.freertos_basic/task/任务列表信息显示/main/CMakeLists.txt b/code/03.freertos_basic/task/任务列表信息显示/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/03.freertos_basic/task/任务列表信息显示/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/03.freertos_basic/task/任务列表信息显示/main/main.c b/code/03.freertos_basic/task/任务列表信息显示/main/main.c new file mode 100644 index 0000000..0d26525 --- /dev/null +++ b/code/03.freertos_basic/task/任务列表信息显示/main/main.c @@ -0,0 +1,41 @@ +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +static const char *TAG = "main"; + +void Task_1(void *pvParameters) +{ + for (;;) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "Task_1"); + } + vTaskDelete(NULL); +} + +void Task_2(void *pvParameters) +{ + for (;;) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "Task_2"); + } + vTaskDelete(NULL); +} + +void app_main(void) +{ + TaskHandle_t taskHandle_1 = NULL; + TaskHandle_t taskHandle_2 = NULL; + + xTaskCreate(Task_1, "Task_1", 2048, NULL, 12, &taskHandle_1); + xTaskCreate(Task_2, "Task_1", 2048, NULL, 12, &taskHandle_2); + + + // 输出任务列表 + static char cBuffer[512]={0}; + vTaskList(cBuffer); + ESP_LOGI(TAG, "任务列表:\n%s", cBuffer); +} diff --git a/code/03.freertos_basic/task/任务列表信息显示/sdkconfig.defaults b/code/03.freertos_basic/task/任务列表信息显示/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/03.freertos_basic/task/任务列表信息显示/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/03.freertos_basic/task/任务创建/CMakeLists.txt b/code/03.freertos_basic/task/任务创建/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/03.freertos_basic/task/任务创建/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/03.freertos_basic/task/任务创建/main/CMakeLists.txt b/code/03.freertos_basic/task/任务创建/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/03.freertos_basic/task/任务创建/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/03.freertos_basic/task/任务创建/main/main.c b/code/03.freertos_basic/task/任务创建/main/main.c new file mode 100644 index 0000000..8a0fcd8 --- /dev/null +++ b/code/03.freertos_basic/task/任务创建/main/main.c @@ -0,0 +1,29 @@ +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +static const char *TAG = "main"; + +// 任务函数 +void myTask(void *pvParameters) +{ + for (;;) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "myTask"); + } +} + +void app_main(void) +{ + // 创建一个 FreeRTOS 任务 + // 参数说明: + // 1. 任务入口函数:myTask + // 2. 任务名称:"myTask",用于调试时标识任务 + // 3. 任务堆栈大小:2048 字节(适当分配以避免栈溢出) + // 4. 任务参数:NULL(未传递参数) + // 5. 任务优先级:1(优先级较低,空闲任务优先级为 0) + // 6. 任务句柄:NULL(不需要保存任务句柄) + xTaskCreate(myTask, "myTask", 2048, NULL, 1, NULL); +} diff --git a/code/03.freertos_basic/task/任务创建/sdkconfig.defaults b/code/03.freertos_basic/task/任务创建/sdkconfig.defaults new file mode 100644 index 0000000..0f4b284 --- /dev/null +++ b/code/03.freertos_basic/task/任务创建/sdkconfig.defaults @@ -0,0 +1,5 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y diff --git a/code/03.freertos_basic/task/任务创建时传递参数/CMakeLists.txt b/code/03.freertos_basic/task/任务创建时传递参数/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/03.freertos_basic/task/任务创建时传递参数/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/03.freertos_basic/task/任务创建时传递参数/main/CMakeLists.txt b/code/03.freertos_basic/task/任务创建时传递参数/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/03.freertos_basic/task/任务创建时传递参数/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/03.freertos_basic/task/任务创建时传递参数/main/main.c b/code/03.freertos_basic/task/任务创建时传递参数/main/main.c new file mode 100644 index 0000000..bb53034 --- /dev/null +++ b/code/03.freertos_basic/task/任务创建时传递参数/main/main.c @@ -0,0 +1,64 @@ +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +static const char *TAG = "main"; + +typedef struct +{ + int Int; + int Array[3]; +} MyStruct; + +// 任务函数1:接收整型参数 +void Task_1(void *pvParameters) +{ + int *pInt = (int *)pvParameters; + ESP_LOGI(TAG, "取得整型参数为:%d", *pInt); + vTaskDelete(NULL); +} + +// 任务函数2:接收数组参数 +void Task_2(void *pvParameters) +{ + int *pArray = (int *)pvParameters; + ESP_LOGI(TAG, "取得数组参数为:%d %d %d", *pArray, *(pArray + 1), *(pArray + 2)); + vTaskDelete(NULL); +} + +// 任务函数3:接收结构体参数 +void Task_3(void *pvParameters) +{ + MyStruct *pStruct = (MyStruct *)pvParameters; + ESP_LOGI(TAG, "取得结构体参数为:%d %d %d %d", pStruct->Int, pStruct->Array[0], pStruct->Array[1], pStruct->Array[2]); + vTaskDelete(NULL); +} + +// 任务函数4:接收字符串参数 +void Task_4(void *pvParameters) +{ + char *pChar = (char *)pvParameters; + ESP_LOGI(TAG, "取得字符串参数为:%s", pChar); + vTaskDelete(NULL); +} + +int Parameters_1 = 1; +int Parameters_2[3] = {1, 2, 3}; +MyStruct Parameters_3 = {1, {1, 2, 3}}; +static const char *Parameters_4 = "Hello World!"; + +void app_main(void) +{ + // 传递整形参数 + xTaskCreate(Task_1, "Task_1", 2048, (void *)&Parameters_1, 1, NULL); + + // 传递数组参数 + xTaskCreate(Task_2, "Task_2", 2048, (void *)&Parameters_2, 1, NULL); + + // 传递结构体参数 + xTaskCreate(Task_3, "Task_3", 3048, (void *)&Parameters_3, 1, NULL); + + // 传递字符串参数(注意这里没有取地址符号&) + xTaskCreate(Task_4, "Task_4", 3048, (void *)Parameters_4, 1, NULL); +} diff --git a/code/03.freertos_basic/task/任务创建时传递参数/sdkconfig.defaults b/code/03.freertos_basic/task/任务创建时传递参数/sdkconfig.defaults new file mode 100644 index 0000000..0f4b284 --- /dev/null +++ b/code/03.freertos_basic/task/任务创建时传递参数/sdkconfig.defaults @@ -0,0 +1,5 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y diff --git a/code/03.freertos_basic/task/任务删除_1/CMakeLists.txt b/code/03.freertos_basic/task/任务删除_1/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/03.freertos_basic/task/任务删除_1/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/03.freertos_basic/task/任务删除_1/main/CMakeLists.txt b/code/03.freertos_basic/task/任务删除_1/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/03.freertos_basic/task/任务删除_1/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/03.freertos_basic/task/任务删除_1/main/main.c b/code/03.freertos_basic/task/任务删除_1/main/main.c new file mode 100644 index 0000000..264e5a3 --- /dev/null +++ b/code/03.freertos_basic/task/任务删除_1/main/main.c @@ -0,0 +1,32 @@ +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +static const char *TAG = "main"; + +// 任务函数 +void myTask(void *pvParameters) +{ + for (;;) + { + vTaskDelay(500 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "myTask"); + } +} + +void app_main(void) +{ + // 任务句柄 + TaskHandle_t taskHandle = NULL; + // 创建一个 FreeRTOS 任务 + xTaskCreate(myTask, "myTask", 2048, NULL, 1, &taskHandle); + + vTaskDelay(2000 / portTICK_PERIOD_MS); + + // 删除任务 + if (taskHandle != NULL) + { + vTaskDelete(taskHandle); + } +} diff --git a/code/03.freertos_basic/task/任务删除_1/sdkconfig.defaults b/code/03.freertos_basic/task/任务删除_1/sdkconfig.defaults new file mode 100644 index 0000000..0f4b284 --- /dev/null +++ b/code/03.freertos_basic/task/任务删除_1/sdkconfig.defaults @@ -0,0 +1,5 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y diff --git a/code/03.freertos_basic/task/任务删除_2/CMakeLists.txt b/code/03.freertos_basic/task/任务删除_2/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/03.freertos_basic/task/任务删除_2/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/03.freertos_basic/task/任务删除_2/main/CMakeLists.txt b/code/03.freertos_basic/task/任务删除_2/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/03.freertos_basic/task/任务删除_2/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/03.freertos_basic/task/任务删除_2/main/main.c b/code/03.freertos_basic/task/任务删除_2/main/main.c new file mode 100644 index 0000000..9fdbd2f --- /dev/null +++ b/code/03.freertos_basic/task/任务删除_2/main/main.c @@ -0,0 +1,28 @@ +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +static const char *TAG = "main"; + +// 任务函数 +void myTask(void *pvParameters) +{ + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "myTask:1"); + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "myTask:2"); + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_LOGI(TAG, "myTask:3"); + + // 删除任务(如果传递 NULL,则删除当前任务) + vTaskDelete(NULL); +} + +void app_main(void) +{ + // 任务句柄 + TaskHandle_t taskHandle = NULL; + // 创建一个 FreeRTOS 任务 + xTaskCreate(myTask, "myTask", 2048, NULL, 1, &taskHandle); +} diff --git a/code/03.freertos_basic/task/任务删除_2/sdkconfig.defaults b/code/03.freertos_basic/task/任务删除_2/sdkconfig.defaults new file mode 100644 index 0000000..0f4b284 --- /dev/null +++ b/code/03.freertos_basic/task/任务删除_2/sdkconfig.defaults @@ -0,0 +1,5 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y diff --git a/code/03.freertos_basic/timer/CMakeLists.txt b/code/03.freertos_basic/timer/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/03.freertos_basic/timer/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/03.freertos_basic/timer/main/CMakeLists.txt b/code/03.freertos_basic/timer/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/03.freertos_basic/timer/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/03.freertos_basic/timer/main/main.c b/code/03.freertos_basic/timer/main/main.c new file mode 100644 index 0000000..77240a7 --- /dev/null +++ b/code/03.freertos_basic/timer/main/main.c @@ -0,0 +1,40 @@ +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/timers.h" + +static const char *TAG = "main"; + +// 定时器回调 +void TimerCallback_1(TimerHandle_t xTimer) +{ + // 取到定时器的名字 + const char *timerName = pcTimerGetName(xTimer); + // 取得定时器的ID + void *timerID = pvTimerGetTimerID(xTimer); + ESP_LOGI(TAG, "定时器名称:%s,定时器id:%d,定时器回调函数执行", timerName, (int)timerID); +} + +void app_main(void) +{ + // 创建定时器句柄 + TimerHandle_t xTimer_1; + TimerHandle_t xTimer_2; + xTimer_1 = xTimerCreate("timer1", pdMS_TO_TICKS(1000), pdTRUE, (void *)0, TimerCallback_1); + xTimer_2 = xTimerCreate("timer2", pdMS_TO_TICKS(2000), pdTRUE, (void *)1, TimerCallback_1); + + xTimerStart(xTimer_1, 0); // 启动定时器 + xTimerStart(xTimer_2, 0); // 启动定时器 + + vTaskDelay(pdMS_TO_TICKS(5000)); + //停止定时器 + xTimerStop(xTimer_1, 0); + xTimerStop(xTimer_2, 0); +} + + +// 其他常用函数 +// xTimerChangePeriod():修改定时器周期 +// xTimerReset():重置定时器 +// xTimerDelete():删除定时器 diff --git a/code/03.freertos_basic/timer/sdkconfig.defaults b/code/03.freertos_basic/timer/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/03.freertos_basic/timer/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/03.freertos_basic/watchdog/readme.md b/code/03.freertos_basic/watchdog/readme.md new file mode 100644 index 0000000..e69de29 diff --git a/code/04.peripheral/basics/adc_continuous/.gitignore b/code/04.peripheral/basics/adc_continuous/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/basics/adc_continuous/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/basics/adc_continuous/CMakeLists.txt b/code/04.peripheral/basics/adc_continuous/CMakeLists.txt new file mode 100644 index 0000000..57308d1 --- /dev/null +++ b/code/04.peripheral/basics/adc_continuous/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(adc_continuous) diff --git a/code/04.peripheral/basics/adc_continuous/main/CMakeLists.txt b/code/04.peripheral/basics/adc_continuous/main/CMakeLists.txt new file mode 100644 index 0000000..f63caba --- /dev/null +++ b/code/04.peripheral/basics/adc_continuous/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "adc_continuous.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/basics/adc_continuous/main/adc_continuous.c b/code/04.peripheral/basics/adc_continuous/main/adc_continuous.c new file mode 100644 index 0000000..99fc21f --- /dev/null +++ b/code/04.peripheral/basics/adc_continuous/main/adc_continuous.c @@ -0,0 +1,165 @@ +#include +#include +#include "sdkconfig.h" +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "esp_adc/adc_continuous.h" + +#define _EXAMPLE_ADC_UNIT_STR(unit) #unit +// C预处理器的字符串化操作符 #,它可以将宏参数转换为字符串常量。如果传递 ADC_UNIT 给 _EXAMPLE_ADC_UNIT_STR,它会生成字符串 "ADC_UNIT"。 +#define EXAMPLE_ADC_UNIT_STR(unit) _EXAMPLE_ADC_UNIT_STR(unit) +// 宏嵌套 + +// 用于从 adc_digi_output_data_t 结构体中提取通道号和数据值。 +#define EXAMPLE_ADC_GET_CHANNEL(p_data) ((p_data)->type1.channel) +#define EXAMPLE_ADC_GET_DATA(p_data) ((p_data)->type1.data) + + +#define ADC_UNIT ADC_UNIT_1 + + +// ADC通道 +//static adc_channel_t channel[2] = {ADC_CHANNEL_6, ADC_CHANNEL_7}; +static adc_channel_t channel[1] = {ADC_CHANNEL_6}; + + +static TaskHandle_t s_task_handle; +static const char *TAG = "ADC_CONTINUOUS"; + +// ADC连续模式的事件回调(一个转换帧完成时) +static bool IRAM_ATTR s_conv_done_cb(adc_continuous_handle_t handle, const adc_continuous_evt_data_t *edata, void *user_data) +{ + BaseType_t mustYield = pdFALSE; + //Notify that ADC continuous driver has done enough number of conversions + //vTaskNotifyGiveFromISR 是 FreeRTOS 提供的一个函数,它允许从中断服务例程(ISR)安全地向任务发送通知 + vTaskNotifyGiveFromISR(s_task_handle, &mustYield); + + return (mustYield == pdTRUE); +} + +// adc初始化 +static void continuous_adc_init(adc_channel_t *channel, uint8_t channel_num, adc_continuous_handle_t *out_handle) +{ + // 创建一个ADC连续模式的句柄 + adc_continuous_handle_t handle = NULL; + + // 配置ADC连续模式的参数 + adc_continuous_handle_cfg_t adc_config = { + .max_store_buf_size = 1024, // 最大存储缓冲区大小 + .conv_frame_size = 256, // 转换帧大小 + }; + ESP_ERROR_CHECK(adc_continuous_new_handle(&adc_config, &handle)); + + // ADC IO + adc_continuous_config_t dig_cfg = { + .sample_freq_hz = 20 * 1000, // 采样频率 + .conv_mode = ADC_CONV_SINGLE_UNIT_1, // 转换模式 + .format = ADC_DIGI_OUTPUT_FORMAT_TYPE1, // 输出格式 + }; + + adc_digi_pattern_config_t adc_pattern[SOC_ADC_PATT_LEN_MAX] = {0}; + dig_cfg.pattern_num = channel_num; // 通道数量 + for (int i = 0; i < channel_num; i++) { + adc_pattern[i].atten = ADC_ATTEN_DB_11; // ADC 衰减 + adc_pattern[i].channel = channel[i] & 0x7; // 通道 + adc_pattern[i].unit = ADC_UNIT; // ADC单元 + adc_pattern[i].bit_width = SOC_ADC_DIGI_MAX_BITWIDTH; // 位宽 + + // 打印配置信息 + // - PRIx8 是一个预处理宏,定义在 C 语言的标准库头文件 中。它用于以可移植的方式格式化输出 uint8_t 类型的数据为十六进制形式。 + ESP_LOGI(TAG, "adc_pattern[%d].atten is :%"PRIx8, i, adc_pattern[i].atten); + ESP_LOGI(TAG, "adc_pattern[%d].channel is :%"PRIx8, i, adc_pattern[i].channel); + ESP_LOGI(TAG, "adc_pattern[%d].unit is :%"PRIx8, i, adc_pattern[i].unit); + } + + // 要使用的 ADC 通道的配置列表 + dig_cfg.adc_pattern = adc_pattern; + ESP_ERROR_CHECK(adc_continuous_config(handle, &dig_cfg)); + + *out_handle = handle; +} + +void app_main(void) +{ + esp_err_t ret; // 返回状态 + uint32_t ret_num = 0; // 转换完成的数据数量 + // 定义接收数组 + uint8_t result[256] = {0}; + // 初始化数组,填充为0xcc + memset(result, 0xcc, 256); + + //获取app_mian任务的句柄。 + s_task_handle = xTaskGetCurrentTaskHandle(); + + // 初始化ADC + adc_continuous_handle_t handle = NULL; + continuous_adc_init(channel, sizeof(channel) / sizeof(adc_channel_t), &handle); + + // 事件回调 + adc_continuous_evt_cbs_t cbs = { + // 当一个转换帧完成时,触发此事件:s_conv_done_cb + .on_conv_done = s_conv_done_cb, + }; + + // 注册事件回调 + ESP_ERROR_CHECK(adc_continuous_register_event_callbacks(handle, &cbs, NULL)); + // 启动ADC连续模式 + ESP_ERROR_CHECK(adc_continuous_start(handle)); + + while (1) { + + /** + * This is to show you the way to use the ADC continuous mode driver event callback. + * This `ulTaskNotifyTake` will block when the data processing in the task is fast. + * However in this example, the data processing (print) is slow, so you barely block here. + * + * Without using this event callback (to notify this task), you can still just call + * `adc_continuous_read()` here in a loop, with/without a certain block timeout. + */ + // ulTaskNotifyTake() 等待通知 + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + + // 生成字符串 + char unit[] = EXAMPLE_ADC_UNIT_STR(ADC_UNIT); + + while (1) { + // 读取ADC数据 + ret = adc_continuous_read(handle, result, 256, &ret_num, 0); + // 读取成功 + if (ret == ESP_OK) { + // 显示读取操作的返回状态和实际读取到的数据字节数 + ESP_LOGI("TASK", "ret is %x, ret_num is %"PRIu32" bytes", ret, ret_num); + // 循环遍历读取到的数据,解析每个ADC数据项,并打印出来 + // - 循环以 SOC_ADC_DIGI_RESULT_BYTES 为步长迭代,这个常量定义了每个ADC数据项的字节大小。 + // - adc_digi_output_data_t 是一个结构体类型,用于解析ADC数据项。 + // - EXAMPLE_ADC_GET_CHANNEL(p) 和 EXAMPLE_ADC_GET_DATA(p) 是宏,用于从 adc_digi_output_data_t 结构体中提取通道号和数据值。 + for (int i = 0; i < ret_num; i += SOC_ADC_DIGI_RESULT_BYTES) { + adc_digi_output_data_t *p = (adc_digi_output_data_t*)&result[i]; + uint32_t chan_num = EXAMPLE_ADC_GET_CHANNEL(p); + uint32_t data = EXAMPLE_ADC_GET_DATA(p); + /*检查通道编号验证,如果通道编号超过最大通道,则数据无效 */ + // - PRIu32 是 C 语言标准库中的宏,它用于以可移植的方式格式化输出 uint32_t 类型的数据。 + if (chan_num < SOC_ADC_CHANNEL_NUM(ADC_UNIT)) { + ESP_LOGI(TAG, "Unit: %s, Channel: %"PRIu32", Value: %"PRIu32, unit, chan_num, data); + } else { + ESP_LOGW(TAG, "Invalid data [%s_%"PRIu32"_%"PRIu32"]", unit, chan_num, data); + } + } + /** + * Because printing is slow, so every time you call `ulTaskNotifyTake`, it will immediately return. + * To avoid a task watchdog timeout, add a delay here. When you replace the way you process the data, + * usually you don't need this delay (as this task will block for a while). + */ + vTaskDelay(1); + } else if (ret == ESP_ERR_TIMEOUT) { + //We try to read `EXAMPLE_READ_LEN` until API returns timeout, which means there's no available data + break; + } + } + } + // 停止ADC连续模式 + ESP_ERROR_CHECK(adc_continuous_stop(handle)); + ESP_ERROR_CHECK(adc_continuous_deinit(handle)); +} diff --git a/code/04.peripheral/basics/adc_oneshot/.gitignore b/code/04.peripheral/basics/adc_oneshot/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/basics/adc_oneshot/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/basics/adc_oneshot/CMakeLists.txt b/code/04.peripheral/basics/adc_oneshot/CMakeLists.txt new file mode 100644 index 0000000..4d51d49 --- /dev/null +++ b/code/04.peripheral/basics/adc_oneshot/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(adc_oneshot) diff --git a/code/04.peripheral/basics/adc_oneshot/main/CMakeLists.txt b/code/04.peripheral/basics/adc_oneshot/main/CMakeLists.txt new file mode 100644 index 0000000..ac4e3a9 --- /dev/null +++ b/code/04.peripheral/basics/adc_oneshot/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "adc_oneshot.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/basics/adc_oneshot/main/adc_oneshot.c b/code/04.peripheral/basics/adc_oneshot/main/adc_oneshot.c new file mode 100644 index 0000000..037ff1f --- /dev/null +++ b/code/04.peripheral/basics/adc_oneshot/main/adc_oneshot.c @@ -0,0 +1,46 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "esp_log.h" +#include "esp_adc/adc_oneshot.h" + +#define EXAMPLE_ADC1_CHAN0 ADC_CHANNEL_6 // 根据您的硬件配置选择合适的通道 +#define EXAMPLE_ADC1_CHAN1 ADC_CHANNEL_7 // 根据您的硬件配置选择合适的通道 + +static const char* TAG = "ADC_ONESHOT_EXAMPLE"; + +void app_main(void) +{ + adc_oneshot_unit_handle_t adc1_handle; + adc_oneshot_unit_init_cfg_t init_config1 = { + .unit_id = ADC_UNIT_1, + .ulp_mode = ADC_ULP_MODE_DISABLE, + }; + ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_config1, &adc1_handle)); + + adc_oneshot_chan_cfg_t config = { + .bitwidth = ADC_BITWIDTH_DEFAULT, + .atten = ADC_ATTEN_DB_11, // 设置适当的衰减以匹配您的输入电压范围 + }; + + // 配置两个通道 + ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, EXAMPLE_ADC1_CHAN0, &config)); + ESP_ERROR_CHECK(adc_oneshot_config_channel(adc1_handle, EXAMPLE_ADC1_CHAN1, &config)); + + int adc_raw[2]; + + // 对每个通道进行单次转换并读取结果 + for (int i = 0; i < 10; i++) { + ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, EXAMPLE_ADC1_CHAN0, &adc_raw[0])); + ESP_LOGI(TAG, "ADC1 Channel[%d] Raw Data: %d", EXAMPLE_ADC1_CHAN0, adc_raw[0]); + + ESP_ERROR_CHECK(adc_oneshot_read(adc1_handle, EXAMPLE_ADC1_CHAN1, &adc_raw[1])); + ESP_LOGI(TAG, "ADC1 Channel[%d] Raw Data: %d", EXAMPLE_ADC1_CHAN1, adc_raw[1]); + + vTaskDelay(pdMS_TO_TICKS(1000)); // 等待1秒再次读取 + } + + // 回收资源 + ESP_ERROR_CHECK(adc_oneshot_del_unit(adc1_handle)); +} diff --git a/code/04.peripheral/basics/dac_cosine/.gitignore b/code/04.peripheral/basics/dac_cosine/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/basics/dac_cosine/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/basics/dac_cosine/CMakeLists.txt b/code/04.peripheral/basics/dac_cosine/CMakeLists.txt new file mode 100644 index 0000000..b2c0ac7 --- /dev/null +++ b/code/04.peripheral/basics/dac_cosine/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(dac_cosine) diff --git a/code/04.peripheral/basics/dac_cosine/main/CMakeLists.txt b/code/04.peripheral/basics/dac_cosine/main/CMakeLists.txt new file mode 100644 index 0000000..7d58b2c --- /dev/null +++ b/code/04.peripheral/basics/dac_cosine/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "dac_cosine.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/basics/dac_cosine/main/dac_cosine.c b/code/04.peripheral/basics/dac_cosine/main/dac_cosine.c new file mode 100644 index 0000000..7d19237 --- /dev/null +++ b/code/04.peripheral/basics/dac_cosine/main/dac_cosine.c @@ -0,0 +1,36 @@ +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/dac_cosine.h" + + +void app_main(void) +{ + dac_cosine_handle_t chan0_handle; + dac_cosine_handle_t chan1_handle; + /* Normally two channels can only be configured to one frequency + * But we can set force_set_freq bit to force update the frequency + * The example here will produce cosine wave at 8 KHz on both channels */ + dac_cosine_config_t cos0_cfg = { + .chan_id = DAC_CHAN_0, + .freq_hz = 1000, // It will be covered by 8000 in the latter configuration + .clk_src = DAC_COSINE_CLK_SRC_DEFAULT, + .offset = 0, + .phase = DAC_COSINE_PHASE_0, + .atten = DAC_COSINE_ATTEN_DEFAULT, + .flags.force_set_freq = false, + }; + dac_cosine_config_t cos1_cfg = { + .chan_id = DAC_CHAN_1, + .freq_hz = 8000, + .clk_src = DAC_COSINE_CLK_SRC_DEFAULT, + .offset = 0, + .phase = DAC_COSINE_PHASE_180, + .atten = DAC_COSINE_ATTEN_DB_6, + .flags.force_set_freq = true, // set true will allow to overwrite the frequency that set before + }; + ESP_ERROR_CHECK(dac_cosine_new_channel(&cos0_cfg, &chan0_handle)); + ESP_ERROR_CHECK(dac_cosine_new_channel(&cos1_cfg, &chan1_handle)); + ESP_ERROR_CHECK(dac_cosine_start(chan0_handle)); + ESP_ERROR_CHECK(dac_cosine_start(chan1_handle)); + +} diff --git a/code/04.peripheral/basics/dac_oneshot/.gitignore b/code/04.peripheral/basics/dac_oneshot/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/basics/dac_oneshot/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/basics/dac_oneshot/CMakeLists.txt b/code/04.peripheral/basics/dac_oneshot/CMakeLists.txt new file mode 100644 index 0000000..ef439e5 --- /dev/null +++ b/code/04.peripheral/basics/dac_oneshot/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(dac_oneshot) diff --git a/code/04.peripheral/basics/dac_oneshot/main/CMakeLists.txt b/code/04.peripheral/basics/dac_oneshot/main/CMakeLists.txt new file mode 100644 index 0000000..19bee95 --- /dev/null +++ b/code/04.peripheral/basics/dac_oneshot/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "dac_oneshot.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/basics/dac_oneshot/main/dac_oneshot.c b/code/04.peripheral/basics/dac_oneshot/main/dac_oneshot.c new file mode 100644 index 0000000..2cde727 --- /dev/null +++ b/code/04.peripheral/basics/dac_oneshot/main/dac_oneshot.c @@ -0,0 +1,39 @@ +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/dac_oneshot.h" +//#include "esp_check.h" + +static void dac_output_task(void *args) +{ + dac_oneshot_handle_t handle = (dac_oneshot_handle_t)args; + uint32_t val = 0; + while (1) { + /* Set the voltage every 100 ms */ + ESP_ERROR_CHECK(dac_oneshot_output_voltage(handle, val)); + val += 10; + val %= 250; + vTaskDelay(pdMS_TO_TICKS(500)); + } +} + +void app_main(void) +{ + /* DAC oneshot init */ + dac_oneshot_handle_t chan0_handle; + dac_oneshot_config_t chan0_cfg = { + .chan_id = DAC_CHAN_0, + }; + ESP_ERROR_CHECK(dac_oneshot_new_channel(&chan0_cfg, &chan0_handle)); + + dac_oneshot_handle_t chan1_handle; + dac_oneshot_config_t chan1_cfg = { + .chan_id = DAC_CHAN_1, + }; + ESP_ERROR_CHECK(dac_oneshot_new_channel(&chan1_cfg, &chan1_handle)); + + /* DAC oneshot outputting threads */ + xTaskCreate(dac_output_task, "dac_chan0_output_task", 4096, chan0_handle, 5, NULL); + vTaskDelay(pdMS_TO_TICKS(500)); // To differential the output of two channels + xTaskCreate(dac_output_task, "dac_chan1_output_task", 4096, chan1_handle, 5, NULL); + +} diff --git a/code/04.peripheral/basics/gpio/.gitignore b/code/04.peripheral/basics/gpio/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/basics/gpio/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/basics/gpio/CMakeLists.txt b/code/04.peripheral/basics/gpio/CMakeLists.txt new file mode 100644 index 0000000..b89bdad --- /dev/null +++ b/code/04.peripheral/basics/gpio/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(gpio) diff --git a/code/04.peripheral/basics/gpio/main/CMakeLists.txt b/code/04.peripheral/basics/gpio/main/CMakeLists.txt new file mode 100644 index 0000000..19bb736 --- /dev/null +++ b/code/04.peripheral/basics/gpio/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "gpio.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/basics/gpio/main/gpio.c b/code/04.peripheral/basics/gpio/main/gpio.c new file mode 100644 index 0000000..93e124f --- /dev/null +++ b/code/04.peripheral/basics/gpio/main/gpio.c @@ -0,0 +1,31 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" + +#define LED_GPIO GPIO_NUM_2 +#define BUTTON_GPIO GPIO_NUM_0 + +void app_main(void) +{ + // 初始化LED GPIO为输出模式 + gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT); + + // 初始化按钮GPIO为输入模式 + gpio_set_direction(BUTTON_GPIO, GPIO_MODE_INPUT); + gpio_set_pull_mode(BUTTON_GPIO, GPIO_PULLUP_ONLY); + + while (1) { + // 读取按钮状态 + int button_state = gpio_get_level(BUTTON_GPIO); + + // 如果按钮被按下(逻辑低电平),点亮LED + if(button_state == 0) { + gpio_set_level(LED_GPIO, 1); + } else { + gpio_set_level(LED_GPIO, 0); + } + + vTaskDelay(10 / portTICK_PERIOD_MS); + } +} diff --git a/code/04.peripheral/basics/gpio_exit/.gitignore b/code/04.peripheral/basics/gpio_exit/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/basics/gpio_exit/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/basics/gpio_exit/CMakeLists.txt b/code/04.peripheral/basics/gpio_exit/CMakeLists.txt new file mode 100644 index 0000000..308bddc --- /dev/null +++ b/code/04.peripheral/basics/gpio_exit/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(gpio_exit) diff --git a/code/04.peripheral/basics/gpio_exit/main/CMakeLists.txt b/code/04.peripheral/basics/gpio_exit/main/CMakeLists.txt new file mode 100644 index 0000000..e5e4443 --- /dev/null +++ b/code/04.peripheral/basics/gpio_exit/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "gpio_exit.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/basics/gpio_exit/main/gpio_exit.c b/code/04.peripheral/basics/gpio_exit/main/gpio_exit.c new file mode 100644 index 0000000..160f19c --- /dev/null +++ b/code/04.peripheral/basics/gpio_exit/main/gpio_exit.c @@ -0,0 +1,34 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" + +#define LED_GPIO GPIO_NUM_2 +#define BUTTON_GPIO GPIO_NUM_0 + +// 声明一个用于处理GPIO中断的函数 +static void IRAM_ATTR gpio_isr_handler(void* arg) { + // 读取按钮状态并设置LED + int button_state = gpio_get_level(BUTTON_GPIO); + gpio_set_level(LED_GPIO, button_state == 0 ? 1 : 0); +} + +void app_main(void) { + // 初始化LED GPIO为输出模式 + gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT); + + // 初始化按钮GPIO为输入模式,并设置为上拉 + gpio_set_direction(BUTTON_GPIO, GPIO_MODE_INPUT); + gpio_set_pull_mode(BUTTON_GPIO, GPIO_PULLUP_ONLY); + + // 安装GPIO服务 + gpio_install_isr_service(0); + // 配置GPIO中断类型,并注册中断服务函数 + gpio_set_intr_type(BUTTON_GPIO, GPIO_INTR_ANYEDGE); + gpio_isr_handler_add(BUTTON_GPIO, gpio_isr_handler, NULL); + + while (1) { + // 在中断模式下,主循环可以执行其他任务或进入睡眠状态 + vTaskDelay(portMAX_DELAY); // 使用portMAX_DELAY使任务永久挂起,直到中断唤醒 + } +} diff --git a/code/04.peripheral/basics/gptimer/.gitignore b/code/04.peripheral/basics/gptimer/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/basics/gptimer/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/basics/gptimer/CMakeLists.txt b/code/04.peripheral/basics/gptimer/CMakeLists.txt new file mode 100644 index 0000000..a54b7b7 --- /dev/null +++ b/code/04.peripheral/basics/gptimer/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(gptimer) diff --git a/code/04.peripheral/basics/gptimer/main/CMakeLists.txt b/code/04.peripheral/basics/gptimer/main/CMakeLists.txt new file mode 100644 index 0000000..063c585 --- /dev/null +++ b/code/04.peripheral/basics/gptimer/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "gptimer.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/basics/gptimer/main/gptimer.c b/code/04.peripheral/basics/gptimer/main/gptimer.c new file mode 100644 index 0000000..020ae7a --- /dev/null +++ b/code/04.peripheral/basics/gptimer/main/gptimer.c @@ -0,0 +1,196 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "driver/gptimer.h" +#include "esp_log.h" + +static const char *TAG = "gptimer"; + +typedef struct { + uint64_t event_count; +} example_queue_element_t; + +// 定时器警报事件的回调函数(案例1) +// 三个参数:定时器句柄 timer、事件数据指针 edata 和用户数据指针 user_data。 +static bool IRAM_ATTR example_timer_on_alarm_cb_v1(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) +{ + BaseType_t high_task_awoken = pdFALSE; + QueueHandle_t queue = (QueueHandle_t)user_data; + // 立即停止计时器 + gptimer_stop(timer); + // 从事件数据中获取计数值,并将其存储在 example_queue_element_t 结构体变量 ele 的 event_count 字段中。 + example_queue_element_t ele = { + .event_count = edata->count_value + }; + //使用 xQueueSendFromISR() 函数将 ele 变量发送到队列中 + xQueueSendFromISR(queue, &ele, &high_task_awoken); + // return whether we need to yield at the end of ISR + return (high_task_awoken == pdTRUE); +} + +// 定时器警报事件的回调函数(案例2) +static bool IRAM_ATTR example_timer_on_alarm_cb_v2(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) +{ + BaseType_t high_task_awoken = pdFALSE; + QueueHandle_t queue = (QueueHandle_t)user_data; + // Retrieve count value and send to queue + example_queue_element_t ele = { + .event_count = edata->count_value + }; + xQueueSendFromISR(queue, &ele, &high_task_awoken); + // return whether we need to yield at the end of ISR + return (high_task_awoken == pdTRUE); +} + +// 定时器警报事件的回调函数(案例3:动态更新报警值) +static bool IRAM_ATTR example_timer_on_alarm_cb_v3(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data) +{ + BaseType_t high_task_awoken = pdFALSE; + QueueHandle_t queue = (QueueHandle_t)user_data; + // Retrieve count value and send to queue + example_queue_element_t ele = { + .event_count = edata->count_value + }; + xQueueSendFromISR(queue, &ele, &high_task_awoken); + // reconfigure alarm value + gptimer_alarm_config_t alarm_config = { + .alarm_count = edata->alarm_value + 1000000, // alarm in next 1s + }; + gptimer_set_alarm_action(timer, &alarm_config); + // return whether we need to yield at the end of ISR + return (high_task_awoken == pdTRUE); +} + +void app_main(void) +{ + // 定义一个 example_queue_element_t 类型的变量 ele + example_queue_element_t ele; + //创建了一个长度为 10,每个元素大小为 example_queue_element_t 类型的队列,并将其赋值给 queue 变量。 + QueueHandle_t queue = xQueueCreate(10, sizeof(example_queue_element_t)); + if (!queue) { + ESP_LOGE(TAG, "创建队列失败"); + return; + } + + // 初始化定时器 + ESP_LOGW(TAG, "创建分辨率为 1 MHz 的通用定时器句柄"); + gptimer_handle_t gptimer = NULL; + gptimer_config_t timer_config = { + .clk_src = GPTIMER_CLK_SRC_DEFAULT, + .direction = GPTIMER_COUNT_UP, + .resolution_hz = 1000000, // 1MHz, 1 tick=1us + }; + ESP_ERROR_CHECK(gptimer_new_timer(&timer_config, &gptimer)); + + // 注册定时器事件回调函数(警报事件的回调函数) + gptimer_event_callbacks_t cbs = { + .on_alarm = example_timer_on_alarm_cb_v1, + }; + ESP_ERROR_CHECK(gptimer_register_event_callbacks(gptimer, &cbs, queue)); + + // 使能定时器 + ESP_LOGI(TAG, "Enable timer"); + ESP_ERROR_CHECK(gptimer_enable(gptimer)); + + // 设置定时器的周期为 1s(触发警报事件的目标计数值) + ESP_LOGI(TAG, "Start timer, stop it at alarm event"); + gptimer_alarm_config_t alarm_config1 = { + .alarm_count = 1000000, // period = 1s + }; + // 设置定时器的报警事件 + ESP_ERROR_CHECK(gptimer_set_alarm_action(gptimer, &alarm_config1)); + // 启动定时器 + ESP_ERROR_CHECK(gptimer_start(gptimer)); + + // 等待定时器报警事件(从队列中接收数据,接收到的数据将会存储在 &ele 中) + if (xQueueReceive(queue, &ele, pdMS_TO_TICKS(2000))) { + ESP_LOGI(TAG, "Timer stopped, count=%llu", ele.event_count); + } else { + ESP_LOGW(TAG, "Missed one count event"); + } + + // 设置定时器的计数值(异步更新) + ESP_LOGI(TAG, "Set count value"); + ESP_ERROR_CHECK(gptimer_set_raw_count(gptimer, 100)); + ESP_LOGI(TAG, "Get count value"); + + // 获取定时器的计数值 + uint64_t count; + ESP_ERROR_CHECK(gptimer_get_raw_count(gptimer, &count)); + ESP_LOGI(TAG, "Timer count value=%llu", count); + + //--------------------------------------------------------------------// + ESP_LOGW(TAG, "案例1结束,案例2开始"); + //--------------------------------------------------------------------// + + // 在更新报警回调之前,我们应该确保计时器没有处于启用状态 + ESP_LOGI(TAG, "Disable timer"); + ESP_ERROR_CHECK(gptimer_disable(gptimer)); + // 设置一个新的回调函数 + cbs.on_alarm = example_timer_on_alarm_cb_v2; + ESP_ERROR_CHECK(gptimer_register_event_callbacks(gptimer, &cbs, queue)); + ESP_LOGI(TAG, "Enable timer"); + ESP_ERROR_CHECK(gptimer_enable(gptimer)); + + // 重新设置报警条件 + ESP_LOGI(TAG, "Start timer, auto-reload at alarm event"); + gptimer_alarm_config_t alarm_config2 = { + .reload_count = 0, + .alarm_count = 1000000, // period = 1s + .flags.auto_reload_on_alarm = true, //报警事件发生后立即通过硬件重新加载计数值 + }; + // 设置定时器的报警事件 + ESP_ERROR_CHECK(gptimer_set_alarm_action(gptimer, &alarm_config2)); + ESP_ERROR_CHECK(gptimer_start(gptimer)); + + // 循环次数为4次。在每次循环中,通过 xQueueReceive() 函数从队列中接收数据,并等待最多2秒。如果成功接收到数据,则打印定时器重新加载的消息 + int record = 4; + while (record) { + if (xQueueReceive(queue, &ele, pdMS_TO_TICKS(2000))) { + ESP_LOGI(TAG, "Timer reloaded, count=%llu", ele.event_count); + record--; + } else { + ESP_LOGW(TAG, "Missed one count event"); + } + } + ESP_LOGI(TAG, "Stop timer"); + ESP_ERROR_CHECK(gptimer_stop(gptimer)); + + ESP_LOGI(TAG, "Disable timer"); + ESP_ERROR_CHECK(gptimer_disable(gptimer)); + + //--------------------------------------------------------------------// + ESP_LOGW(TAG, "案例2结束,案例3开始"); + //--------------------------------------------------------------------// + // 案例3动态更新报警值 + cbs.on_alarm = example_timer_on_alarm_cb_v3; + ESP_ERROR_CHECK(gptimer_register_event_callbacks(gptimer, &cbs, queue)); + ESP_LOGI(TAG, "Enable timer"); + ESP_ERROR_CHECK(gptimer_enable(gptimer)); + + ESP_LOGI(TAG, "Start timer, update alarm value dynamically"); + gptimer_alarm_config_t alarm_config3 = { + .alarm_count = 1000000, // period = 1s + }; + ESP_ERROR_CHECK(gptimer_set_alarm_action(gptimer, &alarm_config3)); + ESP_ERROR_CHECK(gptimer_start(gptimer)); + record = 4; + while (record) { + if (xQueueReceive(queue, &ele, pdMS_TO_TICKS(2000))) { + ESP_LOGI(TAG, "Timer alarmed, count=%llu", ele.event_count); + record--; + } else { + ESP_LOGW(TAG, "Missed one count event"); + } + } + + ESP_LOGI(TAG, "Stop timer"); + ESP_ERROR_CHECK(gptimer_stop(gptimer)); + ESP_LOGI(TAG, "Disable timer"); + ESP_ERROR_CHECK(gptimer_disable(gptimer)); + ESP_LOGI(TAG, "Delete timer"); + ESP_ERROR_CHECK(gptimer_del_timer(gptimer)); + + vQueueDelete(queue); +} diff --git a/code/04.peripheral/basics/i2c_bh1750/.gitignore b/code/04.peripheral/basics/i2c_bh1750/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/basics/i2c_bh1750/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/basics/i2c_bh1750/CMakeLists.txt b/code/04.peripheral/basics/i2c_bh1750/CMakeLists.txt new file mode 100644 index 0000000..4a255a2 --- /dev/null +++ b/code/04.peripheral/basics/i2c_bh1750/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(i2c_bh1750) diff --git a/code/04.peripheral/basics/i2c_bh1750/main/CMakeLists.txt b/code/04.peripheral/basics/i2c_bh1750/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/04.peripheral/basics/i2c_bh1750/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/basics/i2c_bh1750/main/main.c b/code/04.peripheral/basics/i2c_bh1750/main/main.c new file mode 100644 index 0000000..26bf460 --- /dev/null +++ b/code/04.peripheral/basics/i2c_bh1750/main/main.c @@ -0,0 +1,127 @@ + +#include +#include "esp_log.h" +#include "driver/i2c.h" +#include "sdkconfig.h" + +static const char *TAG = "main"; + + +// I2C Master 配置 +#define I2C_MASTER_SCL_IO 19 /*!< gpio number for I2C master clock */ +#define I2C_MASTER_SDA_IO 18 /*!< gpio number for I2C master data */ +#define I2C_MASTER_NUM I2C_NUM_0 /*!< I2C port number for master dev */ +#define I2C_MASTER_FREQ_HZ 100000 /*!< I2C master clock frequency */ +#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */ +#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */ + +// BH1750 Sensor 配置 +#define BH1750_SENSOR_ADDR 0x23 //0010_0011 // 传感器地址 +#define BH1750_CMD_START 0x23 //0010_0011 // 传感器模式:单次采集模式 +#define WRITE_BIT I2C_MASTER_WRITE // I2C 读取位 :1 +#define READ_BIT I2C_MASTER_READ // I2C 写入位 :0 +#define ACK_CHECK_EN 0x1 // 检测从机应答 +#define ACK_CHECK_DIS 0x0 // 不检测从机应答 +#define ACK_VAL 0x0 // 响应值 +#define NACK_VAL 0x1 // 无响应值 + + + +/** + * @brief test code to operate on BH1750 sensor + * + * 1. set operation mode(e.g One time L-resolution mode) + * _________________________________________________________________ + * | start | slave_addr + wr_bit + ack | write 1 byte + ack | stop | + * --------|---------------------------|---------------------|------| + * 2. wait more than 24 ms + * 3. read data + * ______________________________________________________________________________________ + * | start | slave_addr + rd_bit + ack | read 1 byte + ack | read 1 byte + nack | stop | + * --------|---------------------------|--------------------|--------------------|------| + */ +static esp_err_t i2c_master_sensor_test(i2c_port_t i2c_num, uint8_t *data_h, uint8_t *data_l) +{ + int ret; + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 创建I2C命令 + i2c_master_start(cmd); // 起始信号 + i2c_master_write_byte(cmd, BH1750_SENSOR_ADDR << 1 | WRITE_BIT, ACK_CHECK_EN); //从机地址及读写位 + i2c_master_write_byte(cmd, BH1750_CMD_START, ACK_CHECK_EN); //数据位(数组) + i2c_master_stop(cmd); //终止信号 + ret = i2c_master_cmd_begin(i2c_num, cmd, 1000 / portTICK_PERIOD_MS); //i2c_num 发送这个数据帧,timeout设置为1000毫秒 + i2c_cmd_link_delete(cmd); //删除i2c_cmd_handle_t对象,释放资源 + if (ret != ESP_OK) { + return ret; + } + vTaskDelay(30 / portTICK_PERIOD_MS); + cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, BH1750_SENSOR_ADDR << 1 | READ_BIT, ACK_CHECK_EN); //从机地址及读写位 + i2c_master_read_byte(cmd, data_h, ACK_VAL); //读取数据(高位) + i2c_master_read_byte(cmd, data_l, NACK_VAL); //读取数据(低位) + i2c_master_stop(cmd); + ret = i2c_master_cmd_begin(i2c_num, cmd, 1000 / portTICK_PERIOD_MS); + i2c_cmd_link_delete(cmd); + return ret; +} + +/** + * @brief I2C master initialization + */ +static esp_err_t i2c_master_init(void) +{ + // 配置I2C + int i2c_master_port = I2C_MASTER_NUM; + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + // .clk_flags = 0, /*!< Optional, you can use I2C_SCLK_SRC_FLAG_* flags to choose i2c source clock here. */ + }; + esp_err_t err = i2c_param_config(i2c_master_port, &conf); + if (err != ESP_OK) { + return err; + } + // 安装I2C驱动 + return i2c_driver_install(i2c_master_port, conf.mode, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); +} + + +static void i2c_task(void *arg) +{ + int ret; // Return value + int task_idx = (int)arg; + uint8_t sensor_data_h, sensor_data_l; + int cnt = 0; + + while (1) { + // 读取数据 + ESP_LOGI(TAG, "TASK[%d] test cnt: %d", task_idx, cnt++); + ret = i2c_master_sensor_test(I2C_MASTER_NUM, &sensor_data_h, &sensor_data_l); + if (ret == ESP_ERR_TIMEOUT) { + ESP_LOGE(TAG, "I2C Timeout"); + } else if (ret == ESP_OK) { + printf("*******************\n"); + printf("TASK[%d] MASTER READ SENSOR( BH1750 )\n", task_idx); + printf("*******************\n"); + printf("data_h: %02x\n", sensor_data_h); + printf("data_l: %02x\n", sensor_data_l); + printf("sensor val: %.02f [Lux]\n", (sensor_data_h << 8 | sensor_data_l) / 1.2); + } else { + ESP_LOGW(TAG, "%s: No ack, sensor not connected...skip...", esp_err_to_name(ret)); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + +} + +void app_main(void) +{ + // 初始化I2C + ESP_ERROR_CHECK(i2c_master_init()); + // 创建I2C采集任务 + xTaskCreate(i2c_task, "i2c_task", 1024 * 2, (void *)0, 10, NULL); +} diff --git a/code/04.peripheral/basics/i2c_tools/.gitignore b/code/04.peripheral/basics/i2c_tools/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/basics/i2c_tools/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/basics/i2c_tools/CMakeLists.txt b/code/04.peripheral/basics/i2c_tools/CMakeLists.txt new file mode 100644 index 0000000..e482e2a --- /dev/null +++ b/code/04.peripheral/basics/i2c_tools/CMakeLists.txt @@ -0,0 +1,8 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +set(EXTRA_COMPONENT_DIRS $ENV{IDF_PATH}/examples/system/console/advanced/components) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(i2c_tools) diff --git a/code/04.peripheral/basics/i2c_tools/README.md b/code/04.peripheral/basics/i2c_tools/README.md new file mode 100644 index 0000000..e40d4b0 --- /dev/null +++ b/code/04.peripheral/basics/i2c_tools/README.md @@ -0,0 +1,209 @@ +| Supported Targets | ESP32 | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-H2 | ESP32-S2 | ESP32-S3 | +| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- | + +# I2C Tools Example + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +## Overview + +[I2C Tools](https://i2c.wiki.kernel.org/index.php/I2C_Tools) is a simple but very useful tool for developing I2C related applications, which is also famous in Linux platform. This example just implements some of basic features of [I2C Tools](https://i2c.wiki.kernel.org/index.php/I2C_Tools) based on [esp32 console component](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/console.html). As follows, this example supports five command-line tools: + +1. `i2cconfig`: It will configure the I2C bus with specific GPIO number, port number and frequency. +2. `i2cdetect`: It will scan an I2C bus for devices and output a table with the list of detected devices on the bus. +3. `i2cget`: It will read registers visible through the I2C bus. +4. `i2cset`: It will set registers visible through the I2C bus. +5. `i2cdump`: It will examine registers visible through the I2C bus. + +If you have some trouble in developing I2C related applications, or just want to test some functions of one I2C device, you can play with this example first. + +## How to use example + +### Hardware Required + +To run this example, you should have any ESP32, ESP32-S and ESP32-C based development board. For test purpose, you should have a kind of device with I2C interface as well. Here we will take the CCS811 sensor as an example to show how to test the function of this sensor without writing any code (just use the command-line tools supported by this example). For more information about CCS811, you can consult the [online datasheet](http://ams.com/ccs811). + +#### Pin Assignment: + +**Note:** The following pin assignments are used by default, you can change them with `i2cconfig` command at any time. + +| | SDA | SCL | GND | Other | VCC | +| ------------------- | ------ | ------ | ---- | ----- | ---- | +| ESP32 I2C Master | GPIO18 | GPIO19 | GND | GND | 3.3V | +| ESP32-S2 I2C Master | GPIO18 | GPIO19 | GND | GND | 3.3V | +| ESP32-S3 I2C Master | GPIO1 | GPIO2 | GND | GND | 3.3V | +| ESP32-C3 I2C Master | GPIO5 | GPIO6 | GND | GND | 3.3V | +| ESP32-C2 I2C Master | GPIO5 | GPIO6 | GND | GND | 3.3V | +| ESP32-H2 I2C Master | GPIO1 | GPIO2 | GND | GND | 3.3V | +| Sensor | SDA | SCL | GND | WAK | VCC | + +**Note:** It is recommended to add external pull-up resistors for SDA/SCL pins to make the communication more stable, though the driver will enable internal pull-up resistors. + +### Configure the project + +Open the project configuration menu (`idf.py menuconfig`). Then go into `Example Configuration` menu. + +- You can choose whether or not to save command history into flash in `Store command history in flash` option. + +### Build and Flash + +Run `idf.py -p PORT flash monitor` to build and flash the project.. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +### Check all supported commands and their usages + +```bash + ============================================================== + | Steps to Use i2c-tools on ESP32 | + | | + | 1. Try 'help', check all supported commands | + | 2. Try 'i2cconfig' to configure your I2C bus | + | 3. Try 'i2cdetect' to scan devices on the bus | + | 4. Try 'i2cget' to get the content of specific register | + | 5. Try 'i2cset' to set the value of specific register | + | 6. Try 'i2cdump' to dump all the register (Experiment) | + | | + ============================================================== + +i2c-tools> help +help + Print the list of registered commands + +i2cconfig [--port=<0|1>] [--freq=] --sda= --scl= + Config I2C bus + --port=<0|1> Set the I2C bus port number + --freq= Set the frequency(Hz) of I2C bus + --sda= Set the gpio for I2C SDA + --scl= Set the gpio for I2C SCL + +i2cdetect + Scan I2C bus for devices + +i2cget -c [-r ] [-l ] + Read registers visible through the I2C bus + -c, --chip= Specify the address of the chip on that bus + -r, --register= Specify the address on that chip to read from + -l, --length= Specify the length to read from that data address + +i2cset -c [-r ] []... + Set registers visible through the I2C bus + -c, --chip= Specify the address of the chip on that bus + -r, --register= Specify the address on that chip to read from + Specify the data to write to that data address + +i2cdump -c [-s ] + Examine registers visible through the I2C bus + -c, --chip= Specify the address of the chip on that bus + -s, --size= Specify the size of each read + +free + Get the current size of free heap memory + +heap + Get minimum size of free heap memory that was available during program execu + tion + +version + Get version of chip and SDK + +restart + Software reset of the chip + +deep_sleep [-t ] [--io=] [--io_level=<0|1>] + Enter deep sleep mode. Two wakeup modes are supported: timer and GPIO. If no + wakeup option is specified, will sleep indefinitely. + -t, --time= Wake up time, ms + --io= If specified, wakeup using GPIO with given number + --io_level=<0|1> GPIO level to trigger wakeup + +light_sleep [-t ] [--io=]... [--io_level=<0|1>]... + Enter light sleep mode. Two wakeup modes are supported: timer and GPIO. Mult + iple GPIO pins can be specified using pairs of 'io' and 'io_level' arguments + . Will also wake up on UART input. + -t, --time= Wake up time, ms + --io= If specified, wakeup using GPIO with given number + --io_level=<0|1> GPIO level to trigger wakeup + +tasks + Get information about running tasks +``` + +### Configure the I2C bus + +```bash +esp32> i2cconfig --port=0 --sda=18 --scl=19 --freq=100000 +``` + +* `--port` option to specify the port of I2C, here we choose port 0 for test. +* `--sda` and `--scl` options to specify the gpio number used by I2C bus, here we choose GPIO18 as the SDA and GPIO19 as the SCL. +* `--freq` option to specify the frequency of I2C bus, here we set to 100KHz. + +### Check the I2C address (7 bits) on the I2C bus + +```bash +esp32> i2cdetect + 0 1 2 3 4 5 6 7 8 9 a b c d e f +00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +50: -- -- -- -- -- -- -- -- -- -- -- 5b -- -- -- -- +60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +70: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- +``` + +* Here we found the address of CCS811 is 0x5b. + +### Get the value of status register + +```bash +esp32> i2cget -c 0x5b -r 0x00 -l 1 +0x10 +``` + +* `-c` option to specify the address of I2C device (acquired from `i2cdetect` command). +* `-r` option to specify the register address you want to inspect. +* `-l` option to specify the length of the content. +* Here the returned value 0x10 means that the sensor is just in the boot mode and is ready to go into application mode. For more information about CCS811 you should consult the [official website](http://ams.com/ccs811). + +### Change the working mode + +```bash +esp32> i2cset -c 0x5b -r 0xF4 +I (734717) cmd_i2ctools: Write OK +esp32> i2cset -c 0x5b -r 0x01 0x10 +I (1072047) cmd_i2ctools: Write OK +esp32> i2cget -c 0x5b -r 0x00 -l 1 +0x98 +``` + +* Here we change the mode from boot to application and set a proper measure mode (by writing 0x10 to register 0x01) +* Now the status value of the sensor is 0x98, which means a valid data is ready to read + +### Read the sensor data + +```bash +esp32> i2cget -c 0x5b -r 0x02 -l 8 +0x01 0xb0 0x00 0x04 0x98 0x00 0x19 0x8f +``` + +* The register 0x02 will output 8 bytes result, mainly including value of eCO~2~、TVOC and there raw value. So the value of eCO~2~ is 0x01b0 ppm and value of TVOC is 0x04 ppb. + +## Troubleshooting + +* I don’t find any available address when running `i2cdetect` command. + * Make sure your wiring connection is right. + * Some sensor will have a “wake up” pin, via which user can put the sensor into a sleep mode. So make sure your sensor in **not** in the sleep state. + * Reset you I2C device, and then run `i2cdetect` again. +* I can’t get the right content when running `i2cdump` command. + * Currently the `i2cdump` only support those who have the same content length of registers inside the I2C device. For example, if a device have three register addresses, and the content length at these address are 1 byte, 2 bytes and 4 bytes. In this case you should not expect this command to dump the register correctly. + + +(For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you as soon as possible.) + diff --git a/code/04.peripheral/basics/i2c_tools/main/CMakeLists.txt b/code/04.peripheral/basics/i2c_tools/main/CMakeLists.txt new file mode 100644 index 0000000..60f0989 --- /dev/null +++ b/code/04.peripheral/basics/i2c_tools/main/CMakeLists.txt @@ -0,0 +1,3 @@ +idf_component_register(SRCS "i2ctools_example_main.c" + "cmd_i2ctools.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/basics/i2c_tools/main/Kconfig.projbuild b/code/04.peripheral/basics/i2c_tools/main/Kconfig.projbuild new file mode 100644 index 0000000..83d85ce --- /dev/null +++ b/code/04.peripheral/basics/i2c_tools/main/Kconfig.projbuild @@ -0,0 +1,10 @@ +menu "Example Configuration" + + config EXAMPLE_STORE_HISTORY + bool "Store command history in flash" + default y + help + Linenoise line editing library provides functions to save and load + command history. If this option is enabled, initalizes a FAT filesystem + and uses it to store command history. +endmenu diff --git a/code/04.peripheral/basics/i2c_tools/main/cmd_i2ctools.c b/code/04.peripheral/basics/i2c_tools/main/cmd_i2ctools.c new file mode 100644 index 0000000..844be5e --- /dev/null +++ b/code/04.peripheral/basics/i2c_tools/main/cmd_i2ctools.c @@ -0,0 +1,414 @@ +/* + * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ +/* cmd_i2ctools.c + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include "argtable3/argtable3.h" +#include "driver/i2c.h" +#include "esp_console.h" +#include "esp_log.h" + +#define I2C_MASTER_TX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */ +#define I2C_MASTER_RX_BUF_DISABLE 0 /*!< I2C master doesn't need buffer */ +#define WRITE_BIT I2C_MASTER_WRITE /*!< I2C master write */ +#define READ_BIT I2C_MASTER_READ /*!< I2C master read */ +#define ACK_CHECK_EN 0x1 /*!< I2C master will check ack from slave*/ +#define ACK_CHECK_DIS 0x0 /*!< I2C master will not check ack from slave */ +#define ACK_VAL 0x0 /*!< I2C ack value */ +#define NACK_VAL 0x1 /*!< I2C nack value */ + +static const char *TAG = "cmd_i2ctools"; + +#if CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32H2 +static gpio_num_t i2c_gpio_sda = 1; +static gpio_num_t i2c_gpio_scl = 2; +#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C2 +static gpio_num_t i2c_gpio_sda = 5; +static gpio_num_t i2c_gpio_scl = 6; +#else +static gpio_num_t i2c_gpio_sda = 8; + static gpio_num_t i2c_gpio_scl = 18; +#endif + +static uint32_t i2c_frequency = 100000; +static i2c_port_t i2c_port = I2C_NUM_0; + +static esp_err_t i2c_get_port(int port, i2c_port_t *i2c_port) +{ + if (port >= I2C_NUM_MAX) { + ESP_LOGE(TAG, "Wrong port number: %d", port); + return ESP_FAIL; + } + *i2c_port = port; + return ESP_OK; +} + +static esp_err_t i2c_master_driver_initialize(void) +{ + i2c_config_t conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = i2c_gpio_sda, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = i2c_gpio_scl, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = i2c_frequency, + // .clk_flags = 0, /*!< Optional, you can use I2C_SCLK_SRC_FLAG_* flags to choose i2c source clock here. */ + }; + return i2c_param_config(i2c_port, &conf); +} + +static struct { + struct arg_int *port; + struct arg_int *freq; + struct arg_int *sda; + struct arg_int *scl; + struct arg_end *end; +} i2cconfig_args; + +static int do_i2cconfig_cmd(int argc, char **argv) +{ + int nerrors = arg_parse(argc, argv, (void **)&i2cconfig_args); + if (nerrors != 0) { + arg_print_errors(stderr, i2cconfig_args.end, argv[0]); + return 0; + } + + /* Check "--port" option */ + if (i2cconfig_args.port->count) { + if (i2c_get_port(i2cconfig_args.port->ival[0], &i2c_port) != ESP_OK) { + return 1; + } + } + /* Check "--freq" option */ + if (i2cconfig_args.freq->count) { + i2c_frequency = i2cconfig_args.freq->ival[0]; + } + /* Check "--sda" option */ + i2c_gpio_sda = i2cconfig_args.sda->ival[0]; + /* Check "--scl" option */ + i2c_gpio_scl = i2cconfig_args.scl->ival[0]; + return 0; +} + +static void register_i2cconfig(void) +{ + i2cconfig_args.port = arg_int0(NULL, "port", "<0|1>", "Set the I2C bus port number"); + i2cconfig_args.freq = arg_int0(NULL, "freq", "", "Set the frequency(Hz) of I2C bus"); + i2cconfig_args.sda = arg_int1(NULL, "sda", "", "Set the gpio for I2C SDA"); + i2cconfig_args.scl = arg_int1(NULL, "scl", "", "Set the gpio for I2C SCL"); + i2cconfig_args.end = arg_end(2); + const esp_console_cmd_t i2cconfig_cmd = { + .command = "i2cconfig", + .help = "Config I2C bus", + .hint = NULL, + .func = &do_i2cconfig_cmd, + .argtable = &i2cconfig_args + }; + ESP_ERROR_CHECK(esp_console_cmd_register(&i2cconfig_cmd)); +} + +static int do_i2cdetect_cmd(int argc, char **argv) +{ + i2c_driver_install(i2c_port, I2C_MODE_MASTER, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); + i2c_master_driver_initialize(); + uint8_t address; + printf(" 0 1 2 3 4 5 6 7 8 9 a b c d e f\r\n"); + for (int i = 0; i < 128; i += 16) { + printf("%02x: ", i); + for (int j = 0; j < 16; j++) { + fflush(stdout); + address = i + j; + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, (address << 1) | WRITE_BIT, ACK_CHECK_EN); + i2c_master_stop(cmd); + esp_err_t ret = i2c_master_cmd_begin(i2c_port, cmd, 50 / portTICK_PERIOD_MS); + i2c_cmd_link_delete(cmd); + if (ret == ESP_OK) { + printf("%02x ", address); + } else if (ret == ESP_ERR_TIMEOUT) { + printf("UU "); + } else { + printf("-- "); + } + } + printf("\r\n"); + } + + i2c_driver_delete(i2c_port); + return 0; +} + +static void register_i2cdetect(void) +{ + const esp_console_cmd_t i2cdetect_cmd = { + .command = "i2cdetect", + .help = "Scan I2C bus for devices", + .hint = NULL, + .func = &do_i2cdetect_cmd, + .argtable = NULL + }; + ESP_ERROR_CHECK(esp_console_cmd_register(&i2cdetect_cmd)); +} + +static struct { + struct arg_int *chip_address; + struct arg_int *register_address; + struct arg_int *data_length; + struct arg_end *end; +} i2cget_args; + +static int do_i2cget_cmd(int argc, char **argv) +{ + int nerrors = arg_parse(argc, argv, (void **)&i2cget_args); + if (nerrors != 0) { + arg_print_errors(stderr, i2cget_args.end, argv[0]); + return 0; + } + + /* Check chip address: "-c" option */ + int chip_addr = i2cget_args.chip_address->ival[0]; + /* Check register address: "-r" option */ + int data_addr = -1; + if (i2cget_args.register_address->count) { + data_addr = i2cget_args.register_address->ival[0]; + } + /* Check data length: "-l" option */ + int len = 1; + if (i2cget_args.data_length->count) { + len = i2cget_args.data_length->ival[0]; + } + uint8_t *data = malloc(len); + + i2c_driver_install(i2c_port, I2C_MODE_MASTER, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); + i2c_master_driver_initialize(); + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + if (data_addr != -1) { + i2c_master_write_byte(cmd, chip_addr << 1 | WRITE_BIT, ACK_CHECK_EN); + i2c_master_write_byte(cmd, data_addr, ACK_CHECK_EN); + i2c_master_start(cmd); + } + i2c_master_write_byte(cmd, chip_addr << 1 | READ_BIT, ACK_CHECK_EN); + if (len > 1) { + i2c_master_read(cmd, data, len - 1, ACK_VAL); + } + i2c_master_read_byte(cmd, data + len - 1, NACK_VAL); + i2c_master_stop(cmd); + esp_err_t ret = i2c_master_cmd_begin(i2c_port, cmd, 1000 / portTICK_PERIOD_MS); + i2c_cmd_link_delete(cmd); + if (ret == ESP_OK) { + for (int i = 0; i < len; i++) { + printf("0x%02x ", data[i]); + if ((i + 1) % 16 == 0) { + printf("\r\n"); + } + } + if (len % 16) { + printf("\r\n"); + } + } else if (ret == ESP_ERR_TIMEOUT) { + ESP_LOGW(TAG, "Bus is busy"); + } else { + ESP_LOGW(TAG, "Read failed"); + } + free(data); + i2c_driver_delete(i2c_port); + return 0; +} + +static void register_i2cget(void) +{ + i2cget_args.chip_address = arg_int1("c", "chip", "", "Specify the address of the chip on that bus"); + i2cget_args.register_address = arg_int0("r", "register", "", "Specify the address on that chip to read from"); + i2cget_args.data_length = arg_int0("l", "length", "", "Specify the length to read from that data address"); + i2cget_args.end = arg_end(1); + const esp_console_cmd_t i2cget_cmd = { + .command = "i2cget", + .help = "Read registers visible through the I2C bus", + .hint = NULL, + .func = &do_i2cget_cmd, + .argtable = &i2cget_args + }; + ESP_ERROR_CHECK(esp_console_cmd_register(&i2cget_cmd)); +} + +static struct { + struct arg_int *chip_address; + struct arg_int *register_address; + struct arg_int *data; + struct arg_end *end; +} i2cset_args; + +static int do_i2cset_cmd(int argc, char **argv) +{ + int nerrors = arg_parse(argc, argv, (void **)&i2cset_args); + if (nerrors != 0) { + arg_print_errors(stderr, i2cset_args.end, argv[0]); + return 0; + } + + /* Check chip address: "-c" option */ + int chip_addr = i2cset_args.chip_address->ival[0]; + /* Check register address: "-r" option */ + int data_addr = 0; + if (i2cset_args.register_address->count) { + data_addr = i2cset_args.register_address->ival[0]; + } + /* Check data: "-d" option */ + int len = i2cset_args.data->count; + + i2c_driver_install(i2c_port, I2C_MODE_MASTER, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); + i2c_master_driver_initialize(); + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, chip_addr << 1 | WRITE_BIT, ACK_CHECK_EN); + if (i2cset_args.register_address->count) { + i2c_master_write_byte(cmd, data_addr, ACK_CHECK_EN); + } + for (int i = 0; i < len; i++) { + i2c_master_write_byte(cmd, i2cset_args.data->ival[i], ACK_CHECK_EN); + } + i2c_master_stop(cmd); + esp_err_t ret = i2c_master_cmd_begin(i2c_port, cmd, 1000 / portTICK_PERIOD_MS); + i2c_cmd_link_delete(cmd); + if (ret == ESP_OK) { + ESP_LOGI(TAG, "Write OK"); + } else if (ret == ESP_ERR_TIMEOUT) { + ESP_LOGW(TAG, "Bus is busy"); + } else { + ESP_LOGW(TAG, "Write Failed"); + } + i2c_driver_delete(i2c_port); + return 0; +} + +static void register_i2cset(void) +{ + i2cset_args.chip_address = arg_int1("c", "chip", "", "Specify the address of the chip on that bus"); + i2cset_args.register_address = arg_int0("r", "register", "", "Specify the address on that chip to read from"); + i2cset_args.data = arg_intn(NULL, NULL, "", 0, 256, "Specify the data to write to that data address"); + i2cset_args.end = arg_end(2); + const esp_console_cmd_t i2cset_cmd = { + .command = "i2cset", + .help = "Set registers visible through the I2C bus", + .hint = NULL, + .func = &do_i2cset_cmd, + .argtable = &i2cset_args + }; + ESP_ERROR_CHECK(esp_console_cmd_register(&i2cset_cmd)); +} + +static struct { + struct arg_int *chip_address; + struct arg_int *size; + struct arg_end *end; +} i2cdump_args; + +static int do_i2cdump_cmd(int argc, char **argv) +{ + int nerrors = arg_parse(argc, argv, (void **)&i2cdump_args); + if (nerrors != 0) { + arg_print_errors(stderr, i2cdump_args.end, argv[0]); + return 0; + } + + /* Check chip address: "-c" option */ + int chip_addr = i2cdump_args.chip_address->ival[0]; + /* Check read size: "-s" option */ + int size = 1; + if (i2cdump_args.size->count) { + size = i2cdump_args.size->ival[0]; + } + if (size != 1 && size != 2 && size != 4) { + ESP_LOGE(TAG, "Wrong read size. Only support 1,2,4"); + return 1; + } + i2c_driver_install(i2c_port, I2C_MODE_MASTER, I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE, 0); + i2c_master_driver_initialize(); + uint8_t data_addr; + uint8_t data[4]; + int32_t block[16]; + printf(" 0 1 2 3 4 5 6 7 8 9 a b c d e f" + " 0123456789abcdef\r\n"); + for (int i = 0; i < 128; i += 16) { + printf("%02x: ", i); + for (int j = 0; j < 16; j += size) { + fflush(stdout); + data_addr = i + j; + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, chip_addr << 1 | WRITE_BIT, ACK_CHECK_EN); + i2c_master_write_byte(cmd, data_addr, ACK_CHECK_EN); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, chip_addr << 1 | READ_BIT, ACK_CHECK_EN); + if (size > 1) { + i2c_master_read(cmd, data, size - 1, ACK_VAL); + } + i2c_master_read_byte(cmd, data + size - 1, NACK_VAL); + i2c_master_stop(cmd); + esp_err_t ret = i2c_master_cmd_begin(i2c_port, cmd, 50 / portTICK_PERIOD_MS); + i2c_cmd_link_delete(cmd); + if (ret == ESP_OK) { + for (int k = 0; k < size; k++) { + printf("%02x ", data[k]); + block[j + k] = data[k]; + } + } else { + for (int k = 0; k < size; k++) { + printf("XX "); + block[j + k] = -1; + } + } + } + printf(" "); + for (int k = 0; k < 16; k++) { + if (block[k] < 0) { + printf("X"); + } + if ((block[k] & 0xff) == 0x00 || (block[k] & 0xff) == 0xff) { + printf("."); + } else if ((block[k] & 0xff) < 32 || (block[k] & 0xff) >= 127) { + printf("?"); + } else { + printf("%c", (char)(block[k] & 0xff)); + } + } + printf("\r\n"); + } + i2c_driver_delete(i2c_port); + return 0; +} + +static void register_i2cdump(void) +{ + i2cdump_args.chip_address = arg_int1("c", "chip", "", "Specify the address of the chip on that bus"); + i2cdump_args.size = arg_int0("s", "size", "", "Specify the size of each read"); + i2cdump_args.end = arg_end(1); + const esp_console_cmd_t i2cdump_cmd = { + .command = "i2cdump", + .help = "Examine registers visible through the I2C bus", + .hint = NULL, + .func = &do_i2cdump_cmd, + .argtable = &i2cdump_args + }; + ESP_ERROR_CHECK(esp_console_cmd_register(&i2cdump_cmd)); +} + +void register_i2ctools(void) +{ + register_i2cconfig(); + register_i2cdetect(); + register_i2cget(); + register_i2cset(); + register_i2cdump(); +} diff --git a/code/04.peripheral/basics/i2c_tools/main/cmd_i2ctools.h b/code/04.peripheral/basics/i2c_tools/main/cmd_i2ctools.h new file mode 100644 index 0000000..2bd3953 --- /dev/null +++ b/code/04.peripheral/basics/i2c_tools/main/cmd_i2ctools.h @@ -0,0 +1,20 @@ +/* cmd_i2ctools.h + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +void register_i2ctools(void); + +#ifdef __cplusplus +} +#endif diff --git a/code/04.peripheral/basics/i2c_tools/main/i2ctools_example_main.c b/code/04.peripheral/basics/i2c_tools/main/i2ctools_example_main.c new file mode 100644 index 0000000..7374b08 --- /dev/null +++ b/code/04.peripheral/basics/i2c_tools/main/i2ctools_example_main.c @@ -0,0 +1,80 @@ +/* i2c-tools example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ + +#include +#include +#include "sdkconfig.h" +#include "esp_log.h" +#include "esp_console.h" +#include "esp_vfs_fat.h" +#include "cmd_system.h" +#include "cmd_i2ctools.h" + +static const char *TAG = "i2c-tools"; + +#if CONFIG_EXAMPLE_STORE_HISTORY + +#define MOUNT_PATH "/data" +#define HISTORY_PATH MOUNT_PATH "/history.txt" + +static void initialize_filesystem(void) +{ + static wl_handle_t wl_handle; + const esp_vfs_fat_mount_config_t mount_config = { + .max_files = 4, + .format_if_mount_failed = true + }; + esp_err_t err = esp_vfs_fat_spiflash_mount_rw_wl(MOUNT_PATH, "storage", &mount_config, &wl_handle); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to mount FATFS (%s)", esp_err_to_name(err)); + return; + } +} +#endif // CONFIG_EXAMPLE_STORE_HISTORY + +void app_main(void) +{ + esp_console_repl_t *repl = NULL; + esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT(); + +#if CONFIG_EXAMPLE_STORE_HISTORY + initialize_filesystem(); + repl_config.history_save_path = HISTORY_PATH; +#endif + repl_config.prompt = "i2c-tools>"; + + // install console REPL environment +#if CONFIG_ESP_CONSOLE_UART + esp_console_dev_uart_config_t uart_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_console_new_repl_uart(&uart_config, &repl_config, &repl)); +#elif CONFIG_ESP_CONSOLE_USB_CDC + esp_console_dev_usb_cdc_config_t cdc_config = ESP_CONSOLE_DEV_CDC_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_console_new_repl_usb_cdc(&cdc_config, &repl_config, &repl)); +#elif CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG + esp_console_dev_usb_serial_jtag_config_t usbjtag_config = ESP_CONSOLE_DEV_USB_SERIAL_JTAG_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_console_new_repl_usb_serial_jtag(&usbjtag_config, &repl_config, &repl)); +#endif + + register_i2ctools(); + + printf("\n ==============================================================\n"); + printf(" | Steps to Use i2c-tools |\n"); + printf(" | |\n"); + printf(" | 1. Try 'help', check all supported commands |\n"); + printf(" | 2. Try 'i2cconfig' to configure your I2C bus |\n"); + printf(" | 3. Try 'i2cdetect' to scan devices on the bus |\n"); + printf(" | 4. Try 'i2cget' to get the content of specific register |\n"); + printf(" | 5. Try 'i2cset' to set the value of specific register |\n"); + printf(" | 6. Try 'i2cdump' to dump all the register (Experiment) |\n"); + printf(" | |\n"); + printf(" ==============================================================\n\n"); + + // start console REPL + ESP_ERROR_CHECK(esp_console_start_repl(repl)); +} diff --git a/code/04.peripheral/basics/i2c_tools/partitions_example.csv b/code/04.peripheral/basics/i2c_tools/partitions_example.csv new file mode 100644 index 0000000..d4fe8bd --- /dev/null +++ b/code/04.peripheral/basics/i2c_tools/partitions_example.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap +nvs, data, nvs, 0x9000, 0x6000, +phy_init, data, phy, 0xf000, 0x1000, +factory, app, factory, 0x10000, 1M, +storage, data, fat, , 528K, diff --git a/code/04.peripheral/basics/i2c_tools/sdkconfig.defaults b/code/04.peripheral/basics/i2c_tools/sdkconfig.defaults new file mode 100644 index 0000000..fc9a5ae --- /dev/null +++ b/code/04.peripheral/basics/i2c_tools/sdkconfig.defaults @@ -0,0 +1,17 @@ +# Reduce bootloader log verbosity +CONFIG_BOOTLOADER_LOG_LEVEL_WARN=y +CONFIG_BOOTLOADER_LOG_LEVEL=2 + +# Increase main task stack size +CONFIG_ESP_MAIN_TASK_STACK_SIZE=7168 + +# Enable filesystem +CONFIG_PARTITION_TABLE_CUSTOM=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_example.csv" +CONFIG_PARTITION_TABLE_FILENAME="partitions_example.csv" + +# Enable FreeRTOS stats formatting functions, needed for 'tasks' command +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y + +CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y diff --git a/code/04.peripheral/basics/led_pwm/.gitignore b/code/04.peripheral/basics/led_pwm/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/basics/led_pwm/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/basics/led_pwm/CMakeLists.txt b/code/04.peripheral/basics/led_pwm/CMakeLists.txt new file mode 100644 index 0000000..5b8c869 --- /dev/null +++ b/code/04.peripheral/basics/led_pwm/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(led_pwm) diff --git a/code/04.peripheral/basics/led_pwm/main/CMakeLists.txt b/code/04.peripheral/basics/led_pwm/main/CMakeLists.txt new file mode 100644 index 0000000..1786984 --- /dev/null +++ b/code/04.peripheral/basics/led_pwm/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "led_pwm.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/basics/led_pwm/main/led_pwm.c b/code/04.peripheral/basics/led_pwm/main/led_pwm.c new file mode 100644 index 0000000..0b21ba1 --- /dev/null +++ b/code/04.peripheral/basics/led_pwm/main/led_pwm.c @@ -0,0 +1,65 @@ +#include +#include "driver/ledc.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_err.h" + +#define LEDC_TIMER LEDC_TIMER_0 +#define LEDC_MODE LEDC_LOW_SPEED_MODE +#define LEDC_OUTPUT_IO (2) // Define the output GPIO +#define LEDC_CHANNEL LEDC_CHANNEL_0 +#define LEDC_DUTY_RES LEDC_TIMER_13_BIT // Set duty resolution to 13 bits +#define LEDC_DUTY (4096) // Set duty to 50%. (2 ** 13) * 50% = 4096 +#define LEDC_FREQUENCY (4000) // Frequency in Hertz. Set frequency at 4 kHz +#define FADE_TIME (2000) // Fade time in milliseconds + +static void example_ledc_init(void) +{ + // Prepare and then apply the LEDC PWM timer configuration + ledc_timer_config_t ledc_timer = { + .speed_mode = LEDC_MODE, + .duty_resolution = LEDC_DUTY_RES, + .timer_num = LEDC_TIMER, + .freq_hz = LEDC_FREQUENCY, // Set output frequency at 4 kHz + .clk_cfg = LEDC_AUTO_CLK + }; + ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer)); + + // Prepare and then apply the LEDC PWM channel configuration + ledc_channel_config_t ledc_channel = { + .speed_mode = LEDC_MODE, + .channel = LEDC_CHANNEL, + .timer_sel = LEDC_TIMER, + .intr_type = LEDC_INTR_DISABLE, + .gpio_num = LEDC_OUTPUT_IO, + .duty = 0, // Start with duty 0% + .hpoint = 0 + }; + ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel)); + + // Install LEDC fade function + ESP_ERROR_CHECK(ledc_fade_func_install(0)); +} + +void app_main(void) +{ + // Set the LEDC peripheral configuration + example_ledc_init(); + + while (1) + { + // Fade to 100% duty cycle within FADE_TIME milliseconds + ESP_ERROR_CHECK(ledc_set_fade_with_time(LEDC_MODE, LEDC_CHANNEL, LEDC_DUTY, FADE_TIME)); + ESP_ERROR_CHECK(ledc_fade_start(LEDC_MODE, LEDC_CHANNEL, LEDC_FADE_WAIT_DONE)); + + // Wait for the fade to complete + vTaskDelay(FADE_TIME / portTICK_PERIOD_MS); + + // Fade back to 0% duty cycle within FADE_TIME milliseconds + ESP_ERROR_CHECK(ledc_set_fade_with_time(LEDC_MODE, LEDC_CHANNEL, 0, FADE_TIME)); + ESP_ERROR_CHECK(ledc_fade_start(LEDC_MODE, LEDC_CHANNEL, LEDC_FADE_WAIT_DONE)); + + // Wait for the fade to complete + vTaskDelay(FADE_TIME / portTICK_PERIOD_MS); + } +} diff --git a/code/04.peripheral/basics/uart/.gitignore b/code/04.peripheral/basics/uart/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/basics/uart/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/basics/uart/CMakeLists.txt b/code/04.peripheral/basics/uart/CMakeLists.txt new file mode 100644 index 0000000..930e642 --- /dev/null +++ b/code/04.peripheral/basics/uart/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(uart) diff --git a/code/04.peripheral/basics/uart/main/CMakeLists.txt b/code/04.peripheral/basics/uart/main/CMakeLists.txt new file mode 100644 index 0000000..ebabaeb --- /dev/null +++ b/code/04.peripheral/basics/uart/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "uart.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/basics/uart/main/uart.c b/code/04.peripheral/basics/uart/main/uart.c new file mode 100644 index 0000000..f2e8349 --- /dev/null +++ b/code/04.peripheral/basics/uart/main/uart.c @@ -0,0 +1,64 @@ +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" +#include "driver/uart.h" +#include "esp_err.h" +#include "string.h" + +#define TX_GPIO_NUM 17 +#define RX_GPIO_NUM 16 + +// 配置串口3 +void uart_config(void) { + const uart_port_t uart_num = UART_NUM_2; + + uart_config_t uart_config = { + .baud_rate = 115200, + .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 = 122, + }; + + // 配置UART参数 + ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config)); + + // 设置UART引脚 + ESP_ERROR_CHECK(uart_set_pin(uart_num, TX_GPIO_NUM, RX_GPIO_NUM, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE)); + + // 安装UART驱动程序,不使用事件队列 + const int uart_buffer_size = (1024 * 2); + ESP_ERROR_CHECK(uart_driver_install(uart_num, uart_buffer_size, 0, 0, NULL, 0)); +} + +// 串口发送测试 +void uart_send_receive_demo(void) { + const uart_port_t uart_num = UART_NUM_2; + char* test_str = "This is a UART test string.\n"; + uint8_t data[128]; + + // 发送数据 + uart_write_bytes(uart_num, test_str, strlen(test_str)); + + while(1){ + vTaskDelay(1); + // 等待数据接收 + int length = 0; + ESP_ERROR_CHECK(uart_get_buffered_data_len(uart_num, (size_t*)&length)); + if(length > 0) { + int read_len = uart_read_bytes(uart_num, data, length, pdMS_TO_TICKS(1000)); + if(read_len > 0) { + // 输出接收到的数据 + printf("Received: %.*s\n", read_len, data); + } + } + } + +} + + +void app_main(void) { + uart_config(); + uart_send_receive_demo(); +} diff --git a/code/04.peripheral/storage/flash_fatfs/.gitignore b/code/04.peripheral/storage/flash_fatfs/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/storage/flash_fatfs/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/storage/flash_fatfs/.gitignore copy b/code/04.peripheral/storage/flash_fatfs/.gitignore copy new file mode 100644 index 0000000..ee2dc29 --- /dev/null +++ b/code/04.peripheral/storage/flash_fatfs/.gitignore copy @@ -0,0 +1,6 @@ +*build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/storage/flash_fatfs/CMakeLists.txt b/code/04.peripheral/storage/flash_fatfs/CMakeLists.txt new file mode 100644 index 0000000..b325dda --- /dev/null +++ b/code/04.peripheral/storage/flash_fatfs/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(flash_fatfs) diff --git a/code/04.peripheral/storage/flash_fatfs/fatfs_image/hello.txt b/code/04.peripheral/storage/flash_fatfs/fatfs_image/hello.txt new file mode 100644 index 0000000..b7d3448 --- /dev/null +++ b/code/04.peripheral/storage/flash_fatfs/fatfs_image/hello.txt @@ -0,0 +1 @@ +11111111111111111111111111111222222222 diff --git a/code/04.peripheral/storage/flash_fatfs/main/CMakeLists.txt b/code/04.peripheral/storage/flash_fatfs/main/CMakeLists.txt new file mode 100644 index 0000000..5796529 --- /dev/null +++ b/code/04.peripheral/storage/flash_fatfs/main/CMakeLists.txt @@ -0,0 +1,5 @@ +idf_component_register(SRCS "flash_fatfs.c" + INCLUDE_DIRS ".") + +set(image ../fatfs_image) +fatfs_create_spiflash_image(storage ${image} FLASH_IN_PROJECT) diff --git a/code/04.peripheral/storage/flash_fatfs/main/flash_fatfs-backups.c b/code/04.peripheral/storage/flash_fatfs/main/flash_fatfs-backups.c new file mode 100644 index 0000000..45aa680 --- /dev/null +++ b/code/04.peripheral/storage/flash_fatfs/main/flash_fatfs-backups.c @@ -0,0 +1,85 @@ +// 演示读写文件 + +#include +#include +#include +#include "esp_flash.h" +#include "esp_vfs.h" +#include "esp_vfs_fat.h" +#include "esp_system.h" + +static const char *TAG = "FAT"; + +// Handle of the wear levelling library instance +static wl_handle_t s_wl_handle = WL_INVALID_HANDLE; + +// Mount path for the partition +const char *base_path = "/fatfs_image"; + +// Mount FATFS partition +static bool mount_fatfs(const char* partition_label) +{ + ESP_LOGI(TAG, "Mounting FAT filesystem"); + const esp_vfs_fat_mount_config_t mount_config = { + .max_files = 4, + .format_if_mount_failed = true, + .allocation_unit_size = CONFIG_WL_SECTOR_SIZE + }; + esp_err_t err = esp_vfs_fat_spiflash_mount_rw_wl(base_path, partition_label, &mount_config, &s_wl_handle); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to mount FATFS (%s)", esp_err_to_name(err)); + return false; + } + return true; +} + +void app_main(void) +{ + const char *partition_label = "storage"; + // Initialize FAT FS in the partition + if (!mount_fatfs(partition_label)) { + return; + } + + // Print FAT FS size information + uint64_t bytes_total, bytes_free; + esp_vfs_fat_info(base_path, &bytes_total, &bytes_free); + ESP_LOGI(TAG, "FAT FS: %" PRIu64 " kB total, %" PRIu64 " kB free", bytes_total / 1024, bytes_free / 1024); + + Create a file in FAT FS + ESP_LOGI(TAG, "Opening file"); + FILE *f = fopen("/fatfs_image/hello.txt", "wb"); + if (f == NULL) { + ESP_LOGE(TAG, "Failed to open file for writing"); + return; + } + fprintf(f, "fat文件系统测试 %s\n", "hollo world!"); + fclose(f); + ESP_LOGI(TAG, "File written"); + + // Open file for reading + ESP_LOGI(TAG, "Reading file"); + f = fopen("/fatfs_image/hello.txt", "rb"); + if (f == NULL) { + ESP_LOGE(TAG, "Failed to open file for reading"); + return; + } + char line[128]; + fgets(line, sizeof(line), f); + fclose(f); + // strip newline + char *pos = strchr(line, '\n'); + if (pos) { + *pos = '\0'; + } + ESP_LOGI(TAG, "Read from file: '%s'", line); + // Unmount FAT FS + ESP_LOGI(TAG, "Unmounting FAT filesystem"); + esp_err_t unmount_err = esp_vfs_fat_spiflash_unmount_rw_wl(base_path, s_wl_handle); + if (unmount_err != ESP_OK) { + ESP_LOGE(TAG, "Failed to unmount FATFS (%s)", esp_err_to_name(unmount_err)); + return; + } +} + + diff --git a/code/04.peripheral/storage/flash_fatfs/main/flash_fatfs.c b/code/04.peripheral/storage/flash_fatfs/main/flash_fatfs.c new file mode 100644 index 0000000..1c9eacc --- /dev/null +++ b/code/04.peripheral/storage/flash_fatfs/main/flash_fatfs.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include "esp_flash.h" +#include "esp_vfs.h" +#include "esp_vfs_fat.h" +#include "esp_system.h" + +static const char *TAG = "FAT"; + +// Handle of the wear levelling library instance +static wl_handle_t s_wl_handle = WL_INVALID_HANDLE; + +// Mount path for the partition +const char *base_path = "/fatfs_image"; + +// Mount FATFS partition +static bool mount_fatfs(const char* partition_label) +{ + ESP_LOGI(TAG, "Mounting FAT filesystem"); + const esp_vfs_fat_mount_config_t mount_config = { + .max_files = 4, + .format_if_mount_failed = true, + .allocation_unit_size = CONFIG_WL_SECTOR_SIZE + }; + esp_err_t err = esp_vfs_fat_spiflash_mount_rw_wl(base_path, partition_label, &mount_config, &s_wl_handle); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to mount FATFS (%s)", esp_err_to_name(err)); + return false; + } + return true; +} + +void app_main(void) +{ + const char *partition_label = "storage"; + // Initialize FAT FS in the partition + if (!mount_fatfs(partition_label)) { + return; + } + + // Print FAT FS size information + uint64_t bytes_total, bytes_free; + esp_vfs_fat_info(base_path, &bytes_total, &bytes_free); + ESP_LOGI(TAG, "FAT FS: %" PRIu64 " kB total, %" PRIu64 " kB free", bytes_total / 1024, bytes_free / 1024); + + // 读取写入的镜像文件 + // Open file for reading + ESP_LOGI(TAG, "Reading file"); + FILE *f = fopen("/fatfs_image/hello.txt", "rb"); + if (f == NULL) { + ESP_LOGE(TAG, "Failed to open file for reading"); + return; + } + char line[128]; + fgets(line, sizeof(line), f); + fclose(f); + // strip newline + char *pos = strchr(line, '\n'); + if (pos) { + *pos = '\0'; + } + ESP_LOGI(TAG, "Read from file: '%s'", line); + // Unmount FAT FS + ESP_LOGI(TAG, "Unmounting FAT filesystem"); + esp_err_t unmount_err = esp_vfs_fat_spiflash_unmount_rw_wl(base_path, s_wl_handle); + if (unmount_err != ESP_OK) { + ESP_LOGE(TAG, "Failed to unmount FATFS (%s)", esp_err_to_name(unmount_err)); + return; + } +} + + diff --git a/code/04.peripheral/storage/flash_fatfs/partitions.csv b/code/04.peripheral/storage/flash_fatfs/partitions.csv new file mode 100644 index 0000000..3ddb1e4 --- /dev/null +++ b/code/04.peripheral/storage/flash_fatfs/partitions.csv @@ -0,0 +1,7 @@ +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x4000, +phy_init, data, phy, 0xf000, 0x1000, +factory, app, factory, 0x10000, 1M, +storage, data, fat, 0x110000, 1M, + diff --git a/code/04.peripheral/storage/flash_spiffs/.gitignore b/code/04.peripheral/storage/flash_spiffs/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/storage/flash_spiffs/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/storage/flash_spiffs/CMakeLists.txt b/code/04.peripheral/storage/flash_spiffs/CMakeLists.txt new file mode 100644 index 0000000..c35429d --- /dev/null +++ b/code/04.peripheral/storage/flash_spiffs/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(flash_spiffs) diff --git a/code/04.peripheral/storage/flash_spiffs/main/CMakeLists.txt b/code/04.peripheral/storage/flash_spiffs/main/CMakeLists.txt new file mode 100644 index 0000000..ec4b876 --- /dev/null +++ b/code/04.peripheral/storage/flash_spiffs/main/CMakeLists.txt @@ -0,0 +1,8 @@ +idf_component_register(SRCS "flash_spiffs.c" + INCLUDE_DIRS ".") + +# Create a SPIFFS image from the contents of the 'spiffs_image' directory +# that fits the partition named 'storage'. FLASH_IN_PROJECT indicates that +# the generated image should be flashed when the entire project is flashed to +# the target with 'idf.py -p PORT flash'. +spiffs_create_partition_image(storage ../spiffs_image FLASH_IN_PROJECT) diff --git a/code/04.peripheral/storage/flash_spiffs/main/flash_spiffs.c b/code/04.peripheral/storage/flash_spiffs/main/flash_spiffs.c new file mode 100644 index 0000000..9c5d1a1 --- /dev/null +++ b/code/04.peripheral/storage/flash_spiffs/main/flash_spiffs.c @@ -0,0 +1,122 @@ +#include +#include +#include +#include +#include "esp_err.h" +#include "esp_log.h" +#include "esp_spiffs.h" +#include "mbedtls/md5.h" + +static const char *TAG = "example"; + +static void read_hello_txt(void) +{ + ESP_LOGI(TAG, "Reading hello.txt"); + + // Open for reading hello.txt + FILE* f = fopen("/spiffs/hello.txt", "r"); + if (f == NULL) { + ESP_LOGE(TAG, "Failed to open hello.txt"); + return; + } + + char buf[64]; + memset(buf, 0, sizeof(buf)); + fread(buf, 1, sizeof(buf), f); + fclose(f); + + // Display the read contents from the file + ESP_LOGI(TAG, "Read from hello.txt: %s", buf); +} + +static void compute_alice_txt_md5(void) +{ + ESP_LOGI(TAG, "Computing alice.txt MD5 hash"); + + // The file alice.txt lives under a subdirectory, though SPIFFS itself is flat + FILE* f = fopen("/spiffs/sub/alice.txt", "r"); + if (f == NULL) { + ESP_LOGE(TAG, "Failed to open alice.txt"); + return; + } + + // Read file and compute the digest chunk by chunk + #define MD5_MAX_LEN 16 + + char buf[64]; + mbedtls_md5_context ctx; + unsigned char digest[MD5_MAX_LEN]; + + mbedtls_md5_init(&ctx); + mbedtls_md5_starts(&ctx); + + size_t read; + + do { + read = fread((void*) buf, 1, sizeof(buf), f); + mbedtls_md5_update(&ctx, (unsigned const char*) buf, read); + } while(read == sizeof(buf)); + + mbedtls_md5_finish(&ctx, digest); + + // Create a string of the digest + char digest_str[MD5_MAX_LEN * 2]; + + for (int i = 0; i < MD5_MAX_LEN; i++) { + sprintf(&digest_str[i * 2], "%02x", (unsigned int)digest[i]); + } + + // For reference, MD5 should be deeb71f585cbb3ae5f7976d5127faf2a + ESP_LOGI(TAG, "Computed MD5 hash of alice.txt: %s", digest_str); + + fclose(f); +} + +void app_main(void) +{ + ESP_LOGI(TAG, "Initializing SPIFFS"); + + esp_vfs_spiffs_conf_t conf = { + .base_path = "/spiffs", + .partition_label = NULL, + .max_files = 5, + .format_if_mount_failed = false + }; + + // Use settings defined above to initialize and mount SPIFFS filesystem. + // Note: esp_vfs_spiffs_register is an all-in-one convenience function. + esp_err_t ret = esp_vfs_spiffs_register(&conf); + + if (ret != ESP_OK) { + if (ret == ESP_FAIL) { + ESP_LOGE(TAG, "Failed to mount or format filesystem"); + } else if (ret == ESP_ERR_NOT_FOUND) { + ESP_LOGE(TAG, "Failed to find SPIFFS partition"); + } else { + ESP_LOGE(TAG, "Failed to initialize SPIFFS (%s)", esp_err_to_name(ret)); + } + return; + } + + size_t total = 0, used = 0; + ret = esp_spiffs_info(NULL, &total, &used); + if (ret != ESP_OK) { + ESP_LOGE(TAG, "Failed to get SPIFFS partition information (%s)", esp_err_to_name(ret)); + } else { + ESP_LOGI(TAG, "Partition size: total: %d, used: %d", total, used); + } + + /* The following calls demonstrate reading files from the generated SPIFFS + * image. The images should contain the same files and contents as the spiffs_image directory. + */ + + // Read and display the contents of a small text file (hello.txt) + read_hello_txt(); + + // Compute and display the MD5 hash of a large text file (alice.txt) + compute_alice_txt_md5(); + + // All done, unmount partition and disable SPIFFS + esp_vfs_spiffs_unregister(NULL); + ESP_LOGI(TAG, "SPIFFS unmounted"); +} diff --git a/code/04.peripheral/storage/flash_spiffs/partitions.csv b/code/04.peripheral/storage/flash_spiffs/partitions.csv new file mode 100644 index 0000000..597fcdd --- /dev/null +++ b/code/04.peripheral/storage/flash_spiffs/partitions.csv @@ -0,0 +1,7 @@ +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x4000, +phy_init, data, phy, 0xf000, 0x1000, +factory, app, factory, 0x10000, 1M, +storage, data, spiffs, , 0xF0000, + diff --git a/code/04.peripheral/storage/flash_spiffs/spiffs_image/hello.txt b/code/04.peripheral/storage/flash_spiffs/spiffs_image/hello.txt new file mode 100644 index 0000000..980a0d5 --- /dev/null +++ b/code/04.peripheral/storage/flash_spiffs/spiffs_image/hello.txt @@ -0,0 +1 @@ +Hello World! diff --git a/code/04.peripheral/storage/flash_spiffs/spiffs_image/sub/alice.txt b/code/04.peripheral/storage/flash_spiffs/spiffs_image/sub/alice.txt new file mode 100644 index 0000000..62c7a8c --- /dev/null +++ b/code/04.peripheral/storage/flash_spiffs/spiffs_image/sub/alice.txt @@ -0,0 +1,21 @@ +Project Gutenberg’s Alice’s Adventures in Wonderland, by Lewis Carroll + +This eBook is for the use of anyone anywhere at no cost and with +almost no restrictions whatsoever. You may copy it, give it away or +re-use it under the terms of the Project Gutenberg License included +with this eBook or online at www.gutenberg.org + + +Title: Alice’s Adventures in Wonderland + +Author: Lewis Carroll + +Posting Date: June 25, 2008 [EBook #11] +Release Date: March, 1994 +Last Updated: October 6, 2016 + +Language: English + +Character set encoding: UTF-8 + +*** START OF THIS PROJECT GUTENBERG EBOOK ALICE’S ADVENTURES IN WONDERLAND *** diff --git a/code/04.peripheral/storage/nvs/.gitignore b/code/04.peripheral/storage/nvs/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/storage/nvs/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/storage/nvs/CMakeLists.txt b/code/04.peripheral/storage/nvs/CMakeLists.txt new file mode 100644 index 0000000..dcf6b76 --- /dev/null +++ b/code/04.peripheral/storage/nvs/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(nvs) diff --git a/code/04.peripheral/storage/nvs/main/CMakeLists.txt b/code/04.peripheral/storage/nvs/main/CMakeLists.txt new file mode 100644 index 0000000..a8c63a3 --- /dev/null +++ b/code/04.peripheral/storage/nvs/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "nvs.c" + INCLUDE_DIRS ".") diff --git a/code/04.peripheral/storage/nvs/main/nvs.c b/code/04.peripheral/storage/nvs/main/nvs.c new file mode 100644 index 0000000..c138029 --- /dev/null +++ b/code/04.peripheral/storage/nvs/main/nvs.c @@ -0,0 +1,75 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "nvs_flash.h" +#include "nvs.h" + +void app_main(void) +{ + // Initialize NVS + esp_err_t err = nvs_flash_init(); + if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { + // NVS partition was truncated and needs to be erased + // Retry nvs_flash_init + ESP_ERROR_CHECK(nvs_flash_erase()); + err = nvs_flash_init(); + } + ESP_ERROR_CHECK( err ); + + // Open + printf("\n"); + printf("Opening Non-Volatile Storage (NVS) handle... "); + nvs_handle_t my_handle; + err = nvs_open("storage", NVS_READWRITE, &my_handle); + if (err != ESP_OK) { + printf("Error (%s) opening NVS handle!\n", esp_err_to_name(err)); + } else { + printf("Done\n"); + + // Read + printf("Reading restart counter from NVS ... "); + int32_t restart_counter = 0; // value will default to 0, if not set yet in NVS + err = nvs_get_i32(my_handle, "restart_counter", &restart_counter); + switch (err) { + case ESP_OK: + printf("Done\n"); + printf("Restart counter = %" PRIu32 "\n", restart_counter); + break; + case ESP_ERR_NVS_NOT_FOUND: + printf("The value is not initialized yet!\n"); + break; + default : + printf("Error (%s) reading!\n", esp_err_to_name(err)); + } + + // Write + printf("Updating restart counter in NVS ... "); + restart_counter++; + err = nvs_set_i32(my_handle, "restart_counter", restart_counter); + printf((err != ESP_OK) ? "Failed!\n" : "Done\n"); + + // Commit written value. + // After setting any values, nvs_commit() must be called to ensure changes are written + // to flash storage. Implementations may write to storage at other times, + // but this is not guaranteed. + printf("Committing updates in NVS ... "); + err = nvs_commit(my_handle); + printf((err != ESP_OK) ? "Failed!\n" : "Done\n"); + + // Close + nvs_close(my_handle); + } + + printf("\n"); + + // Restart module + for (int i = 10; i >= 0; i--) { + printf("Restarting in %d seconds...\n", i); + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + printf("Restarting now.\n"); + fflush(stdout); + esp_restart(); +} diff --git a/code/04.peripheral/storage/partition/.gitignore b/code/04.peripheral/storage/partition/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/storage/partition/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/storage/partition/CMakeLists.txt b/code/04.peripheral/storage/partition/CMakeLists.txt new file mode 100644 index 0000000..8124cb8 --- /dev/null +++ b/code/04.peripheral/storage/partition/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(partition) diff --git a/code/04.peripheral/storage/partition/main/CMakeLists.txt b/code/04.peripheral/storage/partition/main/CMakeLists.txt new file mode 100644 index 0000000..1be1888 --- /dev/null +++ b/code/04.peripheral/storage/partition/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "partition.c" + INCLUDE_DIRS "") diff --git a/code/04.peripheral/storage/partition/main/partition.c b/code/04.peripheral/storage/partition/main/partition.c new file mode 100644 index 0000000..e7b27a8 --- /dev/null +++ b/code/04.peripheral/storage/partition/main/partition.c @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: CC0-1.0 + */ + +#include +#include +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_chip_info.h" +#include "esp_flash.h" + +void app_main(void) +{ + printf("Hello world!\n"); + + /* Print chip information */ + esp_chip_info_t chip_info; + uint32_t flash_size; + esp_chip_info(&chip_info); + printf("This is %s chip with %d CPU core(s), %s%s%s%s, ", + CONFIG_IDF_TARGET, + chip_info.cores, + (chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "", + (chip_info.features & CHIP_FEATURE_BT) ? "BT" : "", + (chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "", + (chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : ""); + + unsigned major_rev = chip_info.revision / 100; + unsigned minor_rev = chip_info.revision % 100; + printf("silicon revision v%d.%d, ", major_rev, minor_rev); + if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) { + printf("Get flash size failed"); + return; + } + + printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024), + (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external"); + + printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size()); + + for (int i = 10; i >= 0; i--) { + printf("Restarting in %d seconds...\n", i); + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + printf("Restarting now.\n"); + fflush(stdout); + esp_restart(); +} diff --git a/code/04.peripheral/storage/partition/partitions.csv b/code/04.peripheral/storage/partition/partitions.csv new file mode 100644 index 0000000..28ea819 --- /dev/null +++ b/code/04.peripheral/storage/partition/partitions.csv @@ -0,0 +1,8 @@ +# ESP-IDF Partition Table +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x4000, +otadata, data, ota, 0xd000, 0x2000, +phy_init, data, phy, 0xf000, 0x1000, +factory, app, factory, 0x10000, 1M, +ota_0, app, ota_0, 0x110000, 1M, + diff --git a/code/04.peripheral/storage/partition/sdkconfig.ci b/code/04.peripheral/storage/partition/sdkconfig.ci new file mode 100644 index 0000000..e69de29 diff --git a/code/04.peripheral/storage/sdmmc/.gitignore b/code/04.peripheral/storage/sdmmc/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/04.peripheral/storage/sdmmc/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/04.peripheral/storage/sdmmc/CMakeLists.txt b/code/04.peripheral/storage/sdmmc/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/04.peripheral/storage/sdmmc/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/04.peripheral/storage/sdmmc/main/CMakeLists.txt b/code/04.peripheral/storage/sdmmc/main/CMakeLists.txt new file mode 100644 index 0000000..cdde10c --- /dev/null +++ b/code/04.peripheral/storage/sdmmc/main/CMakeLists.txt @@ -0,0 +1,9 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# 只有ESP32 和ESP32S3支持SDMMC +if(NOT CONFIG_SOC_SDMMC_HOST_SUPPORTED) + fail_at_build_time(sdmmc "" + "Only ESP32 and ESP32-S3 targets are supported." + "Please refer README.md for more details") +endif() diff --git a/code/04.peripheral/storage/sdmmc/main/Kconfig.projbuild b/code/04.peripheral/storage/sdmmc/main/Kconfig.projbuild new file mode 100644 index 0000000..3b4b8bc --- /dev/null +++ b/code/04.peripheral/storage/sdmmc/main/Kconfig.projbuild @@ -0,0 +1,63 @@ +menu "SD/MMC Example Configuration" + + config EXAMPLE_FORMAT_IF_MOUNT_FAILED + bool "Format the card if mount failed" + default n + help + If this config item is set, format_if_mount_failed will be set to true and the card will be formatted if + the mount has failed. + + choice EXAMPLE_SDMMC_BUS_WIDTH + prompt "SD/MMC bus width" + default EXAMPLE_SDMMC_BUS_WIDTH_4 + help + Select the bus width of SD or MMC interface. + Note that even if 1 line mode is used, D3 pin of the SD card must have a pull-up resistor connected. + Otherwise the card may enter SPI mode, the only way to recover from which is to cycle power to the card. + + config EXAMPLE_SDMMC_BUS_WIDTH_4 + bool "4 lines (D0 - D3)" + + config EXAMPLE_SDMMC_BUS_WIDTH_1 + bool "1 line (D0)" + endchoice + + if SOC_SDMMC_USE_GPIO_MATRIX + + config EXAMPLE_PIN_CMD + int "CMD GPIO number" + default 35 if IDF_TARGET_ESP32S3 + default 44 if IDF_TARGET_ESP32P4 + + config EXAMPLE_PIN_CLK + int "CLK GPIO number" + default 36 if IDF_TARGET_ESP32S3 + default 43 if IDF_TARGET_ESP32P4 + + config EXAMPLE_PIN_D0 + int "D0 GPIO number" + default 37 if IDF_TARGET_ESP32S3 + default 39 if IDF_TARGET_ESP32P4 + + if EXAMPLE_SDMMC_BUS_WIDTH_4 + + config EXAMPLE_PIN_D1 + int "D1 GPIO number" + default 38 if IDF_TARGET_ESP32S3 + default 40 if IDF_TARGET_ESP32P4 + + config EXAMPLE_PIN_D2 + int "D2 GPIO number" + default 33 if IDF_TARGET_ESP32S3 + default 41 if IDF_TARGET_ESP32P4 + + config EXAMPLE_PIN_D3 + int "D3 GPIO number" + default 34 if IDF_TARGET_ESP32S3 + default 42 if IDF_TARGET_ESP32P4 + + endif # EXAMPLE_SDMMC_BUS_WIDTH_4 + + endif # SOC_SDMMC_USE_GPIO_MATRIX + +endmenu diff --git a/code/04.peripheral/storage/sdmmc/main/main.c b/code/04.peripheral/storage/sdmmc/main/main.c new file mode 100644 index 0000000..1e053db --- /dev/null +++ b/code/04.peripheral/storage/sdmmc/main/main.c @@ -0,0 +1,217 @@ + +// This example uses SDMMC peripheral to communicate with SD card. +#include +#include +#include +#include "esp_vfs_fat.h" +#include "sdmmc_cmd.h" +#include "driver/sdmmc_host.h" + +#define EXAMPLE_MAX_CHAR_SIZE 64 + + +static const char *TAG = "example"; + +#define MOUNT_POINT "/sdcard" + +static esp_err_t s_example_write_file(const char *path, char *data) +{ + ESP_LOGI(TAG, "Opening file %s", path); + FILE *f = fopen(path, "w"); + if (f == NULL) + { + ESP_LOGE(TAG, "Failed to open file for writing"); + return ESP_FAIL; + } + fprintf(f, data); + fclose(f); + ESP_LOGI(TAG, "File written"); + + return ESP_OK; +} + +static esp_err_t s_example_read_file(const char *path) +{ + ESP_LOGI(TAG, "Reading file %s", path); + FILE *f = fopen(path, "r"); + if (f == NULL) + { + ESP_LOGE(TAG, "Failed to open file for reading"); + return ESP_FAIL; + } + char line[EXAMPLE_MAX_CHAR_SIZE]; + fgets(line, sizeof(line), f); + fclose(f); + + // strip newline + char *pos = strchr(line, '\n'); + if (pos) + { + *pos = '\0'; + } + ESP_LOGI(TAG, "Read from file: '%s'", line); + + return ESP_OK; +} + +void app_main(void) +{ + esp_err_t ret; + + // Options for mounting the filesystem. + // If format_if_mount_failed is set to true, SD card will be partitioned and + // formatted in case when mounting fails. + esp_vfs_fat_sdmmc_mount_config_t mount_config = { + // 此选项用于开关SD卡挂载失败后是否格式化 +#ifdef CONFIG_EXAMPLE_FORMAT_IF_MOUNT_FAILED + .format_if_mount_failed = true, +#else + .format_if_mount_failed = false, +#endif // EXAMPLE_FORMAT_IF_MOUNT_FAILED + .max_files = 5, + .allocation_unit_size = 16 * 1024}; + + sdmmc_card_t *card; + const char mount_point[] = MOUNT_POINT; + ESP_LOGI(TAG, "Initializing SD card"); + + // Use settings defined above to initialize SD card and mount FAT filesystem. + // Note: esp_vfs_fat_sdmmc/sdspi_mount is all-in-one convenience functions. + // Please check its source code and implement error recovery when developing + // production applications. + + ESP_LOGI(TAG, "Using SDMMC peripheral"); + + // By default, SD card frequency is initialized to SDMMC_FREQ_DEFAULT (20MHz) + // For setting a specific frequency, use host.max_freq_khz (range 400kHz - 40MHz for SDMMC) + // Example: for fixed frequency of 10MHz, use host.max_freq_khz = 10000; + sdmmc_host_t host = SDMMC_HOST_DEFAULT(); + + // This initializes the slot without card detect (CD) and write protect (WP) signals. + // Modify slot_config.gpio_cd and slot_config.gpio_wp if your board has these signals. + sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT(); + + // Set bus width to use: +#ifdef CONFIG_EXAMPLE_SDMMC_BUS_WIDTH_4 + slot_config.width = 4; +#else + slot_config.width = 1; +#endif + + + // 使用ESP32的话,下面部分无用,SD卡对应的接口是唯一的,无法自定义 + // 可以参考:https://github.com/espressif/esp-idf/tree/master/examples/storage/sd_card/sdmmc#pin-assignments-for-esp32-s3 + // On chips where the GPIOs used for SD card can be configured, set them in + // the slot_config structure: + #ifdef CONFIG_SOC_SDMMC_USE_GPIO_MATRIX + slot_config.clk = CONFIG_EXAMPLE_PIN_CLK; + slot_config.cmd = CONFIG_EXAMPLE_PIN_CMD; + slot_config.d0 = CONFIG_EXAMPLE_PIN_D0; + #ifdef CONFIG_EXAMPLE_SDMMC_BUS_WIDTH_4 + slot_config.d1 = CONFIG_EXAMPLE_PIN_D1; + slot_config.d2 = CONFIG_EXAMPLE_PIN_D2; + slot_config.d3 = CONFIG_EXAMPLE_PIN_D3; + #endif // CONFIG_EXAMPLE_SDMMC_BUS_WIDTH_4 + #endif // CONFIG_SOC_SDMMC_USE_GPIO_MATRIX + + // Enable internal pullups on enabled pins. The internal pullups + // are insufficient however, please make sure 10k external pullups are + // connected on the bus. This is for debug / example purpose only. + slot_config.flags |= SDMMC_SLOT_FLAG_INTERNAL_PULLUP; + + ESP_LOGI(TAG, "Mounting filesystem"); + ret = esp_vfs_fat_sdmmc_mount(mount_point, &host, &slot_config, &mount_config, &card); + + if (ret != ESP_OK) + { + if (ret == ESP_FAIL) + { + ESP_LOGE(TAG, "Failed to mount filesystem. " + "If you want the card to be formatted, set the EXAMPLE_FORMAT_IF_MOUNT_FAILED menuconfig option."); + } + else + { + ESP_LOGE(TAG, "Failed to initialize the card (%s). " + "Make sure SD card lines have pull-up resistors in place.", + esp_err_to_name(ret)); + } + return; + } + ESP_LOGI(TAG, "Filesystem mounted"); + + // Card has been initialized, print its properties + sdmmc_card_print_info(stdout, card); + + // Use POSIX and C standard library functions to work with files: + + // First create a file. + const char *file_hello = MOUNT_POINT "/hello.txt"; + char data[EXAMPLE_MAX_CHAR_SIZE]; + snprintf(data, EXAMPLE_MAX_CHAR_SIZE, "%s %s!\n", "Hello", card->cid.name); + ret = s_example_write_file(file_hello, data); + if (ret != ESP_OK) + { + return; + } + + const char *file_foo = MOUNT_POINT "/foo.txt"; + // Check if destination file exists before renaming + struct stat st; + if (stat(file_foo, &st) == 0) + { + // Delete it if it exists + unlink(file_foo); + } + + // Rename original file + ESP_LOGI(TAG, "Renaming file %s to %s", file_hello, file_foo); + if (rename(file_hello, file_foo) != 0) + { + ESP_LOGE(TAG, "Rename failed"); + return; + } + + ret = s_example_read_file(file_foo); + if (ret != ESP_OK) + { + return; + } + + // Format FATFS + ret = esp_vfs_fat_sdcard_format(mount_point, card); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "Failed to format FATFS (%s)", esp_err_to_name(ret)); + return; + } + + if (stat(file_foo, &st) == 0) + { + ESP_LOGI(TAG, "file still exists"); + return; + } + else + { + ESP_LOGI(TAG, "file doesnt exist, format done"); + } + + const char *file_nihao = MOUNT_POINT "/nihao.txt"; + memset(data, 0, EXAMPLE_MAX_CHAR_SIZE); + snprintf(data, EXAMPLE_MAX_CHAR_SIZE, "%s %s!\n", "Nihao", card->cid.name); + ret = s_example_write_file(file_nihao, data); + if (ret != ESP_OK) + { + return; + } + + // Open file for reading + ret = s_example_read_file(file_nihao); + if (ret != ESP_OK) + { + return; + } + + // All done, unmount partition and disable SDMMC peripheral + esp_vfs_fat_sdcard_unmount(mount_point, card); + ESP_LOGI(TAG, "Card unmounted"); +} diff --git a/code/05.freertos_advanced/event_group/事件组同步/CMakeLists.txt b/code/05.freertos_advanced/event_group/事件组同步/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/event_group/事件组同步/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/event_group/事件组同步/main/CMakeLists.txt b/code/05.freertos_advanced/event_group/事件组同步/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/event_group/事件组同步/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/event_group/事件组同步/main/main.c b/code/05.freertos_advanced/event_group/事件组同步/main/main.c new file mode 100644 index 0000000..3413e76 --- /dev/null +++ b/code/05.freertos_advanced/event_group/事件组同步/main/main.c @@ -0,0 +1,99 @@ +// 事件组 +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" + +/* Bits used by the three tasks. */ +#define TASK_0_BIT (1 << 0) +#define TASK_1_BIT (1 << 1) +#define TASK_2_BIT (1 << 2) + +#define ALL_SYNC_BITS (TASK_0_BIT | TASK_1_BIT | TASK_2_BIT) + +static const char *TAG = "main"; +EventGroupHandle_t xEventBits; + + +void task0(void *pvParameters) +{ + ESP_LOGI(TAG, "-------------------------------"); + ESP_LOGI(TAG, "task0启动!"); + + while (1) + { + vTaskDelay(pdMS_TO_TICKS(3000)); + ESP_LOGI(TAG, "task0: 任务同步开始"); + // 事件同步 + xEventGroupSync( + xEventBits, /* The event group being tested. */ + TASK_0_BIT, /* The bits within the event group to wait for. */ + ALL_SYNC_BITS, /* The bits within the event group to wait for. */ + portMAX_DELAY); /* Wait a maximum of 100ms for either bit to be set. */ + + ESP_LOGI(TAG, "task0: 任务同步完成"); + vTaskDelay(pdMS_TO_TICKS(3000)); + } +} +void task1(void *pvParameters) +{ + ESP_LOGI(TAG, "-------------------------------"); + ESP_LOGI(TAG, "task1启动!"); + + while (1) + { + vTaskDelay(pdMS_TO_TICKS(4000)); + ESP_LOGI(TAG, "task1: 任务同步开始"); + + // 事件同步 + xEventGroupSync( + xEventBits, /* The event group being tested. */ + TASK_1_BIT, /* The bits within the event group to wait for. */ + ALL_SYNC_BITS, /* The bits within the event group to wait for. */ + portMAX_DELAY); /* Wait a maximum of 100ms for either bit to be set. */ + + ESP_LOGI(TAG, "task1: 任务同步完成"); + vTaskDelay(pdMS_TO_TICKS(3000)); + } +} + +void task2(void *pvParameters) +{ + ESP_LOGI(TAG, "-------------------------------"); + ESP_LOGI(TAG, "task2启动!"); + + while (1) + { + vTaskDelay(pdMS_TO_TICKS(5000)); + ESP_LOGI(TAG, "task2: 任务同步开始"); + // 事件同步 + xEventGroupSync( + xEventBits, /* The event group being tested. */ + TASK_2_BIT, /* The bits within the event group to wait for. */ + ALL_SYNC_BITS, /* The bits within the event group to wait for. */ + portMAX_DELAY); /* Wait a maximum of 100ms for either bit to be set. */ + + ESP_LOGI(TAG, "task2: 任务同步完成"); + vTaskDelay(pdMS_TO_TICKS(3000)); + } +} + + +void app_main(void) +{ + + // 创建事件组 + xEventBits = xEventGroupCreate(); + + if (xEventBits == NULL) + { + ESP_LOGE(TAG, "创建事件组失败"); + } + else + { + xTaskCreate(task0, "task0", 1024 * 2, NULL, 1, NULL); + xTaskCreate(task1, "task1", 1024 * 2, NULL, 1, NULL); + xTaskCreate(task2, "task2", 1024 * 2, NULL, 1, NULL); + } +} diff --git a/code/05.freertos_advanced/event_group/事件组同步/sdkconfig.defaults b/code/05.freertos_advanced/event_group/事件组同步/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/event_group/事件组同步/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/event_group/事件组等待/CMakeLists.txt b/code/05.freertos_advanced/event_group/事件组等待/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/event_group/事件组等待/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/event_group/事件组等待/main/CMakeLists.txt b/code/05.freertos_advanced/event_group/事件组等待/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/event_group/事件组等待/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/event_group/事件组等待/main/main.c b/code/05.freertos_advanced/event_group/事件组等待/main/main.c new file mode 100644 index 0000000..ba42b06 --- /dev/null +++ b/code/05.freertos_advanced/event_group/事件组等待/main/main.c @@ -0,0 +1,71 @@ +// 事件组 +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" + +static const char *TAG = "main"; + +EventGroupHandle_t xCreatedEventGroup; + +#define BIT_0 (1 << 0) +#define BIT_4 (1 << 4) + +void task1(void *pvParameters) +{ + ESP_LOGI(TAG, "-------------------------------"); + ESP_LOGI(TAG, "task1启动!"); + + while (1) + { + EventBits_t uxBits; + uxBits = xEventGroupWaitBits( + xCreatedEventGroup, /* The event group being tested. */ + BIT_0 | BIT_4, /* The bits within the event group to wait for. */ + pdTRUE, /* BIT_0 & BIT_4 should be cleared before returning. */ + pdFALSE, /* Don't wait for both bits, either bit will do. */ + portMAX_DELAY); /* Wait a maximum of 100ms for either bit to be set. */ + + if ((uxBits & (BIT_0 | BIT_4)) == (BIT_0 | BIT_4)) + { + ESP_LOGI(TAG, "BIT_0 和 BIT_4 都被设置了"); + } + else + { + ESP_LOGI(TAG, "BIT_0 和 BIT_4 有一个被设置了"); + } + } +} + +void task2(void *pvParameters) +{ + ESP_LOGI(TAG, "task2启动!"); + vTaskDelay(pdMS_TO_TICKS(1000)); + while (1) + { + xEventGroupSetBits(xCreatedEventGroup, BIT_0); + ESP_LOGI(TAG, "BIT_0 被设置"); + vTaskDelay(pdMS_TO_TICKS(3000)); + xEventGroupSetBits(xCreatedEventGroup, BIT_4); + ESP_LOGI(TAG, "BIT_4 被设置"); + vTaskDelay(pdMS_TO_TICKS(3000)); + } +} + +void app_main(void) +{ + + // 创建事件组 + xCreatedEventGroup = xEventGroupCreate(); + + if (xCreatedEventGroup == NULL) + { + ESP_LOGE(TAG, "创建事件组失败"); + } + else + { + xTaskCreate(task1, "task1", 1024 * 2, NULL, 1, NULL); + xTaskCreate(task2, "task2", 1024 * 2, NULL, 1, NULL); + } +} diff --git a/code/05.freertos_advanced/event_group/事件组等待/sdkconfig.defaults b/code/05.freertos_advanced/event_group/事件组等待/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/event_group/事件组等待/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/queue/队列传参_常量/CMakeLists.txt b/code/05.freertos_advanced/queue/队列传参_常量/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_常量/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/queue/队列传参_常量/main/CMakeLists.txt b/code/05.freertos_advanced/queue/队列传参_常量/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_常量/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/queue/队列传参_常量/main/main.c b/code/05.freertos_advanced/queue/队列传参_常量/main/main.c new file mode 100644 index 0000000..5e9a3bc --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_常量/main/main.c @@ -0,0 +1,78 @@ +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" + +static const char *TAG = "main"; + +void Task_1(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t xQueue = (QueueHandle_t)pvParameters; + int i = 0; + + for (;;) + { + // 发送数据到队列 + if (xQueueSend(xQueue, &i, 0)!= pdPASS) { + ESP_LOGI(TAG, "数据发送失败"); + } + else + { + ESP_LOGI(TAG, "数据发送成功"); + i++; + } + + if(i == 10) + { + i = 0; + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + vTaskDelete(NULL); +} + +void Task_2(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t xQueue = (QueueHandle_t)pvParameters; + for (;;) + { + int receivedData; + if (xQueueReceive(xQueue, &receivedData, 0) != pdPASS) + { + ESP_LOGI(TAG, "数据接收失败"); + } + else + { + ESP_LOGI(TAG, "数据接收成功,数据为:%d", receivedData); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + + } + vTaskDelete(NULL); +} + +void app_main(void) +{ + TaskHandle_t taskHandle_1 = NULL; + TaskHandle_t taskHandle_2 = NULL; + QueueHandle_t xQueue; + + // 创建队列 + xQueue = xQueueCreate(10, sizeof(int)); + + if (xQueue != NULL) + { + ESP_LOGI(TAG, "队列创建成功"); + // 发送数据任务 + xTaskCreate(Task_1, "Task_1", 1024 * 4, (void *)xQueue, 12, &taskHandle_1); + // 接收数据任务 + xTaskCreate(Task_2, "Task_1", 1024 * 4, (void *)xQueue, 12, &taskHandle_2); + } + else + { + ESP_LOGI(TAG, "队列创建失败"); + } +} diff --git a/code/05.freertos_advanced/queue/队列传参_常量/sdkconfig.defaults b/code/05.freertos_advanced/queue/队列传参_常量/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_常量/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/queue/队列传参_指针/CMakeLists.txt b/code/05.freertos_advanced/queue/队列传参_指针/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_指针/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/queue/队列传参_指针/main/CMakeLists.txt b/code/05.freertos_advanced/queue/队列传参_指针/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_指针/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/queue/队列传参_指针/main/main.c b/code/05.freertos_advanced/queue/队列传参_指针/main/main.c new file mode 100644 index 0000000..c119f35 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_指针/main/main.c @@ -0,0 +1,85 @@ +// 队列传参_指针: 一般用于传递占用内存较大的数据. 传递指针, 可以避免拷贝数据, 提高效率. +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" + +static const char *TAG = "main"; + +void Task_1(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t xQueue = (QueueHandle_t)pvParameters; + int i = 0; + + for (;;) + { + char *pCharSend = (char *)malloc(50); // 申请内存 + snprintf(pCharSend, 50, "Hello World! - %d", i); + i++; + // 发送数据到队列 + if (xQueueSend(xQueue, &pCharSend, 0) != pdPASS) + { + ESP_LOGI(TAG, "数据发送失败"); + } + else + { + ESP_LOGI(TAG, "数据发送成功"); + + } + + if (i == 10) + { + i = 0; + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + vTaskDelete(NULL); +} + +void Task_2(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t xQueue = (QueueHandle_t)pvParameters; + + char *pCharReceived = NULL; // 接收数据 + for (;;) + { + if (xQueueReceive(xQueue, &pCharReceived, 0) != pdPASS) + { + ESP_LOGI(TAG, "数据接收失败"); + } + else + { + ESP_LOGI(TAG, "数据接收成功,数据为:%s", pCharReceived); + free(pCharReceived); // 释放内存 + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + + } + vTaskDelete(NULL); +} + +void app_main(void) +{ + TaskHandle_t taskHandle_1 = NULL; + TaskHandle_t taskHandle_2 = NULL; + QueueHandle_t xQueue; + + // 创建队列 + xQueue = xQueueCreate(10, sizeof(char *)); + + if (xQueue != NULL) + { + ESP_LOGI(TAG, "队列创建成功"); + // 发送数据任务 + xTaskCreate(Task_1, "Task_1", 1024 * 4, (void *)xQueue, 12, &taskHandle_1); + // 接收数据任务 + xTaskCreate(Task_2, "Task_1", 1024 * 4, (void *)xQueue, 12, &taskHandle_2); + } + else + { + ESP_LOGI(TAG, "队列创建失败"); + } +} diff --git a/code/05.freertos_advanced/queue/队列传参_指针/sdkconfig.defaults b/code/05.freertos_advanced/queue/队列传参_指针/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_指针/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/queue/队列传参_结构体/CMakeLists.txt b/code/05.freertos_advanced/queue/队列传参_结构体/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_结构体/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/queue/队列传参_结构体/main/CMakeLists.txt b/code/05.freertos_advanced/queue/队列传参_结构体/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_结构体/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/queue/队列传参_结构体/main/main.c b/code/05.freertos_advanced/queue/队列传参_结构体/main/main.c new file mode 100644 index 0000000..83aff7d --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_结构体/main/main.c @@ -0,0 +1,86 @@ +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" + +static const char *TAG = "main"; + +// 定义结构体 +typedef struct +{ + int id; + int data[3]; +} MyStruct; + +void Task_1(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t xQueue = (QueueHandle_t)pvParameters; + MyStruct shendData = {1, {1, 2, 3}}; + + for (;;) + { + // 发送数据到队列 + if (xQueueSend(xQueue, &shendData, 0) != pdPASS) + { + ESP_LOGI(TAG, "数据发送失败"); + } + else + { + ESP_LOGI(TAG, "数据发送成功"); + shendData.id++; + } + + if (shendData.id == 10) + { + shendData.id = 0; + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + vTaskDelete(NULL); +} + +void Task_2(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t xQueue = (QueueHandle_t)pvParameters; + for (;;) + { + MyStruct receivedData; + if (xQueueReceive(xQueue, &receivedData, 0) != pdPASS) + { + ESP_LOGI(TAG, "数据接收失败"); + } + else + { + ESP_LOGI(TAG, "数据接收成功,数据为:%d-[%d,%d,%d]", receivedData.id, receivedData.data[0], receivedData.data[1], receivedData.data[2]); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + + } + vTaskDelete(NULL); +} + +void app_main(void) +{ + TaskHandle_t taskHandle_1 = NULL; + TaskHandle_t taskHandle_2 = NULL; + QueueHandle_t xQueue; + + // 创建队列 + xQueue = xQueueCreate(10, sizeof(MyStruct)); + + if (xQueue != NULL) + { + ESP_LOGI(TAG, "队列创建成功"); + // 发送数据任务 + xTaskCreate(Task_1, "Task_1", 1024 * 4, (void *)xQueue, 12, &taskHandle_1); + // 接收数据任务 + xTaskCreate(Task_2, "Task_1", 1024 * 4, (void *)xQueue, 12, &taskHandle_2); + } + else + { + ESP_LOGI(TAG, "队列创建失败"); + } +} diff --git a/code/05.freertos_advanced/queue/队列传参_结构体/sdkconfig.defaults b/code/05.freertos_advanced/queue/队列传参_结构体/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列传参_结构体/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/queue/队列多进单出模型/CMakeLists.txt b/code/05.freertos_advanced/queue/队列多进单出模型/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列多进单出模型/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/queue/队列多进单出模型/main/CMakeLists.txt b/code/05.freertos_advanced/queue/队列多进单出模型/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列多进单出模型/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/queue/队列多进单出模型/main/main.c b/code/05.freertos_advanced/queue/队列多进单出模型/main/main.c new file mode 100644 index 0000000..16205e7 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列多进单出模型/main/main.c @@ -0,0 +1,97 @@ +// 队列多进单出: 任务1和任务2发送数据到队列,任务3接收数据 任务3的优先级高于任务1和任务2,已达到数据监听的目的 +// 参考:https://www.bilibili.com/video/BV1R44y177VS/?spm_id_from=333.788.top_right_bar_window_history.content.click&vd_source=ef5a0ab0106372751602034cdd9ab98e + +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" + +static const char *TAG = "main"; + +void Task_1(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t xQueue = (QueueHandle_t)pvParameters; + int i = 111; + + for (;;) + { + // 发送数据到队列 + if (xQueueSend(xQueue, &i, 0) != pdPASS) + { + ESP_LOGI(TAG, "任务1数据发送失败"); + } + else + { + ESP_LOGI(TAG, "任务1数据发送成功"); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + vTaskDelete(NULL); +} + +void Task_2(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t xQueue = (QueueHandle_t)pvParameters; + int i = 222; + + for (;;) + { + // 发送数据到队列 + if (xQueueSend(xQueue, &i, 0) != pdPASS) + { + ESP_LOGI(TAG, "任务2数据发送失败"); + } + else + { + ESP_LOGI(TAG, "任务2数据发送成功"); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + vTaskDelete(NULL); +} + +void Task_3(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t xQueue = (QueueHandle_t)pvParameters; + for (;;) + { + int receivedData; + // 使用portMAX_DELAY阻塞等待数据 + if (xQueueReceive(xQueue, &receivedData, portMAX_DELAY) != pdPASS) + { + ESP_LOGI(TAG, "任务3数据接收失败"); + } + else + { + ESP_LOGI(TAG, "任务3数据接收成功,数据为:%d", receivedData); + } + } + vTaskDelete(NULL); +} + +void app_main(void) +{ + + QueueHandle_t xQueue; + + // 创建队列 + xQueue = xQueueCreate(10, sizeof(int)); + + if (xQueue != NULL) + { + ESP_LOGI(TAG, "队列创建成功"); + // 发送数据任务 + xTaskCreate(Task_1, "Task_1", 1024 * 4, (void *)xQueue, 1, NULL); + xTaskCreate(Task_2, "Task_1", 1024 * 4, (void *)xQueue, 1, NULL); + // 接收数据任务 + xTaskCreate(Task_3, "Task_1", 1024 * 4, (void *)xQueue, 2, NULL); + } + else + { + ESP_LOGI(TAG, "队列创建失败"); + } +} diff --git a/code/05.freertos_advanced/queue/队列多进单出模型/sdkconfig.defaults b/code/05.freertos_advanced/queue/队列多进单出模型/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列多进单出模型/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/queue/队列邮箱/CMakeLists.txt b/code/05.freertos_advanced/queue/队列邮箱/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列邮箱/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/queue/队列邮箱/main/CMakeLists.txt b/code/05.freertos_advanced/queue/队列邮箱/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列邮箱/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/queue/队列邮箱/main/main.c b/code/05.freertos_advanced/queue/队列邮箱/main/main.c new file mode 100644 index 0000000..3a0cfdb --- /dev/null +++ b/code/05.freertos_advanced/queue/队列邮箱/main/main.c @@ -0,0 +1,127 @@ +// 队列邮箱: FreeRTOS的邮箱概念跟别的RTOS不一样,它是一个队列,队列长度只有1. +// 写邮箱:新数据覆盖旧数据,读邮箱:读数据时,数据不会被移除; +// 这意味着,第一次调用时会因为无数据而阻塞,一旦曾经写入数据,以后读邮箱时总能成功。 +// https : // www.bilibili.com/video/BV1zq4y1m7UK?spm_id_from=333.788.videopod.sections&vd_source=ef5a0ab0106372751602034cdd9ab98e + +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" + +static const char *TAG = "main"; + +// 写数据队列 +void Task_1(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t Mailbox = (QueueHandle_t)pvParameters; + int i = 0; + + for (;;) + { + // 发送数据到队列 + if (xQueueOverwrite(Mailbox, &i) != pdPASS) + { + ESP_LOGI(TAG, "任务1数据发送失败"); + } + else + { + ESP_LOGI(TAG, "任务1数据发送成功"); + } + i++; + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + vTaskDelete(NULL); +} + + +// 读数据队列 +void Task_2(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t Mailbox = (QueueHandle_t)pvParameters; + + int i = 0; + + for (;;) + { + // 读取数据 + if (xQueuePeek(Mailbox, &i, portMAX_DELAY) == pdPASS) + { + ESP_LOGI(TAG, "任务2数据读取成功,数据为:%d", i); + } + else + { + ESP_LOGI(TAG, "任务2数据读取失败"); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + vTaskDelete(NULL); +} + +void Task_3(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t Mailbox = (QueueHandle_t)pvParameters; + int i = 0; + + for (;;) + { + // 读取数据 + if (xQueuePeek(Mailbox, &i, portMAX_DELAY) == pdPASS) + { + ESP_LOGI(TAG, "任务3数据读取成功,数据为:%d", i); + } + else + { + ESP_LOGI(TAG, "任务3数据读取失败"); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + vTaskDelete(NULL); +} + +void Task_4(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t Mailbox = (QueueHandle_t)pvParameters; + int i = 0; + + for (;;) + { + // 读取数据 + if (xQueuePeek(Mailbox, &i, portMAX_DELAY) == pdPASS) + { + ESP_LOGI(TAG, "任务4数据读取成功,数据为:%d", i); + } + else + { + ESP_LOGI(TAG, "任务4数据读取失败"); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + vTaskDelete(NULL); +} + +void app_main(void) +{ + QueueHandle_t Mailbox; // 创建邮箱 + + // 创建队列(注意:队列长度只有1) + Mailbox = xQueueCreate(1, sizeof(int)); + + if ((Mailbox != NULL) ) + { + ESP_LOGI(TAG, "队列创建成功"); + // 写数据任务 + xTaskCreate(Task_1, "Task_1", 1024 * 4, (void *)Mailbox, 2, NULL); + xTaskCreate(Task_2, "Task_2", 1024 * 4, (void *)Mailbox, 1, NULL); + xTaskCreate(Task_3, "Task_3", 1024 * 4, (void *)Mailbox, 1, NULL); + xTaskCreate(Task_4, "Task_4", 1024 * 4, (void *)Mailbox, 1, NULL); + } + else + { + ESP_LOGI(TAG, "队列创建失败"); + } +} diff --git a/code/05.freertos_advanced/queue/队列邮箱/sdkconfig.defaults b/code/05.freertos_advanced/queue/队列邮箱/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列邮箱/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/queue/队列集合/CMakeLists.txt b/code/05.freertos_advanced/queue/队列集合/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列集合/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/queue/队列集合/main/CMakeLists.txt b/code/05.freertos_advanced/queue/队列集合/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列集合/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/queue/队列集合/main/main.c b/code/05.freertos_advanced/queue/队列集合/main/main.c new file mode 100644 index 0000000..71f4875 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列集合/main/main.c @@ -0,0 +1,110 @@ +// 队列集合: +// https : // www.bilibili.com/video/BV1zq4y1m7UK?spm_id_from=333.788.videopod.sections&vd_source=ef5a0ab0106372751602034cdd9ab98e + +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/queue.h" + +static const char *TAG = "main"; + +void Task_1(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t xQueue = (QueueHandle_t)pvParameters; + int i = 111; + + for (;;) + { + // 发送数据到队列 + if (xQueueSend(xQueue, &i, 0) != pdPASS) + { + ESP_LOGI(TAG, "任务1数据发送失败"); + } + else + { + ESP_LOGI(TAG, "任务1数据发送成功"); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + vTaskDelete(NULL); +} + +void Task_2(void *pvParameters) +{ + // 取得队列句柄 + QueueHandle_t xQueue = (QueueHandle_t)pvParameters; + int i = 222; + + for (;;) + { + // 发送数据到队列 + if (xQueueSend(xQueue, &i, 0) != pdPASS) + { + ESP_LOGI(TAG, "任务2数据发送失败"); + } + else + { + ESP_LOGI(TAG, "任务2数据发送成功"); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + vTaskDelete(NULL); +} + +void Task_3(void *pvParameters) +{ + // 取得队列集合句柄 + QueueSetHandle_t xQueueSet = (QueueSetHandle_t)pvParameters; + // 取得有数据队列句柄 + QueueSetMemberHandle_t QueueData; + for (;;) + { + QueueData = xQueueSelectFromSet(xQueueSet, portMAX_DELAY); + if (QueueData != NULL) + { + int i; + if (xQueueReceive(QueueData, &i, portMAX_DELAY) != pdPASS) + { + ESP_LOGI(TAG, "任务3数据接收失败"); + } + else + { + ESP_LOGI(TAG, "任务3数据接收成功,数据为:%d", i); + } + } + } + vTaskDelete(NULL); +} + +void app_main(void) +{ + QueueHandle_t xQueue_1; + QueueHandle_t xQueue_2; + // 创建队列 + xQueue_1 = xQueueCreate(10, sizeof(int)); + xQueue_2 = xQueueCreate(10, sizeof(int)); + + // 创建队列集合 + QueueSetHandle_t xQueueSet; + xQueueSet = xQueueCreateSet(20); + + // 将队列添加到队列集合 + xQueueAddToSet(xQueue_1, xQueueSet); + xQueueAddToSet(xQueue_2, xQueueSet); + + if ((xQueue_1 != NULL )&& (xQueue_2 != NULL) && (xQueueSet != NULL)) + { + ESP_LOGI(TAG, "队列创建成功"); + // 发送数据任务 + xTaskCreate(Task_1, "Task_1", 1024 * 4, (void *)xQueue_1, 1, NULL); + xTaskCreate(Task_2, "Task_1", 1024 * 4, (void *)xQueue_2, 1, NULL); + // 接收数据任务 + xTaskCreate(Task_3, "Task_1", 1024 * 4, (void *)xQueueSet, 2, NULL); + } + else + { + ESP_LOGI(TAG, "队列创建失败"); + } +} diff --git a/code/05.freertos_advanced/queue/队列集合/sdkconfig.defaults b/code/05.freertos_advanced/queue/队列集合/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/queue/队列集合/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/semphr/二进制信号量/CMakeLists.txt b/code/05.freertos_advanced/semphr/二进制信号量/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/semphr/二进制信号量/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/semphr/二进制信号量/main/CMakeLists.txt b/code/05.freertos_advanced/semphr/二进制信号量/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/semphr/二进制信号量/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/semphr/二进制信号量/main/main.c b/code/05.freertos_advanced/semphr/二进制信号量/main/main.c new file mode 100644 index 0000000..f988ffd --- /dev/null +++ b/code/05.freertos_advanced/semphr/二进制信号量/main/main.c @@ -0,0 +1,60 @@ +// 二进制信号量 +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" + +static const char *TAG = "main"; + +// 二进制信号量 +SemaphoreHandle_t semaphoreHandle; + +// 公共变量 +int shareVariable = 0; + +void task1(void *pvParameters) +{ + for (;;) + { + // 获取信号量,信号量变为0 + xSemaphoreTake(semaphoreHandle, portMAX_DELAY); + for (int i = 0; i < 10; i++) + { + shareVariable++; + ESP_LOGI(TAG, "task1 shareVariable:%d", shareVariable); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + // 释放信号量,信号量变为1 + xSemaphoreGive(semaphoreHandle); + vTaskDelay(pdMS_TO_TICKS(1000)); + } +} + +void task2(void *pvParameters) +{ + for (;;) + { + // 获取信号量 + xSemaphoreTake(semaphoreHandle, portMAX_DELAY); + for (int i = 0; i < 10; i++) + { + shareVariable++; + ESP_LOGI(TAG, "task2 shareVariable:%d", shareVariable); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + // 释放信号量,信号量变为1 + xSemaphoreGive(semaphoreHandle); + vTaskDelay(pdMS_TO_TICKS(1000)); + } +} + +void app_main(void) +{ + semaphoreHandle = xSemaphoreCreateBinary(); + xSemaphoreGive(semaphoreHandle); + + // 创建任务 + xTaskCreate(task1, "task1", 1024 * 2, NULL, 10, NULL); + xTaskCreate(task2, "task2", 1024 * 2, NULL, 10, NULL); +} diff --git a/code/05.freertos_advanced/semphr/二进制信号量/sdkconfig.defaults b/code/05.freertos_advanced/semphr/二进制信号量/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/semphr/二进制信号量/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/semphr/互斥量/CMakeLists.txt b/code/05.freertos_advanced/semphr/互斥量/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/semphr/互斥量/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/semphr/互斥量/main/CMakeLists.txt b/code/05.freertos_advanced/semphr/互斥量/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/semphr/互斥量/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/semphr/互斥量/main/main.c b/code/05.freertos_advanced/semphr/互斥量/main/main.c new file mode 100644 index 0000000..9d27e6b --- /dev/null +++ b/code/05.freertos_advanced/semphr/互斥量/main/main.c @@ -0,0 +1,80 @@ +// 互斥量(互斥锁Mutex):互斥锁和二进制信号量极为相似,但 有一些细微差异:互斥锁具有优先级继承机制, 但二进制信号量没有。 +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" + +static const char *TAG = "main"; + +SemaphoreHandle_t mutexHandle; + +void task1(void *pvParameters) +{ + ESP_LOGI(TAG, "task1启动!"); + while (1) + { + if (xSemaphoreTake(mutexHandle, portMAX_DELAY) == pdTRUE) + { + ESP_LOGI(TAG, "task1获取到互斥量!"); + for (int i = 0; i < 10; i++) + { + ESP_LOGI(TAG, "task1执行中...%d", i); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + xSemaphoreGive(mutexHandle); + ESP_LOGI(TAG, "task1释放互斥量!"); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + else + { + ESP_LOGI(TAG, "task1获取互斥量失败!"); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + } +} + +void task2(void *pvParameters) +{ + ESP_LOGI(TAG, "task2启动!"); + vTaskDelay(pdMS_TO_TICKS(1000)); + while (1) + { + } +} + +void task3(void *pvParameters) +{ + ESP_LOGI(TAG, "task3启动!"); + vTaskDelay(pdMS_TO_TICKS(1000)); + while (1) + { + if (xSemaphoreTake(mutexHandle, 1000) == pdPASS) + { + ESP_LOGI(TAG, "task3获取到互斥量!"); + for (int i = 0; i < 10; i++) + { + ESP_LOGI(TAG, "task3执行中...%d",i); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + + xSemaphoreGive(mutexHandle); + ESP_LOGI(TAG, "task3释放互斥量!"); + vTaskDelay(pdMS_TO_TICKS(5000)); + } + else + { + ESP_LOGI(TAG, "task3未获取到互斥量!"); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + } +} + +void app_main(void) +{ + mutexHandle = xSemaphoreCreateMutex(); + // mutexHandle = xSemaphoreCreateBinary(); + xTaskCreate(task1, "task1", 1024 * 2, NULL, 1, NULL); + xTaskCreate(task2, "task2", 1024 * 2, NULL, 2, NULL); + xTaskCreate(task3, "task3", 1024 * 2, NULL, 3, NULL); +} diff --git a/code/05.freertos_advanced/semphr/互斥量/sdkconfig.defaults b/code/05.freertos_advanced/semphr/互斥量/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/semphr/互斥量/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/semphr/计数信号量/CMakeLists.txt b/code/05.freertos_advanced/semphr/计数信号量/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/semphr/计数信号量/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/semphr/计数信号量/main/CMakeLists.txt b/code/05.freertos_advanced/semphr/计数信号量/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/semphr/计数信号量/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/semphr/计数信号量/main/main.c b/code/05.freertos_advanced/semphr/计数信号量/main/main.c new file mode 100644 index 0000000..18dd04c --- /dev/null +++ b/code/05.freertos_advanced/semphr/计数信号量/main/main.c @@ -0,0 +1,59 @@ +// 计数型信号量(占座) +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" + +static const char *TAG = "main"; + +// 信号量 +SemaphoreHandle_t semaphoreHandle; + + +// 占座任务 +void task1(void *pvParameters) +{ + // 定义空位 + int seat = 0; + for (;;) + { + // 获取信号量 + seat = uxSemaphoreGetCount(semaphoreHandle); + // 输出空位 + ESP_LOGI(TAG, "当前空位:%d", seat); + + // 获取信号量(占座) + if (xSemaphoreTake(semaphoreHandle, portMAX_DELAY) == pdPASS) + { + ESP_LOGI(TAG, "占座成功"); + } + else + { + ESP_LOGI(TAG, "占座失败"); + } + vTaskDelay(pdMS_TO_TICKS(1000)); + } +} + +// 离开座位任务 +void task2(void *pvParameters) +{ + for (;;) + { + vTaskDelay(pdMS_TO_TICKS(6000)); + // 释放信号量 + xSemaphoreGive(semaphoreHandle); + ESP_LOGI(TAG, "释放座位"); + } +} + +void app_main(void) +{ + semaphoreHandle = xSemaphoreCreateCounting(5, 5); + + // 创建占座任务 + xTaskCreate(task1, "task1", 1024 * 2, NULL, 10, NULL); + // 创建离开座位任务 + xTaskCreate(task2, "task2", 1024 * 2, NULL, 10, NULL); +} diff --git a/code/05.freertos_advanced/semphr/计数信号量/sdkconfig.defaults b/code/05.freertos_advanced/semphr/计数信号量/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/semphr/计数信号量/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/semphr/递归互斥量/CMakeLists.txt b/code/05.freertos_advanced/semphr/递归互斥量/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/semphr/递归互斥量/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/semphr/递归互斥量/main/CMakeLists.txt b/code/05.freertos_advanced/semphr/递归互斥量/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/semphr/递归互斥量/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/semphr/递归互斥量/main/main.c b/code/05.freertos_advanced/semphr/递归互斥量/main/main.c new file mode 100644 index 0000000..3f2c795 --- /dev/null +++ b/code/05.freertos_advanced/semphr/递归互斥量/main/main.c @@ -0,0 +1,79 @@ +// 递归互斥量 +// 非递归互斥锁只能被一个任务 获取一次,如果同一个任务想再次获取则会失败, 因为当任务第一次释放互斥锁时,互斥锁就一直处于释放状态。 +// 与非递归互斥锁相反,递归互斥锁可以被同一个任务获取很多次, 获取多少次就需要释放多少次, 此时才会返回递归互斥锁。 +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" + +static const char *TAG = "main"; + +SemaphoreHandle_t mutexHandle; + +void task1(void *pvParameters) +{ + ESP_LOGI(TAG, "-------------------------------"); + ESP_LOGI(TAG, "task1启动!"); + while (1) + { + xSemaphoreTakeRecursive(mutexHandle, portMAX_DELAY); + ESP_LOGI(TAG, "task1获取到互斥量-使用资源A"); + for (int i = 0; i < 10; i++) + { + ESP_LOGI(TAG, "task1执行中...%d -使用资源A", i); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + + xSemaphoreTakeRecursive(mutexHandle, portMAX_DELAY); + ESP_LOGI(TAG, "task1获取到互斥量-使用资源B"); + for (int i = 0; i < 10; i++) + { + ESP_LOGI(TAG, "task1执行中...%d -使用资源B", i); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + + xSemaphoreGiveRecursive(mutexHandle); + ESP_LOGI(TAG, "task1释放互斥量-使用资源B"); + vTaskDelay(pdMS_TO_TICKS(3000)); + xSemaphoreGiveRecursive(mutexHandle); + ESP_LOGI(TAG, "task1释放互斥量-使用资源A"); + } + vTaskDelete(NULL); +} + +void task2(void *pvParameters) +{ + ESP_LOGI(TAG, "task2启动!"); + vTaskDelay(pdMS_TO_TICKS(1000)); + while (1) + { + // 获取递归互斥锁 + if (xSemaphoreTakeRecursive(mutexHandle, portMAX_DELAY) == pdTRUE) + { + ESP_LOGI(TAG, "task2获取到互斥量"); + for (int i = 0; i < 10; i++) + + { + ESP_LOGI(TAG, "task2执行中...%d", i); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + xSemaphoreGiveRecursive(mutexHandle); + ESP_LOGI(TAG, "task2释放互斥量"); + } + else + { + ESP_LOGI(TAG, "task2获取互斥量失败"); + vTaskDelay(pdMS_TO_TICKS(1000)); + } + } +} + +void app_main(void) +{ + // 创建递归互斥量 + mutexHandle = xSemaphoreCreateRecursiveMutex(); + + xTaskCreate(task1, "task1", 1024 * 2, NULL, 1, NULL); + xTaskCreate(task2, "task2", 1024 * 2, NULL, 2, NULL); +} diff --git a/code/05.freertos_advanced/semphr/递归互斥量/sdkconfig.defaults b/code/05.freertos_advanced/semphr/递归互斥量/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/semphr/递归互斥量/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/task_notify/任务通知值/CMakeLists.txt b/code/05.freertos_advanced/task_notify/任务通知值/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/task_notify/任务通知值/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/task_notify/任务通知值/main/CMakeLists.txt b/code/05.freertos_advanced/task_notify/任务通知值/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/task_notify/任务通知值/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/task_notify/任务通知值/main/main.c b/code/05.freertos_advanced/task_notify/任务通知值/main/main.c new file mode 100644 index 0000000..4356665 --- /dev/null +++ b/code/05.freertos_advanced/task_notify/任务通知值/main/main.c @@ -0,0 +1,65 @@ +// 任务通知值按位判断-代替队列邮箱或者事件组 +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +static const char *TAG = "main"; + +static TaskHandle_t xTask1 = NULL, xTask2 = NULL; + +void task1(void *pvParameters) +{ + ESP_LOGI(TAG, "-------------------------------"); + ESP_LOGI(TAG, "task1启动!"); + + uint32_t ulNotifiedValue; + + while (1) + { + ESP_LOGI(TAG, "task1: 等待task通知"); + xTaskNotifyWait(0x00, ULONG_MAX, &ulNotifiedValue, portMAX_DELAY); + // 通过不同的bit位来判断通知的来源 + if ((ulNotifiedValue & 0x01) != 0) + { + ESP_LOGI(TAG, "task1: 收到task通知-bit0"); + } + if ((ulNotifiedValue & 0x02) != 0) + { + ESP_LOGI(TAG, "task1: 收到task通知-bit1"); + } + if ((ulNotifiedValue & 0x04) != 0) + { + ESP_LOGI(TAG, "task1: 收到task通知-bit2"); + } + } +} + +void task2(void *pvParameters) +{ + ESP_LOGI(TAG, "-------------------------------"); + ESP_LOGI(TAG, "task2启动!"); + + while (1) + { + vTaskDelay(pdMS_TO_TICKS(5000)); + ESP_LOGI(TAG, "task2: 发送task通知-bit0"); + xTaskNotify(xTask1, 0x01, eSetValueWithOverwrite); + + vTaskDelay(pdMS_TO_TICKS(5000)); + ESP_LOGI(TAG, "task2: 发送task通知-bit1"); + xTaskNotify(xTask1, 0x02, eSetValueWithOverwrite); + + vTaskDelay(pdMS_TO_TICKS(5000)); + ESP_LOGI(TAG, "task2: 发送task通知-bit2"); + xTaskNotify(xTask1, 0x04, eSetValueWithOverwrite); + + } +} + +void app_main(void) +{ + + xTaskCreate(task1, "task1", 1024 * 4, NULL, 1, &xTask1); + xTaskCreate(task2, "task2", 1024 * 4, NULL, 1, &xTask2); +} diff --git a/code/05.freertos_advanced/task_notify/任务通知值/sdkconfig.defaults b/code/05.freertos_advanced/task_notify/任务通知值/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/task_notify/任务通知值/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.freertos_advanced/task_notify/直接任务通知/CMakeLists.txt b/code/05.freertos_advanced/task_notify/直接任务通知/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.freertos_advanced/task_notify/直接任务通知/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.freertos_advanced/task_notify/直接任务通知/main/CMakeLists.txt b/code/05.freertos_advanced/task_notify/直接任务通知/main/CMakeLists.txt new file mode 100644 index 0000000..f3e5917 --- /dev/null +++ b/code/05.freertos_advanced/task_notify/直接任务通知/main/CMakeLists.txt @@ -0,0 +1,4 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") + +# target_compile_options(${COMPONENT_LIB} PRIVATE "-Wno-format") diff --git a/code/05.freertos_advanced/task_notify/直接任务通知/main/main.c b/code/05.freertos_advanced/task_notify/直接任务通知/main/main.c new file mode 100644 index 0000000..91e8c78 --- /dev/null +++ b/code/05.freertos_advanced/task_notify/直接任务通知/main/main.c @@ -0,0 +1,44 @@ +// 事件组 +#include +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +static const char *TAG = "main"; + +static TaskHandle_t xTask1 = NULL, xTask2 = NULL; + +void task1(void *pvParameters) +{ + ESP_LOGI(TAG, "-------------------------------"); + ESP_LOGI(TAG, "task1启动!"); + + while (1) + { + ESP_LOGI(TAG, "task1: 等待task通知"); + ulTaskNotifyTake(pdTRUE, portMAX_DELAY); + + ESP_LOGI(TAG, "task1: 收到task通知"); + vTaskDelay(pdMS_TO_TICKS(3000)); + } +} + +void task2(void *pvParameters) +{ + ESP_LOGI(TAG, "-------------------------------"); + ESP_LOGI(TAG, "task2启动!"); + + while (1) + { + vTaskDelay(pdMS_TO_TICKS(5000)); + ESP_LOGI(TAG, "task2: 发送task通知"); + xTaskNotifyGive(xTask1); + } +} + +void app_main(void) +{ + + xTaskCreate(task1, "task1", 1024 * 2, NULL, 1, &xTask1); + xTaskCreate(task2, "task2", 1024 * 2, NULL, 1, &xTask2); +} diff --git a/code/05.freertos_advanced/task_notify/直接任务通知/sdkconfig.defaults b/code/05.freertos_advanced/task_notify/直接任务通知/sdkconfig.defaults new file mode 100644 index 0000000..cb398a7 --- /dev/null +++ b/code/05.freertos_advanced/task_notify/直接任务通知/sdkconfig.defaults @@ -0,0 +1,7 @@ +# This file was generated using idf.py save-defconfig. It can be edited manually. +# Espressif IoT Development Framework (ESP-IDF) 5.3.2 Project Minimal Configuration +# +CONFIG_IDF_TARGET="esp32s3" +CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_FREERTOS_USE_TRACE_FACILITY=y +CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y diff --git a/code/05.wifi/espnow/recv/.gitignore b/code/05.wifi/espnow/recv/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/espnow/recv/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/espnow/recv/CMakeLists.txt b/code/05.wifi/espnow/recv/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/espnow/recv/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/espnow/recv/main/CMakeLists.txt b/code/05.wifi/espnow/recv/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/espnow/recv/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/espnow/recv/main/main.c b/code/05.wifi/espnow/recv/main/main.c new file mode 100644 index 0000000..8573046 --- /dev/null +++ b/code/05.wifi/espnow/recv/main/main.c @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "freertos/timers.h" +#include "nvs_flash.h" +#include "esp_random.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_mac.h" +#include "esp_now.h" +#include "esp_crc.h" + +// 接收方地址 +// static uint8_t s_broadcast_mac[ESP_NOW_ETH_ALEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; +static uint8_t s_broadcast_mac[ESP_NOW_ETH_ALEN] = {0x24, 0xdc, 0xc3, 0x9c, 0xeb, 0x18}; + +static const char *TAG = "espnow"; + +/* WiFi should start before using ESPNOW */ +static void wifi_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_start()); +} + +// ESPNOW接收回调函数 +static void example_espnow_recv_cb(const esp_now_recv_info_t *recv_info, const uint8_t *data, int len) +{ + ESP_LOGI(TAG, "Receive data from: " MACSTR ", len: %d", MAC2STR(recv_info->src_addr), len); + ESP_LOGI(TAG, "Data: %s", data); +} + +// ESPNOW接受数据任务 +static void espnow_task(void *pvParameter) +{ + ESP_LOGI(TAG, "Start receiving data"); + while (1) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + } +} + +static esp_err_t espnow_init(void) +{ + + /* Initialize ESPNOW and register sending and receiving callback function. */ + ESP_ERROR_CHECK(esp_now_init()); + // 注册接受回调函数 + //ESP_ERROR_CHECK(esp_now_register_send_cb(example_espnow_send_cb)); + ESP_ERROR_CHECK(esp_now_register_recv_cb(example_espnow_recv_cb)); + + xTaskCreate(espnow_task, "espnow_task", 2048, NULL, 4, NULL); + + return ESP_OK; +} + +void app_main(void) +{ + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // Initialize WiFi + wifi_init(); + + // Initialize ESPNOW + espnow_init(); +} diff --git a/code/05.wifi/espnow/send/.gitignore b/code/05.wifi/espnow/send/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/espnow/send/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/espnow/send/CMakeLists.txt b/code/05.wifi/espnow/send/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/espnow/send/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/espnow/send/main/CMakeLists.txt b/code/05.wifi/espnow/send/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/espnow/send/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/espnow/send/main/main.c b/code/05.wifi/espnow/send/main/main.c new file mode 100644 index 0000000..d12bae1 --- /dev/null +++ b/code/05.wifi/espnow/send/main/main.c @@ -0,0 +1,113 @@ +#include +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "freertos/timers.h" +#include "nvs_flash.h" +#include "esp_random.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_mac.h" +#include "esp_now.h" +#include "esp_crc.h" + +// 接收方地址 +//static uint8_t s_broadcast_mac[ESP_NOW_ETH_ALEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; +static uint8_t s_broadcast_mac[ESP_NOW_ETH_ALEN] = {0x24, 0xdc, 0xc3, 0x9c, 0xeb, 0x18}; + +static const char *TAG = "espnow"; + +/* WiFi should start before using ESPNOW */ +static void wifi_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + ESP_ERROR_CHECK(esp_event_loop_create_default()); + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM)); + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_start()); + +} + +static void example_espnow_send_cb(const uint8_t *mac_addr, esp_now_send_status_t status) +{ + if (status != ESP_NOW_SEND_SUCCESS) + { + ESP_LOGE(TAG, "Send error"); + } + else + { + ESP_LOGI(TAG, "Send success"); + } +} + +// ESPNOW发送任务 +static void espnow_task(void *pvParameter) +{ + char send_msg[] = "ESPNOW test!"; + ESP_LOGI(TAG, "Start sending broadcast data"); + while (1) + { + // 发送数据 + if (esp_now_send(s_broadcast_mac, (uint8_t *)send_msg, sizeof(send_msg)) != ESP_OK) + { + ESP_LOGE(TAG, "Send error"); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } +} + +static esp_err_t espnow_init(void) +{ + + /* Initialize ESPNOW and register sending and receiving callback function. */ + ESP_ERROR_CHECK(esp_now_init()); + // 注册发送回调函数 + ESP_ERROR_CHECK(esp_now_register_send_cb(example_espnow_send_cb)); + //ESP_ERROR_CHECK(esp_now_register_recv_cb(example_espnow_recv_cb)); + + // 将广播对等方信息添加到对等方列表 + esp_now_peer_info_t *peer = malloc(sizeof(esp_now_peer_info_t)); + if (peer == NULL) + { + ESP_LOGE(TAG, "Malloc peer information fail"); + esp_now_deinit(); + return ESP_FAIL; + } + // 初始化对等方信息 + memset(peer, 0, sizeof(esp_now_peer_info_t)); + peer->channel = 1; + peer->ifidx = ESP_IF_WIFI_STA; + peer->encrypt = false; + memcpy(peer->peer_addr, s_broadcast_mac, ESP_NOW_ETH_ALEN); + // 添加对等方 + ESP_ERROR_CHECK(esp_now_add_peer(peer)); + free(peer); + + xTaskCreate(espnow_task, "espnow_task", 2048, NULL, 4, NULL); + + return ESP_OK; +} + +void app_main(void) +{ + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // Initialize WiFi + wifi_init(); + + // Initialize ESPNOW + espnow_init(); +} diff --git a/code/05.wifi/http/http_client/.gitignore b/code/05.wifi/http/http_client/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/http/http_client/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/http/http_client/CMakeLists.txt b/code/05.wifi/http/http_client/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/http/http_client/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/http/http_client/main/CMakeLists.txt b/code/05.wifi/http/http_client/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/http/http_client/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/http/http_client/main/main.c b/code/05.wifi/http/http_client/main/main.c new file mode 100644 index 0000000..ce7ecee --- /dev/null +++ b/code/05.wifi/http/http_client/main/main.c @@ -0,0 +1,200 @@ +#include +#include +#include +#include +#include "esp_log.h" +#include "nvs_flash.h" +#include "esp_event.h" +#include "esp_netif.h" +#include "esp_tls.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_system.h" +#include "esp_wifi.h" +#include "esp_mac.h" +#include +#include "esp_http_client.h" + +// 要连接的WIFI +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" +static const char *TAG = "main"; + +// 最大http输出缓冲区 +#define MAX_HTTP_OUTPUT_BUFFER 2048 + +// WIFI事件回调 +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +// 连接WIFI +static void wifi_sta_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} + + +// HTTP事件回调 +esp_err_t _http_event_handler(esp_http_client_event_t *evt) +{ + switch (evt->event_id) + { + case HTTP_EVENT_ERROR: // 错误事件 + ESP_LOGI(TAG, "HTTP_EVENT_ERROR"); + break; + case HTTP_EVENT_ON_CONNECTED: // 连接成功事件 + ESP_LOGI(TAG, "HTTP_EVENT_ON_CONNECTED"); + break; + case HTTP_EVENT_HEADER_SENT: // 发送头事件 + ESP_LOGI(TAG, "HTTP_EVENT_HEADER_SENT"); + break; + case HTTP_EVENT_ON_HEADER: // 接收头事件 + ESP_LOGI(TAG, "HTTP_EVENT_ON_HEADER"); + printf("%.*s", evt->data_len, (char *)evt->data); + break; + case HTTP_EVENT_ON_DATA: // 接收数据事件 + ESP_LOGI(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len); + if (!esp_http_client_is_chunked_response(evt->client)) + { + printf("%.*s", evt->data_len, (char *)evt->data); + } + break; + case HTTP_EVENT_ON_FINISH: // 会话完成事件 + ESP_LOGI(TAG, "HTTP_EVENT_ON_FINISH"); + break; + case HTTP_EVENT_DISCONNECTED: // 断开事件 + ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED"); + break; + case HTTP_EVENT_REDIRECT: + ESP_LOGD(TAG, "HTTP_EVENT_REDIRECT"); + } + return ESP_OK; +} + + +// HTTP客户端任务 +static void http_client_task(void) +{ + // 等待wifi连接成功(暂时这样处理) + vTaskDelay(5000 / portTICK_PERIOD_MS); + ESP_LOGI("http_client_task", "http_client_task start"); + + // 初始化HTTP客户端 + char local_response_buffer[MAX_HTTP_OUTPUT_BUFFER + 1] = {0}; + + // 配置HTTP客户端目标 + esp_http_client_config_t config = { + //.method = HTTP_METHOD_GET, // get请求 + .url = "http://www.duruofu.top", // 请求url + .event_handler = _http_event_handler, // 事件回调 + .user_data = local_response_buffer, // Pass address of local buffer to get response + }; + esp_http_client_handle_t client = esp_http_client_init(&config); + + // GET + esp_http_client_set_method(client, HTTP_METHOD_GET); + esp_err_t err = esp_http_client_perform(client); + if (err == ESP_OK) + { + ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %" PRId64, + esp_http_client_get_status_code(client), + esp_http_client_get_content_length(client)); + } + else + { + ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err)); + } + ESP_LOG_BUFFER_HEX(TAG, local_response_buffer, strlen(local_response_buffer)); + + esp_http_client_cleanup(client); + + vTaskDelete(NULL); +} + +void app_main(void) +{ + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // 创建默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // 配置启动WIFI + wifi_sta_init(); + + // 创建HTTP客户端任务 + xTaskCreate(http_client_task, "http_client_task", 1024*8, NULL, 5, NULL); +} diff --git a/code/05.wifi/http/http_server/.gitignore b/code/05.wifi/http/http_server/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/http/http_server/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/http/http_server/CMakeLists.txt b/code/05.wifi/http/http_server/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/http/http_server/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/http/http_server/main/CMakeLists.txt b/code/05.wifi/http/http_server/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/http/http_server/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/http/http_server/main/main.c b/code/05.wifi/http/http_server/main/main.c new file mode 100644 index 0000000..d932059 --- /dev/null +++ b/code/05.wifi/http/http_server/main/main.c @@ -0,0 +1,440 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" +#include +#include "esp_tls_crypto.h" +#include +#include "esp_tls.h" +#include "esp_check.h" +#include +#include +#include +#include +#include +#include +#include "esp_netif.h" +#include "esp_tls_crypto.h" +#include +#include "esp_event.h" +#include "esp_netif.h" +#include "esp_tls.h" +#include "esp_check.h" + +// 要连接的WIFI +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +static const char *TAG = "main"; + +#define EXAMPLE_HTTP_QUERY_KEY_MAX_LEN (64) + +char form_html[] = R"( + + + +ESP32 Web Server + + +

ESP32 Web Server

+
+
+
+
+

+ +
+ +)"; + +// WIFI回调 +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +// wifi初始化 +static void wifi_sta_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} + + +/*路由处理程序*/ + +/* An HTTP GET handler */ +static esp_err_t hello_get_handler(httpd_req_t *req) +{ + char *buf; + size_t buf_len; + + /* Get header value string length and allocate memory for length + 1, + * extra byte for null termination */ + buf_len = httpd_req_get_hdr_value_len(req, "Host") + 1; + if (buf_len > 1) + { + buf = malloc(buf_len); + ESP_RETURN_ON_FALSE(buf, ESP_ERR_NO_MEM, TAG, "buffer alloc failed"); + /* Copy null terminated value string into buffer */ + if (httpd_req_get_hdr_value_str(req, "Host", buf, buf_len) == ESP_OK) + { + ESP_LOGI(TAG, "Found header => Host: %s", buf); + } + free(buf); + } + + buf_len = httpd_req_get_hdr_value_len(req, "Test-Header-2") + 1; + if (buf_len > 1) + { + buf = malloc(buf_len); + ESP_RETURN_ON_FALSE(buf, ESP_ERR_NO_MEM, TAG, "buffer alloc failed"); + if (httpd_req_get_hdr_value_str(req, "Test-Header-2", buf, buf_len) == ESP_OK) + { + ESP_LOGI(TAG, "Found header => Test-Header-2: %s", buf); + } + free(buf); + } + + buf_len = httpd_req_get_hdr_value_len(req, "Test-Header-1") + 1; + if (buf_len > 1) + { + buf = malloc(buf_len); + ESP_RETURN_ON_FALSE(buf, ESP_ERR_NO_MEM, TAG, "buffer alloc failed"); + if (httpd_req_get_hdr_value_str(req, "Test-Header-1", buf, buf_len) == ESP_OK) + { + ESP_LOGI(TAG, "Found header => Test-Header-1: %s", buf); + } + free(buf); + } + + /* Read URL query string length and allocate memory for length + 1, + * extra byte for null termination */ + buf_len = httpd_req_get_url_query_len(req) + 1; + if (buf_len > 1) + { + buf = malloc(buf_len); + ESP_RETURN_ON_FALSE(buf, ESP_ERR_NO_MEM, TAG, "buffer alloc failed"); + if (httpd_req_get_url_query_str(req, buf, buf_len) == ESP_OK) + { + ESP_LOGI(TAG, "Found URL query => %s", buf); + char param[EXAMPLE_HTTP_QUERY_KEY_MAX_LEN], dec_param[EXAMPLE_HTTP_QUERY_KEY_MAX_LEN] = {0}; + /* Get value of expected key from query string */ + if (httpd_query_key_value(buf, "query1", param, sizeof(param)) == ESP_OK) + { + ESP_LOGI(TAG, "Found URL query parameter => query1=%s", param); + //example_uri_decode(dec_param, param, strnlen(param, EXAMPLE_HTTP_QUERY_KEY_MAX_LEN)); + ESP_LOGI(TAG, "Decoded query parameter => %s", dec_param); + } + if (httpd_query_key_value(buf, "query2", param, sizeof(param)) == ESP_OK) + { + ESP_LOGI(TAG, "Found URL query parameter => query2=%s", param); + //example_uri_decode(dec_param, param, strnlen(param, EXAMPLE_HTTP_QUERY_KEY_MAX_LEN)); + ESP_LOGI(TAG, "Decoded query parameter => %s", dec_param); + } + if (httpd_query_key_value(buf, "query3", param, sizeof(param)) == ESP_OK) + { + ESP_LOGI(TAG, "Found URL query parameter => query3=%s", param); + //example_uri_decode(dec_param, param, strnlen(param, EXAMPLE_HTTP_QUERY_KEY_MAX_LEN)); + ESP_LOGI(TAG, "Decoded query parameter => %s", dec_param); + } + } + free(buf); + } + + /* Set some custom headers */ + httpd_resp_set_hdr(req, "Custom-Header-1", "Custom-Value-1"); + httpd_resp_set_hdr(req, "Custom-Header-2", "Custom-Value-2"); + + /* Send response with custom headers and body set as the + * string passed in user context*/ + const char *resp_str = (const char *)req->user_ctx; + httpd_resp_send(req, resp_str, HTTPD_RESP_USE_STRLEN); + + /* After sending the HTTP response the old HTTP request + * headers are lost. Check if HTTP request headers can be read now. */ + if (httpd_req_get_hdr_value_len(req, "Host") == 0) + { + ESP_LOGI(TAG, "Request headers lost"); + } + return ESP_OK; +} + +static esp_err_t html_get_handler(httpd_req_t *req) +{ + // 指向 HTML 页面字符串的指针 + const char *html_content = form_html; + + // 设置 Content-Type 头 + httpd_resp_set_type(req, "text/html"); + + // 发送 HTML 页面作为 HTTP 响应的正文部分 + httpd_resp_send(req, html_content, strlen(html_content)); + + return ESP_OK; +} + +/* An HTTP POST handler */ +static esp_err_t echo_post_handler(httpd_req_t *req) +{ + /* 定义 HTTP POST 请求数据的目标缓存区 + * httpd_req_recv() 只接收 char* 数据,但也可以是 + * 任意二进制数据(需要类型转换) + * 对于字符串数据,null 终止符会被省略, + * content_len 会给出字符串的长度 */ + char buf[100]; + int ret, remaining = req->content_len; + + while (remaining > 0) + { + /* Read the data for the request */ + if ((ret = httpd_req_recv(req, buf, + MIN(remaining, sizeof(buf)))) <= 0) + { + if (ret == HTTPD_SOCK_ERR_TIMEOUT) + { + /* Retry receiving if timeout occurred */ + continue; + } + /* 如果发生了错误,返回 ESP_FAIL 可以确保 + * 底层套接字被关闭 */ + return ESP_FAIL; + } + + /* Send back the same data */ + httpd_resp_send_chunk(req, buf, ret); + remaining -= ret; + + /* Log data received */ + ESP_LOGI(TAG, "=========== RECEIVED DATA =========="); + ESP_LOGI(TAG, "%.*s", ret, buf); + ESP_LOGI(TAG, "===================================="); + } + + // End response + httpd_resp_send_chunk(req, NULL, 0); + return ESP_OK; +} + +/* 注册路由 */ +const httpd_uri_t hello = { + .uri = "/hello", + .method = HTTP_GET, + .handler = hello_get_handler, + .user_ctx = "Hello World!"}; + +const httpd_uri_t html = { + .uri = "/html", + .method = HTTP_GET, + .handler = html_get_handler, + .user_ctx = NULL}; + +const httpd_uri_t echo = { + .uri = "/echo", + .method = HTTP_POST, + .handler = echo_post_handler, + .user_ctx = NULL}; + + +/* This handler allows the custom error handling functionality to be + * tested from client side. For that, when a PUT request 0 is sent to + * URI /ctrl, the /hello and /echo URIs are unregistered and following + * custom error handler http_404_error_handler() is registered. + * Afterwards, when /hello or /echo is requested, this custom error + * handler is invoked which, after sending an error message to client, + * either closes the underlying socket (when requested URI is /echo) + * or keeps it open (when requested URI is /hello). This allows the + * client to infer if the custom error handler is functioning as expected + * by observing the socket state. + */ +esp_err_t http_404_error_handler(httpd_req_t *req, httpd_err_code_t err) +{ + if (strcmp("/hello", req->uri) == 0) + { + httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "/hello URI is not available"); + /* Return ESP_OK to keep underlying socket open */ + return ESP_OK; + } + else if (strcmp("/echo", req->uri) == 0) + { + httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "/echo URI is not available"); + /* Return ESP_FAIL to close underlying socket */ + return ESP_FAIL; + } + /* For any other URI send 404 and close socket */ + httpd_resp_send_err(req, HTTPD_404_NOT_FOUND, "Some 404 error message"); + return ESP_FAIL; +} + +/* An HTTP PUT handler. This demonstrates realtime + * registration and deregistration of URI handlers + */ +esp_err_t ctrl_put_handler(httpd_req_t *req) +{ + char buf; + int ret; + + if ((ret = httpd_req_recv(req, &buf, 1)) <= 0) + { + if (ret == HTTPD_SOCK_ERR_TIMEOUT) + { + httpd_resp_send_408(req); + } + return ESP_FAIL; + } + + if (buf == '0') + { + /* URI handlers can be unregistered using the uri string */ + ESP_LOGI(TAG, "Unregistering /hello and /echo URIs"); + httpd_unregister_uri(req->handle, "/hello"); + httpd_unregister_uri(req->handle, "/echo"); + /* Register the custom error handler */ + httpd_register_err_handler(req->handle, HTTPD_404_NOT_FOUND, http_404_error_handler); + } + else + { + ESP_LOGI(TAG, "Registering /hello and /echo URIs"); + httpd_register_uri_handler(req->handle, &hello); + httpd_register_uri_handler(req->handle, &echo); + /* Unregister custom error handler */ + httpd_register_err_handler(req->handle, HTTPD_404_NOT_FOUND, NULL); + } + + /* Respond with empty body */ + httpd_resp_send(req, NULL, 0); + return ESP_OK; +} + + +static const httpd_uri_t ctrl = { + .uri = "/ctrl", + .method = HTTP_PUT, + .handler = ctrl_put_handler, + .user_ctx = NULL}; + +/* 启动 Web 服务器的函数 */ +httpd_handle_t start_webserver(void) +{ + /* 生成默认的配置参数 */ + httpd_config_t config = HTTPD_DEFAULT_CONFIG(); + + /* 置空 esp_http_server 的实例句柄 */ + httpd_handle_t server = NULL; + + ESP_LOGI(TAG, "Starting server on port: '%d'", config.server_port); + /* 启动 httpd server */ + if (httpd_start(&server, &config) == ESP_OK) + { + /* 注册 URI 处理程序 */ + ESP_LOGI(TAG, "Registering URI handlers"); + httpd_register_uri_handler(server, &hello); + httpd_register_uri_handler(server, &html); + httpd_register_uri_handler(server, &echo); + httpd_register_uri_handler(server, &ctrl); + } + /* 如果服务器启动失败,返回的句柄是 NULL */ + return server; +} + + +void app_main(void) +{ + static httpd_handle_t server = NULL; + + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // 创建默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // 配置启动WIFI + wifi_sta_init(); + + vTaskDelay(3000 / portTICK_PERIOD_MS); + + /* Start the server for the first time */ + server = start_webserver(); + + while (server) + { + sleep(5); + } +} diff --git a/code/05.wifi/mqtt/mqtt_tcp/.gitignore b/code/05.wifi/mqtt/mqtt_tcp/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/mqtt/mqtt_tcp/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/mqtt/mqtt_tcp/CMakeLists.txt b/code/05.wifi/mqtt/mqtt_tcp/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/mqtt/mqtt_tcp/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/mqtt/mqtt_tcp/main/CMakeLists.txt b/code/05.wifi/mqtt/mqtt_tcp/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/mqtt/mqtt_tcp/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/mqtt/mqtt_tcp/main/main.c b/code/05.wifi/mqtt/mqtt_tcp/main/main.c new file mode 100644 index 0000000..c989d92 --- /dev/null +++ b/code/05.wifi/mqtt/mqtt_tcp/main/main.c @@ -0,0 +1,228 @@ +#include +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" +#include +#include "esp_eth.h" +#include "lwip/sockets.h" +#include "lwip/dns.h" +#include "lwip/netdb.h" +#include "mqtt_client.h" + + +// 要连接的WIFI +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +static const char *TAG = "main"; + + + +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +// wifi初始化 +static void wifi_sta_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} + +static void log_error_if_nonzero(const char *message, int error_code) +{ + if (error_code != 0) + { + ESP_LOGE(TAG, "Last error %s: 0x%x", message, error_code); + } +} + + +// MQTT客户端事件处理 +/* + * @brief Event handler registered to receive MQTT events + * + * This function is called by the MQTT client event loop. + * + * @param handler_args user data registered to the event. + * @param base Event base for the handler(always MQTT Base in this example). + * @param event_id The id for the received event. + * @param event_data The data for the event, esp_mqtt_event_handle_t. + */ +static void mqtt_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + ESP_LOGD(TAG, "Event dispatched from event loop base=%s, event_id=%" PRIi32 "", base, event_id); + esp_mqtt_event_handle_t event = event_data; + esp_mqtt_client_handle_t client = event->client; + int msg_id; + switch ((esp_mqtt_event_id_t)event_id) + { + // MQTT连接成功 + case MQTT_EVENT_CONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_CONNECTED"); + // 发布消息 + msg_id = esp_mqtt_client_publish(client, "/topic/qos1", "data_3", 0, 1, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + // 订阅消息 + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos0", 0); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + msg_id = esp_mqtt_client_subscribe(client, "/topic/qos1", 1); + ESP_LOGI(TAG, "sent subscribe successful, msg_id=%d", msg_id); + // 取消订阅消息 + msg_id = esp_mqtt_client_unsubscribe(client, "/topic/qos1"); + ESP_LOGI(TAG, "sent unsubscribe successful, msg_id=%d", msg_id); + break; + // MQTT连接断开 + case MQTT_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "MQTT_EVENT_DISCONNECTED"); + break; + // MQTT订阅成功 + case MQTT_EVENT_SUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_SUBSCRIBED, msg_id=%d", event->msg_id); + // 发布消息 + msg_id = esp_mqtt_client_publish(client, "/topic/qos0", "data", 0, 0, 0); + ESP_LOGI(TAG, "sent publish successful, msg_id=%d", msg_id); + break; + // MQTT取消订阅成功 + case MQTT_EVENT_UNSUBSCRIBED: + ESP_LOGI(TAG, "MQTT_EVENT_UNSUBSCRIBED, msg_id=%d", event->msg_id); + break; + // MQTT发布成功 + case MQTT_EVENT_PUBLISHED: + ESP_LOGI(TAG, "MQTT_EVENT_PUBLISHED, msg_id=%d", event->msg_id); + break; + // MQTT收到数据 + case MQTT_EVENT_DATA: + ESP_LOGI(TAG, "MQTT_EVENT_DATA"); + printf("TOPIC=%.*s\r\n", event->topic_len, event->topic); + printf("DATA=%.*s\r\n", event->data_len, event->data); + break; + // MQTT错误 + case MQTT_EVENT_ERROR: + ESP_LOGI(TAG, "MQTT_EVENT_ERROR"); + if (event->error_handle->error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) + { + log_error_if_nonzero("reported from esp-tls", event->error_handle->esp_tls_last_esp_err); + log_error_if_nonzero("reported from tls stack", event->error_handle->esp_tls_stack_err); + log_error_if_nonzero("captured as transport's socket errno", event->error_handle->esp_transport_sock_errno); + ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->error_handle->esp_transport_sock_errno)); + } + break; + default: + ESP_LOGI(TAG, "Other event id:%d", event->event_id); + break; + } +} + +// MQTT客户端 +static void mqtt_app_start(void) +{ + esp_mqtt_client_config_t mqtt_cfg = { + .broker.address.uri = "mqtt://www.duruofu.top:1883", + }; + + esp_mqtt_client_handle_t client = esp_mqtt_client_init(&mqtt_cfg); + /* The last argument may be used to pass data to the event handler, in this example mqtt_event_handler */ + // 注册事件处理函数 + esp_mqtt_client_register_event(client, ESP_EVENT_ANY_ID, mqtt_event_handler, NULL); + // 启动MQTT客户端 + esp_mqtt_client_start(client); +} + +void app_main(void) +{ + + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // 创建默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // 配置启动WIFI + wifi_sta_init(); + + // 等待wifi连接成功(暂时这样处理) + vTaskDelay(5000 / portTICK_PERIOD_MS); + + // 创建MQTT客户端 + mqtt_app_start(); +} diff --git a/code/05.wifi/mqtt/mqtt_ws/.gitignore b/code/05.wifi/mqtt/mqtt_ws/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/mqtt/mqtt_ws/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/mqtt/mqtt_ws/CMakeLists.txt b/code/05.wifi/mqtt/mqtt_ws/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/mqtt/mqtt_ws/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/mqtt/mqtt_ws/main/CMakeLists.txt b/code/05.wifi/mqtt/mqtt_ws/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/mqtt/mqtt_ws/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/mqtt/mqtt_ws/main/main.c b/code/05.wifi/mqtt/mqtt_ws/main/main.c new file mode 100644 index 0000000..7b66f33 --- /dev/null +++ b/code/05.wifi/mqtt/mqtt_ws/main/main.c @@ -0,0 +1,6 @@ +#include + +void app_main(void) +{ + +} diff --git a/code/05.wifi/sntp/.gitignore b/code/05.wifi/sntp/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/sntp/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/sntp/CMakeLists.txt b/code/05.wifi/sntp/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/sntp/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/sntp/main/CMakeLists.txt b/code/05.wifi/sntp/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/sntp/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/sntp/main/main.c b/code/05.wifi/sntp/main/main.c new file mode 100644 index 0000000..fe472d7 --- /dev/null +++ b/code/05.wifi/sntp/main/main.c @@ -0,0 +1,188 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" +#include +#include "esp_netif_sntp.h" +#include "lwip/ip_addr.h" +#include "esp_sntp.h" + +// 要连接的WIFI +#define ESP_WIFI_STA_SSID "duruofu" +#define ESP_WIFI_STA_PASSWD "1234567890" + + +static const char *TAG = "main"; + +void time_sync_notification_cb(struct timeval *tv) +{ + ESP_LOGI(TAG, "Notification of a time synchronization event"); +} + +static void print_servers(void) +{ + ESP_LOGI(TAG, "List of configured NTP servers:"); + + for (uint8_t i = 0; i < SNTP_MAX_SERVERS; ++i) + { + if (esp_sntp_getservername(i)) + { + ESP_LOGI(TAG, "server %d: %s", i, esp_sntp_getservername(i)); + } + else + { + // we have either IPv4 or IPv6 address, let's print it + char buff[INET6_ADDRSTRLEN]; + ip_addr_t const *ip = esp_sntp_getserver(i); + if (ipaddr_ntoa_r(ip, buff, INET6_ADDRSTRLEN) != NULL) + ESP_LOGI(TAG, "server %d: %s", i, buff); + } + } +} + +static void obtain_time(void) +{ + // Set timezone to Beijing time + setenv("TZ", "CST-8", 1); // CST-8 represents China Standard Time (UTC+8) + tzset(); + + ESP_LOGI(TAG, "Initializing SNTP"); + esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG("cn.pool.ntp.org"); + config.sync_cb = time_sync_notification_cb; + config.renew_servers_after_new_IP = true, + + // Initialize SNTP with the provided configuration + esp_netif_sntp_init(&config); + + // Start SNTP + esp_netif_sntp_start(); + + ESP_LOGI(TAG, "Initializing and starting SNTP"); + + print_servers(); + + // wait for time to be set + time_t now = 0; + struct tm timeinfo = {0}; + int retry = 0; + const int retry_count = 15; + while (esp_netif_sntp_sync_wait(2000 / portTICK_PERIOD_MS) == ESP_ERR_TIMEOUT && ++retry < retry_count) + { + ESP_LOGI(TAG, "Waiting for system time to be set... (%d/%d)", retry, retry_count); + } + time(&now); + localtime_r(&now, &timeinfo); + + + + // Print current time + char strftime_buf[64]; + strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); + ESP_LOGI(TAG, "Current time: %s", strftime_buf); +} + + +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + // 更新时间 + obtain_time(); + } +} + +// wifi初始化 +static void wifi_sta_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} + + +void app_main(void) +{ + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // 创建默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // 配置启动WIFI + wifi_sta_init(); + + +} diff --git a/code/05.wifi/tcp/wifi_tcp_client/.gitignore b/code/05.wifi/tcp/wifi_tcp_client/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/tcp/wifi_tcp_client/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/tcp/wifi_tcp_client/CMakeLists.txt b/code/05.wifi/tcp/wifi_tcp_client/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/tcp/wifi_tcp_client/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/tcp/wifi_tcp_client/main/CMakeLists.txt b/code/05.wifi/tcp/wifi_tcp_client/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/tcp/wifi_tcp_client/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/tcp/wifi_tcp_client/main/main.c b/code/05.wifi/tcp/wifi_tcp_client/main/main.c new file mode 100644 index 0000000..f9e6026 --- /dev/null +++ b/code/05.wifi/tcp/wifi_tcp_client/main/main.c @@ -0,0 +1,185 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" +#include + +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" +#define TCP_SREVER_ADDR "192.168.137.1" +#define TCP_SREVER_PORT 8080 + +static const char *TAG = "main"; + +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +static void tcp_client_task(void *pvParameters) +{ + + + // 等待wifi连接成功(暂时这样处理) + vTaskDelay(5000 / portTICK_PERIOD_MS); + + ESP_LOGI("tcp_client_task", "tcp_client_task start"); + + // 创建socket + int sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock < 0) // 创建失败返回-1 + { + ESP_LOGE(TAG, "Unable to create socket: errno %d", errno); + return; + } + + // 设置服务器(IPV4) + struct sockaddr_in server_config; + server_config.sin_addr.s_addr = inet_addr(TCP_SREVER_ADDR); + server_config.sin_family = AF_INET; + server_config.sin_port = htons(TCP_SREVER_PORT); // 宏htons 用于将主机的无符号短整型数据转换成网络字节顺序(小端转大端) + + // 连接服务器 + int err = connect(sock, (struct sockaddr *)&server_config, sizeof(server_config)); + if (err != 0) + { + ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno); + return; + } + + // 发送数据 + const char *data = "Hello World!"; + int len = send(sock, data, strlen(data), 0); + if (len < 0) + { + ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno); + return; + } + + char rx_buffer[1024]; + // 接收数据,并发回 + while(1) + { + int len = recv(sock, rx_buffer, sizeof(rx_buffer), 0); + // Error occurred during receiving + if (len < 0) + { + ESP_LOGE(TAG, "recv failed: errno %d", errno); + break; + } + // Data received + else + { + ESP_LOGI(TAG, "Received %d bytes from %s:", len, TCP_SREVER_ADDR); + ESP_LOGI(TAG, "%.*s", len, rx_buffer); + + // 发送数据 + int len_end = send(sock, rx_buffer, len, 0); + if (len_end < 0) + { + ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno); + break; + } + } + } + + vTaskDelete(NULL); +} + +// wifi初始化 +static void wifi_sta_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} + +void app_main(void) +{ + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // 创建默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // 配置启动WIFI + wifi_sta_init(); + + // 创建TCP客户端任务 + xTaskCreate(tcp_client_task, "tcp_client_task", 4096, NULL, 5, NULL); +} diff --git a/code/05.wifi/tcp/wifi_tcp_server/.gitignore b/code/05.wifi/tcp/wifi_tcp_server/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/tcp/wifi_tcp_server/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/tcp/wifi_tcp_server/CMakeLists.txt b/code/05.wifi/tcp/wifi_tcp_server/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/tcp/wifi_tcp_server/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/tcp/wifi_tcp_server/main/CMakeLists.txt b/code/05.wifi/tcp/wifi_tcp_server/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/tcp/wifi_tcp_server/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/tcp/wifi_tcp_server/main/main.c b/code/05.wifi/tcp/wifi_tcp_server/main/main.c new file mode 100644 index 0000000..d1aab81 --- /dev/null +++ b/code/05.wifi/tcp/wifi_tcp_server/main/main.c @@ -0,0 +1,240 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" +#include + +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +#define TCP_SREVER_PORT 8080 + +static const char *TAG = "main"; + +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +// 数据接收与回传 +static void do_retransmit(const int sock) +{ + int len; + char rx_buffer[128]; + + do + { + len = recv(sock, rx_buffer, sizeof(rx_buffer) - 1, 0); + if (len < 0) + { + ESP_LOGE(TAG, "Error occurred during receiving: errno %d", errno); + } + else if (len == 0) + { + ESP_LOGW(TAG, "Connection closed"); + } + else + { + rx_buffer[len] = 0; // Null-terminate whatever is received and treat it like a string + ESP_LOGI(TAG, "Received %d bytes: %s", len, rx_buffer); + + // send() can return less bytes than supplied length. + // Walk-around for robust implementation. + int to_write = len; + while (to_write > 0) + { + int written = send(sock, rx_buffer + (len - to_write), to_write, 0); + if (written < 0) + { + ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno); + // Failed to retransmit, giving up + return; + } + to_write -= written; + } + } + } while (len > 0); +} + +// tcp服务器任务 +static void tcp_server_task(void *pvParameters) +{ + // 创建套接字 + int listen_sock = socket(AF_INET, SOCK_STREAM, 0); + if (listen_sock < 0) + { + ESP_LOGE(TAG, "Unable to create socket: errno %d", errno); + vTaskDelete(NULL); + return; + } + // 设置套接字属性 + int opt = 1; + setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); + ESP_LOGI(TAG, "Socket created"); + + // 设置服务器(IPV4) + struct sockaddr_storage dest_addr; + struct sockaddr_in *dest_addr_ip4 = (struct sockaddr_in *)&dest_addr; + dest_addr_ip4->sin_addr.s_addr = htonl(INADDR_ANY); + dest_addr_ip4->sin_family = AF_INET; + dest_addr_ip4->sin_port = htons(TCP_SREVER_PORT); + + // 绑定套接字 + int err = bind(listen_sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr)); + if (err != 0) + { + ESP_LOGE(TAG, "Socket unable to bind: errno %d", errno); + ESP_LOGE(TAG, "IPPROTO: %d", AF_INET); + goto CLEAN_UP; + } + ESP_LOGI(TAG, "Socket bound, port %d", TCP_SREVER_PORT); + + // 监听套接字 (阻塞) + err = listen(listen_sock, 1); + if (err != 0) + { + ESP_LOGE(TAG, "Error occurred during listen: errno %d", errno); + goto CLEAN_UP; + } + + while (1) + { + char addr_str[128]; + + ESP_LOGI(TAG, "Socket listening"); + struct sockaddr_storage source_addr; // Large enough for both IPv4 or IPv6 + socklen_t addr_len = sizeof(source_addr); + int sock = accept(listen_sock, (struct sockaddr *)&source_addr, &addr_len); + if (sock < 0) + { + ESP_LOGE(TAG, "Unable to accept connection: errno %d", errno); + break; + } + + // Set tcp keepalive option + int keepAlive = 1; + int keepIdle = 5; // TCP keep-alive idle time(s) + int keepInterval = 5; // TCP keep-alive interval time(s) + int keepCount = 3; // TCP keep-alive packet retry send counts + + setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &keepAlive, sizeof(int)); + setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, &keepIdle, sizeof(int)); + setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, &keepInterval, sizeof(int)); + setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, &keepCount, sizeof(int)); + + // Convert ip address to string + if (source_addr.ss_family == PF_INET) + { + inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr, addr_str, sizeof(addr_str) - 1); + } + + ESP_LOGI(TAG, "Socket accepted ip address: %s", addr_str); + + do_retransmit(sock); + + shutdown(sock, 0); + close(sock); + } + +CLEAN_UP: + close(listen_sock); + vTaskDelete(NULL); +} + +// wifi初始化 +static void wifi_sta_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} + +void app_main(void) +{ + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // 创建默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // 配置启动WIFI + wifi_sta_init(); + + // 创建TCP服务器任务 + xTaskCreate(tcp_server_task, "tcp_server_task", 4096, NULL, 5, NULL); +} diff --git a/code/05.wifi/udp/wifi_udp_client/.gitignore b/code/05.wifi/udp/wifi_udp_client/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/udp/wifi_udp_client/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/udp/wifi_udp_client/CMakeLists.txt b/code/05.wifi/udp/wifi_udp_client/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/udp/wifi_udp_client/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/udp/wifi_udp_client/main/CMakeLists.txt b/code/05.wifi/udp/wifi_udp_client/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/udp/wifi_udp_client/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/udp/wifi_udp_client/main/main.c b/code/05.wifi/udp/wifi_udp_client/main/main.c new file mode 100644 index 0000000..5fa4f67 --- /dev/null +++ b/code/05.wifi/udp/wifi_udp_client/main/main.c @@ -0,0 +1,176 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" +#include + +// 要连接的WIFI +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +// 目标服务器地址端口 +#define UDP_SREVER_ADDR "255.255.255.255" +#define UDP_SREVER_PORT 8080 + +static const char *TAG = "main"; + +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +// udp客户端 +static void udp_client_task(void *pvParameters) +{ + // 等待wifi连接成功(暂时这样处理) + vTaskDelay(5000 / portTICK_PERIOD_MS); + ESP_LOGI("udp_client_task", "udp_client_task start"); + + // 创建socket + int sock = socket(AF_INET, SOCK_DGRAM, 0); + if (sock < 0) // 创建失败返回-1 + { + ESP_LOGE(TAG, "Unable to create socket: errno %d", errno); + return; + } + + // 设置服务器(IPV4) + struct sockaddr_in server_config; + server_config.sin_addr.s_addr = inet_addr(UDP_SREVER_ADDR); + server_config.sin_family = AF_INET; + server_config.sin_port = htons(UDP_SREVER_PORT); // 宏htons 用于将主机的无符号短整型数据转换成网络字节顺序(小端转大端) + + + // 发送数据 + const char *data = "Hello World!"; + int err = sendto(sock, data, strlen(data), 0, (struct sockaddr *)&server_config, sizeof(server_config)); + if (err < 0) + { + ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno); + close(sock); + } + + char rx_buffer[1024]; + // 接收数据,并发回 + while(1) + { + // 清空缓存 + memset(rx_buffer, 0, sizeof(rx_buffer)); + // 接收数据 + + struct sockaddr_in source_addr; + socklen_t socklen = sizeof(source_addr); + int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen); + if (len < 0) + { + ESP_LOGE(TAG, "Error occurred during receiving: errno %d", errno); + break; + } + else + { + // 打印接收到的数据 + ESP_LOGI(TAG, "Received %d bytes: %s", len, rx_buffer); + } + } + // 关闭socket + close(sock); + vTaskDelete(NULL); +} + +// wifi初始化 +static void wifi_sta_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} + +void app_main(void) +{ + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // 创建默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // 配置启动WIFI + wifi_sta_init(); + + // 创建TCP客户端任务 + xTaskCreate(udp_client_task, "udp_client_task", 4096, NULL, 5, NULL); +} diff --git a/code/05.wifi/udp/wifi_udp_server/.gitignore b/code/05.wifi/udp/wifi_udp_server/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/udp/wifi_udp_server/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/udp/wifi_udp_server/CMakeLists.txt b/code/05.wifi/udp/wifi_udp_server/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/udp/wifi_udp_server/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/udp/wifi_udp_server/main/CMakeLists.txt b/code/05.wifi/udp/wifi_udp_server/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/udp/wifi_udp_server/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/udp/wifi_udp_server/main/main.c b/code/05.wifi/udp/wifi_udp_server/main/main.c new file mode 100644 index 0000000..f0a7add --- /dev/null +++ b/code/05.wifi/udp/wifi_udp_server/main/main.c @@ -0,0 +1,185 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" +#include +#include "lwip/err.h" +#include "lwip/sys.h" +#include + + +// 要连接的WIFI +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +// 服务器端口 +#define UDP_SREVER_PORT 8080 + +static const char *TAG = "main"; + +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +// udp客户端 +static void udp_server_task(void *pvParameters) +{ + // 等待wifi连接成功(暂时这样处理) + vTaskDelay(5000 / portTICK_PERIOD_MS); + ESP_LOGI("udp_server_task", "udp_server_task start"); + + // 创建socket + int sock = socket(AF_INET, SOCK_DGRAM, 0); + if (sock < 0) // 创建失败返回-1 + { + ESP_LOGE(TAG, "Unable to create socket: errno %d", errno); + return; + } + + // 设置服务器(IPV4) + struct sockaddr_in server_config; + server_config.sin_addr.s_addr = htonl(INADDR_ANY); + server_config.sin_family = AF_INET; + server_config.sin_port = htons(UDP_SREVER_PORT); // 宏htons 用于将主机的无符号短整型数据转换成网络字节顺序(小端转大端) + + // 绑定端口 + int err = bind(sock, (struct sockaddr *)&server_config, sizeof(server_config)); + if (err < 0) + { + ESP_LOGE(TAG, "Socket unable to bind: errno %d", errno); + } + ESP_LOGI(TAG, "Socket bound, port %d", UDP_SREVER_PORT); + + char rx_buffer[1024]; + // 接收数据,并发回 + while(1) + { + // 清空缓存 + memset(rx_buffer, 0, sizeof(rx_buffer)); + // 接收数据 + + struct sockaddr_in source_addr; + socklen_t socklen = sizeof(source_addr); + int len = recvfrom(sock, rx_buffer, sizeof(rx_buffer) - 1, 0, (struct sockaddr *)&source_addr, &socklen); + if (len < 0) + { + ESP_LOGE(TAG, "Error occurred during receiving: errno %d", errno); + break; + } + else + { + // 打印接收到的数据 + ESP_LOGI(TAG, "Received %d bytes: %s", len, rx_buffer); + // 发送数据 + int err = sendto(sock, rx_buffer, len, 0, (struct sockaddr *)&source_addr, sizeof(source_addr)); + if (err < 0) + { + ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno); + break; + } + ESP_LOGI(TAG, "Send success"); + } + } + // 关闭socket + close(sock); + vTaskDelete(NULL); +} + +// wifi初始化 +static void wifi_sta_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} + +void app_main(void) +{ + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // 创建默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // 配置启动WIFI + wifi_sta_init(); + + // 创建TCP客户端任务 + xTaskCreate(udp_server_task, "udp_server_task", 4096, NULL, 5, NULL); +} diff --git a/code/05.wifi/websocket/client/.gitignore b/code/05.wifi/websocket/client/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/websocket/client/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/websocket/client/CMakeLists.txt b/code/05.wifi/websocket/client/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/websocket/client/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/websocket/client/main/CMakeLists.txt b/code/05.wifi/websocket/client/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/websocket/client/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/websocket/client/main/idf_component.yml b/code/05.wifi/websocket/client/main/idf_component.yml new file mode 100644 index 0000000..8f99a94 --- /dev/null +++ b/code/05.wifi/websocket/client/main/idf_component.yml @@ -0,0 +1,17 @@ +## IDF Component Manager Manifest File +dependencies: + espressif/esp_websocket_client: "^1.2.2" + ## Required IDF version + idf: + version: ">=4.1.0" + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true diff --git a/code/05.wifi/websocket/client/main/main.c b/code/05.wifi/websocket/client/main/main.c new file mode 100644 index 0000000..b3f7dbb --- /dev/null +++ b/code/05.wifi/websocket/client/main/main.c @@ -0,0 +1,264 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" +#include +#include "esp_eth.h" +#include "esp_websocket_client.h" +#include + +// 要连接的WIFI +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +// 目标服务器 +#define CONFIG_WEBSOCKET_URI "ws://192.168.137.1:5000" +#define NO_DATA_TIMEOUT_SEC 5 + +static const char *TAG = "main"; + +static TimerHandle_t shutdown_signal_timer; +static SemaphoreHandle_t shutdown_sema; + +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +// wifi初始化 +static void wifi_sta_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} + +static void log_error_if_nonzero(const char *message, int error_code) +{ + if (error_code != 0) + { + ESP_LOGE(TAG, "Last error %s: 0x%x", message, error_code); + } +} + +static void shutdown_signaler(TimerHandle_t xTimer) +{ + ESP_LOGI(TAG, "No data received for %d seconds, signaling shutdown", NO_DATA_TIMEOUT_SEC); + xSemaphoreGive(shutdown_sema); +} + +// WebSocket客户端事件处理 +static void websocket_event_handler(void *handler_args, esp_event_base_t base, int32_t event_id, void *event_data) +{ + esp_websocket_event_data_t *data = (esp_websocket_event_data_t *)event_data; + switch (event_id) + { + // 连接成功 + case WEBSOCKET_EVENT_CONNECTED: + ESP_LOGI(TAG, "WEBSOCKET_EVENT_CONNECTED"); + break; + // 连接断开 + case WEBSOCKET_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "WEBSOCKET_EVENT_DISCONNECTED"); + log_error_if_nonzero("HTTP status code", data->error_handle.esp_ws_handshake_status_code); + if (data->error_handle.error_type == WEBSOCKET_ERROR_TYPE_TCP_TRANSPORT) + { + log_error_if_nonzero("reported from esp-tls", data->error_handle.esp_tls_last_esp_err); + log_error_if_nonzero("reported from tls stack", data->error_handle.esp_tls_stack_err); + log_error_if_nonzero("captured as transport's socket errno", data->error_handle.esp_transport_sock_errno); + } + break; + // 收到数据 + case WEBSOCKET_EVENT_DATA: + ESP_LOGI(TAG, "WEBSOCKET_EVENT_DATA"); + ESP_LOGI(TAG, "Received opcode=%d", data->op_code); + if (data->op_code == 0x08 && data->data_len == 2) + { + ESP_LOGW(TAG, "Received closed message with code=%d", 256 * data->data_ptr[0] + data->data_ptr[1]); + } + else + { + ESP_LOGW(TAG, "Received=%.*s\n\n", data->data_len, (char *)data->data_ptr); + } + + // If received data contains json structure it succeed to parse + cJSON *root = cJSON_Parse(data->data_ptr); + if (root) + { + for (int i = 0; i < cJSON_GetArraySize(root); i++) + { + cJSON *elem = cJSON_GetArrayItem(root, i); + cJSON *id = cJSON_GetObjectItem(elem, "id"); + cJSON *name = cJSON_GetObjectItem(elem, "name"); + ESP_LOGW(TAG, "Json={'id': '%s', 'name': '%s'}", id->valuestring, name->valuestring); + } + cJSON_Delete(root); + } + + ESP_LOGW(TAG, "Total payload length=%d, data_len=%d, current payload offset=%d\r\n", data->payload_len, data->data_len, data->payload_offset); + + // 定时器复位 + xTimerReset(shutdown_signal_timer, portMAX_DELAY); + break; + // 错误 + case WEBSOCKET_EVENT_ERROR: + ESP_LOGI(TAG, "WEBSOCKET_EVENT_ERROR"); + log_error_if_nonzero("HTTP status code", data->error_handle.esp_ws_handshake_status_code); + if (data->error_handle.error_type == WEBSOCKET_ERROR_TYPE_TCP_TRANSPORT) + { + log_error_if_nonzero("reported from esp-tls", data->error_handle.esp_tls_last_esp_err); + log_error_if_nonzero("reported from tls stack", data->error_handle.esp_tls_stack_err); + log_error_if_nonzero("captured as transport's socket errno", data->error_handle.esp_transport_sock_errno); + } + break; + } +} + +// WebSocket客户端 +static void websocket_app_start(void) +{ + esp_websocket_client_config_t websocket_cfg = {}; + + // 创建定时器 + shutdown_signal_timer = xTimerCreate("Websocket shutdown timer", NO_DATA_TIMEOUT_SEC * 1000 / portTICK_PERIOD_MS, + pdFALSE, NULL, shutdown_signaler); + // 创建信号量 + shutdown_sema = xSemaphoreCreateBinary(); + + // 配置目标服务器 + websocket_cfg.uri = CONFIG_WEBSOCKET_URI; + + ESP_LOGI(TAG, "Connecting to %s...", websocket_cfg.uri); + + // 创建WebSocket客户端 + esp_websocket_client_handle_t client = esp_websocket_client_init(&websocket_cfg); + // 注册事件 + esp_websocket_register_events(client, WEBSOCKET_EVENT_ANY, websocket_event_handler, (void *)client); + // 启动WebSocket客户端 + esp_websocket_client_start(client); + xTimerStart(shutdown_signal_timer, portMAX_DELAY); + char data[32]; + int i = 0; + // 发送5次数据 + while (i < 5) + { + if (esp_websocket_client_is_connected(client)) + { + int len = sprintf(data, "hello %04d", i++); + ESP_LOGI(TAG, "Sending %s", data); + // 发送文本数据 + esp_websocket_client_send_text(client, data, len, portMAX_DELAY); + } + vTaskDelay(1000 / portTICK_PERIOD_MS); + } + + ESP_LOGI(TAG, "Sending fragmented message"); + vTaskDelay(1000 / portTICK_PERIOD_MS); + memset(data, 'a', sizeof(data)); + esp_websocket_client_send_text_partial(client, data, sizeof(data), portMAX_DELAY); + memset(data, 'b', sizeof(data)); + esp_websocket_client_send_cont_msg(client, data, sizeof(data), portMAX_DELAY); + esp_websocket_client_send_fin(client, portMAX_DELAY); + + // 等待信号量 + xSemaphoreTake(shutdown_sema, portMAX_DELAY); + // 关闭WebSocket客户端 + esp_websocket_client_close(client, portMAX_DELAY); + ESP_LOGI(TAG, "Websocket Stopped"); + // 销毁WebSocket客户端 + esp_websocket_client_destroy(client); +} + +void app_main(void) +{ + + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // 创建默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // 配置启动WIFI + wifi_sta_init(); + + // 等待wifi连接成功(暂时这样处理) + vTaskDelay(5000 / portTICK_PERIOD_MS); + + // 创建WebSocket客户端 + websocket_app_start(); +} diff --git a/code/05.wifi/websocket/client/websocket_echo_server.py b/code/05.wifi/websocket/client/websocket_echo_server.py new file mode 100644 index 0000000..91cb1bb --- /dev/null +++ b/code/05.wifi/websocket/client/websocket_echo_server.py @@ -0,0 +1,18 @@ +from flask import Flask +from flask_sock import Sock + +app = Flask(__name__) +sock = Sock(app) + + +@sock.route('/') +def echo(ws): + while True: + data = ws.receive() + ws.send(data) + + +if __name__ == '__main__': + # To run your Flask + WebSocket server in production you can use Gunicorn: + # gunicorn -b 0.0.0.0:5000 --workers 4 --threads 100 module:app + app.run(host="0.0.0.0", debug=True) diff --git a/code/05.wifi/websocket/server/.gitignore b/code/05.wifi/websocket/server/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/websocket/server/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/websocket/server/CMakeLists.txt b/code/05.wifi/websocket/server/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/websocket/server/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/websocket/server/main/CMakeLists.txt b/code/05.wifi/websocket/server/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/websocket/server/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/websocket/server/main/main.c b/code/05.wifi/websocket/server/main/main.c new file mode 100644 index 0000000..c3b8e08 --- /dev/null +++ b/code/05.wifi/websocket/server/main/main.c @@ -0,0 +1,262 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" +#include +#include +#include "esp_eth.h" + +// 要连接的WIFI +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +static const char *TAG = "main"; + +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +// wifi初始化 +static void wifi_sta_init(void) +{ + ESP_ERROR_CHECK(esp_netif_init()); + + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} + +/* + * Structure holding server handle + * and internal socket fd in order + * to use out of request send + */ +struct async_resp_arg +{ + httpd_handle_t hd; + int fd; +}; + +/* + * async send function, which we put into the httpd work queue + */ +static void ws_async_send(void *arg) +{ + static const char *data = "Async data"; + struct async_resp_arg *resp_arg = arg; + httpd_handle_t hd = resp_arg->hd; + int fd = resp_arg->fd; + httpd_ws_frame_t ws_pkt; + memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t)); + ws_pkt.payload = (uint8_t *)data; + ws_pkt.len = strlen(data); + ws_pkt.type = HTTPD_WS_TYPE_TEXT; + + httpd_ws_send_frame_async(hd, fd, &ws_pkt); + free(resp_arg); +} + +static esp_err_t trigger_async_send(httpd_handle_t handle, httpd_req_t *req) +{ + struct async_resp_arg *resp_arg = malloc(sizeof(struct async_resp_arg)); + if (resp_arg == NULL) + { + return ESP_ERR_NO_MEM; + } + resp_arg->hd = req->handle; + resp_arg->fd = httpd_req_to_sockfd(req); + esp_err_t ret = httpd_queue_work(handle, ws_async_send, resp_arg); + if (ret != ESP_OK) + { + free(resp_arg); + } + return ret; +} + +/* + * This handler echos back the received ws data + * and triggers an async send if certain message received + */ +static esp_err_t echo_handler(httpd_req_t *req) +{ + if (req->method == HTTP_GET) + { + ESP_LOGI(TAG, "Handshake done, the new connection was opened"); + return ESP_OK; + } + httpd_ws_frame_t ws_pkt; + uint8_t *buf = NULL; + memset(&ws_pkt, 0, sizeof(httpd_ws_frame_t)); + ws_pkt.type = HTTPD_WS_TYPE_TEXT; + /* Set max_len = 0 to get the frame len */ + // 读取数据 + esp_err_t ret = httpd_ws_recv_frame(req, &ws_pkt, 0); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "httpd_ws_recv_frame failed to get frame len with %d", ret); + return ret; + } + ESP_LOGI(TAG, "frame len is %d", ws_pkt.len); + if (ws_pkt.len) + { + /* ws_pkt.len + 1 is for NULL termination as we are expecting a string */ + buf = calloc(1, ws_pkt.len + 1); + if (buf == NULL) + { + ESP_LOGE(TAG, "Failed to calloc memory for buf"); + return ESP_ERR_NO_MEM; + } + ws_pkt.payload = buf; + /* Set max_len = ws_pkt.len to get the frame payload */ + ret = httpd_ws_recv_frame(req, &ws_pkt, ws_pkt.len); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "httpd_ws_recv_frame failed with %d", ret); + free(buf); + return ret; + } + ESP_LOGI(TAG, "Got packet with message: %s", ws_pkt.payload); + } + ESP_LOGI(TAG, "Packet type: %d", ws_pkt.type); + // 发送数据 + if (ws_pkt.type == HTTPD_WS_TYPE_TEXT && + strcmp((char *)ws_pkt.payload, "Trigger async") == 0) + { + free(buf); + return trigger_async_send(req->handle, req); + } + + ret = httpd_ws_send_frame(req, &ws_pkt); + if (ret != ESP_OK) + { + ESP_LOGE(TAG, "httpd_ws_send_frame failed with %d", ret); + } + free(buf); + return ret; +} + +static const httpd_uri_t ws = { + .uri = "/ws", + .method = HTTP_GET, + .handler = echo_handler, + .user_ctx = NULL, + .is_websocket = true}; + +static httpd_handle_t start_webserver(void) +{ + httpd_handle_t server = NULL; + httpd_config_t config = HTTPD_DEFAULT_CONFIG(); + + // Start the httpd server + ESP_LOGI(TAG, "Starting server on port: '%d'", config.server_port); + if (httpd_start(&server, &config) == ESP_OK) + { + // Registering the ws handler + ESP_LOGI(TAG, "Registering URI handlers"); + httpd_register_uri_handler(server, &ws); + return server; + } + + ESP_LOGI(TAG, "Error starting server!"); + return NULL; +} + +static esp_err_t stop_webserver(httpd_handle_t server) +{ + // Stop the httpd server + return httpd_stop(server); +} + +void app_main(void) +{ + static httpd_handle_t server = NULL; + + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // 创建默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // 配置启动WIFI + wifi_sta_init(); + + // 等待wifi连接成功(暂时这样处理) + vTaskDelay(5000 / portTICK_PERIOD_MS); + + // 创建WebSocket服务器 + server = start_webserver(); +} diff --git a/code/05.wifi/wifi_ap/.gitignore b/code/05.wifi/wifi_ap/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/wifi_ap/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/wifi_ap/CMakeLists.txt b/code/05.wifi/wifi_ap/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/wifi_ap/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/wifi_ap/main/CMakeLists.txt b/code/05.wifi/wifi_ap/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/wifi_ap/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/wifi_ap/main/main.c b/code/05.wifi/wifi_ap/main/main.c new file mode 100644 index 0000000..4b9cb56 --- /dev/null +++ b/code/05.wifi/wifi_ap/main/main.c @@ -0,0 +1,83 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" + +#define ESP_WIFI_AP_SSID "DuRuofu_ESP32" +#define ESP_WIFI_AP_PASSWD "3.1415926" + +void WIFI_CallBack(void *event_handler_arg,esp_event_base_t event_base,int32_t event_id,void *event_data) +{ + // 连接事件 + if(event_base == IP_EVENT && event_id == IP_EVENT_AP_STAIPASSIGNED) + { + // 解析数据 + ip_event_ap_staipassigned_t* event_info = (ip_event_ap_staipassigned_t *)event_data; + ESP_LOGW("WIFI_AP", "设备已连接 MAC:"MACSTR"", MAC2STR(event_info->mac)); + } + + // 断开连接事件 + if(event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STADISCONNECTED) + { + wifi_event_ap_stadisconnected_t* event_info = (wifi_event_ap_stadisconnected_t*)event_data; + ESP_LOGW("WIFI_AP", "设备已断开 MAC:"MACSTR"", MAC2STR(event_info->mac)); + } +} + +void app_main(void) +{ + //----------------准备阶段------------------- + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + //---------------初始化阶段------------------ + + ESP_ERROR_CHECK(esp_netif_init()); + + // 初始化默认事件循环 + ESP_ERROR_CHECK(esp_event_loop_create_default()); + // 注册设备连接事件回调 + esp_event_handler_instance_register(IP_EVENT, IP_EVENT_AP_STAIPASSIGNED, WIFI_CallBack, NULL, NULL); + // 注册设备断开连接设备回调 + esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_AP_STADISCONNECTED, WIFI_CallBack, NULL, NULL); + + // *esp_netif_ap 可以用来修改AP设置 + esp_netif_t *esp_netif_ap = esp_netif_create_default_wifi_ap(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //---------------配置阶段-------------------- + // 设置为AP模式 + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_AP)); + + // AP详细配置 + wifi_config_t wifi_ap_config = { + .ap = { + .ssid = ESP_WIFI_AP_SSID, // WIFI名称 + .ssid_len = strlen(ESP_WIFI_AP_SSID), // 名称长度 + .channel = 1, // WIFI信道 + .password = ESP_WIFI_AP_PASSWD, // WiFi密码 + .max_connection = 5, // 最大连接数,默认值是 10 + .authmode = WIFI_AUTH_WPA2_PSK, // WiFi认证方式 + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_AP, &wifi_ap_config)); + + //---------------启动阶段-------------------- + /* Start WiFi */ + ESP_ERROR_CHECK(esp_wifi_start()); +} diff --git a/code/05.wifi/wifi_scan/.gitignore b/code/05.wifi/wifi_scan/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/wifi_scan/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/wifi_scan/CMakeLists.txt b/code/05.wifi/wifi_scan/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/wifi_scan/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/wifi_scan/main/CMakeLists.txt b/code/05.wifi/wifi_scan/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/wifi_scan/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/wifi_scan/main/main.c b/code/05.wifi/wifi_scan/main/main.c new file mode 100644 index 0000000..7bd2091 --- /dev/null +++ b/code/05.wifi/wifi_scan/main/main.c @@ -0,0 +1,183 @@ +#includ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" + +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +// 扫面列表大小 +#define DEFAULT_SCAN_LIST_SIZE 10 + +static const char *TAG = "wifi_scan"; + +// 打印加密模式 +static void print_auth_mode(int authmode) +{ + switch (authmode) + { + case WIFI_AUTH_OPEN: + ESP_LOGI(TAG, "Authmode \tWIFI_AUTH_OPEN"); + break; + case WIFI_AUTH_OWE: + ESP_LOGI(TAG, "Authmode \tWIFI_AUTH_OWE"); + break; + case WIFI_AUTH_WEP: + ESP_LOGI(TAG, "Authmode \tWIFI_AUTH_WEP"); + break; + case WIFI_AUTH_WPA_PSK: + ESP_LOGI(TAG, "Authmode \tWIFI_AUTH_WPA_PSK"); + break; + case WIFI_AUTH_WPA2_PSK: + ESP_LOGI(TAG, "Authmode \tWIFI_AUTH_WPA2_PSK"); + break; + case WIFI_AUTH_WPA_WPA2_PSK: + ESP_LOGI(TAG, "Authmode \tWIFI_AUTH_WPA_WPA2_PSK"); + break; + case WIFI_AUTH_WPA2_ENTERPRISE: + ESP_LOGI(TAG, "Authmode \tWIFI_AUTH_WPA2_ENTERPRISE"); + break; + case WIFI_AUTH_WPA3_PSK: + ESP_LOGI(TAG, "Authmode \tWIFI_AUTH_WPA3_PSK"); + break; + case WIFI_AUTH_WPA2_WPA3_PSK: + ESP_LOGI(TAG, "Authmode \tWIFI_AUTH_WPA2_WPA3_PSK"); + break; + default: + ESP_LOGI(TAG, "Authmode \tWIFI_AUTH_UNKNOWN"); + break; + } +} + +// 打印密码类型 +static void print_cipher_type(int pairwise_cipher, int group_cipher) +{ + switch (pairwise_cipher) + { + case WIFI_CIPHER_TYPE_NONE: + ESP_LOGI(TAG, "Pairwise Cipher \tWIFI_CIPHER_TYPE_NONE"); + break; + case WIFI_CIPHER_TYPE_WEP40: + ESP_LOGI(TAG, "Pairwise Cipher \tWIFI_CIPHER_TYPE_WEP40"); + break; + case WIFI_CIPHER_TYPE_WEP104: + ESP_LOGI(TAG, "Pairwise Cipher \tWIFI_CIPHER_TYPE_WEP104"); + break; + case WIFI_CIPHER_TYPE_TKIP: + ESP_LOGI(TAG, "Pairwise Cipher \tWIFI_CIPHER_TYPE_TKIP"); + break; + case WIFI_CIPHER_TYPE_CCMP: + ESP_LOGI(TAG, "Pairwise Cipher \tWIFI_CIPHER_TYPE_CCMP"); + break; + case WIFI_CIPHER_TYPE_TKIP_CCMP: + ESP_LOGI(TAG, "Pairwise Cipher \tWIFI_CIPHER_TYPE_TKIP_CCMP"); + break; + default: + ESP_LOGI(TAG, "Pairwise Cipher \tWIFI_CIPHER_TYPE_UNKNOWN"); + break; + } + + switch (group_cipher) + { + case WIFI_CIPHER_TYPE_NONE: + ESP_LOGI(TAG, "Group Cipher \tWIFI_CIPHER_TYPE_NONE"); + break; + case WIFI_CIPHER_TYPE_WEP40: + ESP_LOGI(TAG, "Group Cipher \tWIFI_CIPHER_TYPE_WEP40"); + break; + case WIFI_CIPHER_TYPE_WEP104: + ESP_LOGI(TAG, "Group Cipher \tWIFI_CIPHER_TYPE_WEP104"); + break; + case WIFI_CIPHER_TYPE_TKIP: + ESP_LOGI(TAG, "Group Cipher \tWIFI_CIPHER_TYPE_TKIP"); + break; + case WIFI_CIPHER_TYPE_CCMP: + ESP_LOGI(TAG, "Group Cipher \tWIFI_CIPHER_TYPE_CCMP"); + break; + case WIFI_CIPHER_TYPE_TKIP_CCMP: + ESP_LOGI(TAG, "Group Cipher \tWIFI_CIPHER_TYPE_TKIP_CCMP"); + break; + default: + ESP_LOGI(TAG, "Group Cipher \tWIFI_CIPHER_TYPE_UNKNOWN"); + break; + } +} + +void app_main(void) +{ + //----------------准备阶段------------------- + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + //----------------初始化阶段------------------- + ESP_ERROR_CHECK(esp_netif_init()); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + esp_netif_t *sta_netif = esp_netif_create_default_wifi_sta(); + assert(sta_netif); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 设置为STA模式 + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); + + //----------------WIFI Scan------------------- + uint16_t number = DEFAULT_SCAN_LIST_SIZE; + wifi_ap_record_t ap_info[DEFAULT_SCAN_LIST_SIZE]; + uint16_t ap_count = 0; + memset(ap_info, 0, sizeof(ap_info)); + // 扫描所有有效的AP 阻塞 + esp_wifi_scan_start(NULL, true); + // 获取上次扫描中找到的AP列表 + ESP_ERROR_CHECK(esp_wifi_scan_get_ap_records(&number, ap_info)); + // 获取上次扫描中找到的AP数获取上次扫描中找到的AP数 + ESP_ERROR_CHECK(esp_wifi_scan_get_ap_num(&ap_count)); + ESP_LOGI(TAG, "Total APs scanned = %u", ap_count); + for (int i = 0; (i < DEFAULT_SCAN_LIST_SIZE) && (i < ap_count); i++) + { + ESP_LOGI(TAG, "SSID \t\t%s", ap_info[i].ssid); // 名称 + ESP_LOGI(TAG, "RSSI \t\t%d", ap_info[i].rssi); // 信号强度 + print_auth_mode(ap_info[i].authmode); // wifi加密模式 + if (ap_info[i].authmode != WIFI_AUTH_WEP) + { + print_cipher_type(ap_info[i].pairwise_cipher, ap_info[i].group_cipher); + } + ESP_LOGI(TAG, "Channel \t\t%d\n", ap_info[i].primary); // 信道 + } +} diff --git a/code/05.wifi/wifi_sta/.gitignore b/code/05.wifi/wifi_sta/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/wifi_sta/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/wifi_sta/CMakeLists.txt b/code/05.wifi/wifi_sta/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/wifi_sta/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/wifi_sta/main/CMakeLists.txt b/code/05.wifi/wifi_sta/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/wifi_sta/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/wifi_sta/main/main.c b/code/05.wifi/wifi_sta/main/main.c new file mode 100644 index 0000000..187b478 --- /dev/null +++ b/code/05.wifi/wifi_sta/main/main.c @@ -0,0 +1,100 @@ +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" + + +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else{ + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +void app_main(void) +{ + //----------------准备阶段------------------- + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + //----------------初始化阶段------------------- + ESP_ERROR_CHECK(esp_netif_init()); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_create_default_wifi_sta(); + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 初始化WIFI设备( 为 WiFi 驱动初始化 WiFi 分配资源,如 WiFi 控制结构、RX/TX 缓冲区、WiFi NVS 结构等,这个 WiFi 也启动 WiFi 任务。必须先调用此API,然后才能调用所有其他WiFi API) + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} diff --git a/code/05.wifi/wifi_sta_static_ip/.gitignore b/code/05.wifi/wifi_sta_static_ip/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/05.wifi/wifi_sta_static_ip/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/05.wifi/wifi_sta_static_ip/CMakeLists.txt b/code/05.wifi/wifi_sta_static_ip/CMakeLists.txt new file mode 100644 index 0000000..664d458 --- /dev/null +++ b/code/05.wifi/wifi_sta_static_ip/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(main) diff --git a/code/05.wifi/wifi_sta_static_ip/main/CMakeLists.txt b/code/05.wifi/wifi_sta_static_ip/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/05.wifi/wifi_sta_static_ip/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/05.wifi/wifi_sta_static_ip/main/main.c b/code/05.wifi/wifi_sta_static_ip/main/main.c new file mode 100644 index 0000000..01bcaf2 --- /dev/null +++ b/code/05.wifi/wifi_sta_static_ip/main/main.c @@ -0,0 +1,114 @@ +#includ < stdio.h> +#include +#include "freertos/FreeRTOS.h" +#include "freertos/event_groups.h" +#include "esp_wifi.h" +#include "esp_log.h" +#include "esp_event.h" +#include "nvs_flash.h" +#include "esp_mac.h" +#include "esp_netif.h" +#include "lwip/inet.h" + +#define ESP_WIFI_STA_SSID "duruofu_win10" +#define ESP_WIFI_STA_PASSWD "1234567890" + +void WIFI_CallBack(void *event_handler_arg, esp_event_base_t event_base, int32_t event_id, void *event_data) +{ + static uint8_t connect_count = 0; + // WIFI 启动成功 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_START"); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + // WIFI 连接失败 + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED"); + connect_count++; + if (connect_count < 6) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + ESP_ERROR_CHECK(esp_wifi_connect()); + } + else + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_DISCONNECTED 10 times"); + } + } + // WIFI 连接成功(获取到了IP) + if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + ESP_LOGI("WIFI_EVENT", "WIFI_EVENT_STA_GOT_IP"); + ip_event_got_ip_t *info = (ip_event_got_ip_t *)event_data; + ESP_LOGI("WIFI_EVENT", "got ip:" IPSTR "", IP2STR(&info->ip_info.ip)); + } +} + +void app_main(void) +{ + //----------------准备阶段------------------- + // Initialize NVS + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + //----------------初始化阶段------------------- + ESP_ERROR_CHECK(esp_netif_init()); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + // 注册事件(wifi启动成功) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_START, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, WIFI_EVENT_STA_DISCONNECTED, WIFI_CallBack, NULL, NULL)); + // 注册事件(wifi连接失败) + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, IP_EVENT_STA_GOT_IP, WIFI_CallBack, NULL, NULL)); + + // 初始化STA设备 + esp_netif_t *esp_netif = esp_netif_create_default_wifi_sta(); + + // ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ + //*******************配置静态IP************************* + esp_netif_dhcpc_stop(esp_netif); + esp_netif_ip_info_t ipInfo; + ipInfo.ip.addr = inet_addr("192.168.138.2"); + ipInfo.netmask = inet_addr("255.255.255.0"); + ipInfo.gw = inet_addr("192.168.138.2"); + + esp_netif_set_ip_info(esp_netif, &ipInfo); + esp_netif_dhcpc_start(esp_netif); + //*******************配置静态IP************************* + // ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ + + /*Initialize WiFi */ + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + // WIFI_INIT_CONFIG_DEFAULT 是一个默认配置的宏 + + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + //----------------配置阶段------------------- + // 设置为STA模式 + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + + // STA详细配置 + wifi_config_t sta_config = { + .sta = { + .ssid = ESP_WIFI_STA_SSID, + .password = ESP_WIFI_STA_PASSWD, + .bssid_set = false, + }, + }; + ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config)); + + //----------------启动阶段------------------- + ESP_ERROR_CHECK(esp_wifi_start()); + + //----------------配置省电模式------------------- + // 不省电(数据传输会更快) + ESP_ERROR_CHECK(esp_wifi_set_ps(WIFI_PS_NONE)); +} diff --git a/code/07.bluetooth/README.md b/code/07.bluetooth/README.md new file mode 100644 index 0000000..e69de29 diff --git a/code/08.gui/lvgl_spd2010_gui/.gitignore b/code/08.gui/lvgl_spd2010_gui/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/08.gui/lvgl_spd2010_gui/CMakeLists.txt b/code/08.gui/lvgl_spd2010_gui/CMakeLists.txt new file mode 100644 index 0000000..bdafdcf --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(lvgl_transplant_spd2010) diff --git a/code/08.gui/lvgl_spd2010_gui/main/CMakeLists.txt b/code/08.gui/lvgl_spd2010_gui/main/CMakeLists.txt new file mode 100644 index 0000000..ef3747e --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/CMakeLists.txt @@ -0,0 +1,23 @@ +file(GLOB_RECURSE srcs *.c + ui/custom/*.c + ui/generated/*.c + ui/generated/guider_customer_fonts/*.c + ui/generated/guider_fonts/*.c + ui/generated/images/*.c + ) + +set(include_dirs + . + ui/custom + ui/generated + ui/generated/guider_customer_fonts + ui/generated/guider_fonts + ui/generated/images + + ) + +idf_component_register( + SRCS ${srcs} + INCLUDE_DIRS ${include_dirs} + REQUIRES lvgl + ) diff --git a/code/08.gui/lvgl_spd2010_gui/main/idf_component.yml b/code/08.gui/lvgl_spd2010_gui/main/idf_component.yml new file mode 100644 index 0000000..3c0f745 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/idf_component.yml @@ -0,0 +1,19 @@ +## IDF Component Manager Manifest File +dependencies: + lvgl/lvgl: "^8.3.6~1" + espressif/esp_lcd_spd2010: "*" + espressif/esp_lcd_touch_spd2010: "^0.0.1" + ## Required IDF version + idf: + version: ">=4.1.0" + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true diff --git a/code/08.gui/lvgl_spd2010_gui/main/main.c b/code/08.gui/lvgl_spd2010_gui/main/main.c new file mode 100644 index 0000000..fb79c33 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/main.c @@ -0,0 +1,416 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "driver/i2c.h" +#include "driver/spi_master.h" +#include "esp_timer.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "esp_err.h" +#include "esp_log.h" + +#include "lvgl.h" +#include "lv_demos.h" +#include "esp_lcd_spd2010.h" +#include "esp_lcd_touch_spd2010.h" + +#include "gui_guider.h" +#include "custom.h" + +#define LV_LVGL_H_INCLUDE_SIMPLE 1 + +lv_ui guider_ui; + +static const char *TAG = "main"; +static SemaphoreHandle_t lvgl_mux = NULL; + +// LCD和触摸控制器配置 +#define LCD_HOST SPI2_HOST +#define TOUCH_HOST I2C_NUM_0 + + +// 颜色深度 +#define LCD_BIT_PER_PIXEL (16) + +// 引脚配置 +// ESP Board SPD1020 Panel (QSPI) +// ┌──────────────────────┐ ┌────────────────────┐ +// │ GND ├─────────────►│ GND │ +// │ │ │ │ +// │ 3V3 ├─────────────►│ VCC │ +// │ │ │ │ +// │ CS ├─────────────►│ CS │ +// │ │ │ │ +// │ SCK ├─────────────►│ CLK │ +// │ │ │ │ +// │ D3 ├─────────────►│ IO3 │ +// │ │ │ │ +// │ D2 ├─────────────►│ IO2 │ +// │ │ │ │ +// │ D1 ├─────────────►│ IO1 │ +// │ │ │ │ +// │ D0 ├─────────────►│ IO0 │ +// │ │ │ │ +// │ RST ├─────────────►│ RSTN │ +// │ │ │ │ +// │ (SCL) ├─────────────►│ TP_SCL │ +// │ │ │ │ +// │ (SDA) ├─────────────►│ TP_SDA │ +// │ │ │ │ +// │ (TP_INT) ├─────────────►│ TP_INT │ +// │ │ │ │ +// │ (3V3) ├─────────────►│ TP_RST │ +// │ │ │ │ +// └──────────────────────┘ └────────────────────┘ +#define EXAMPLE_LCD_BK_LIGHT_ON_LEVEL 0 +#define EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL !EXAMPLE_LCD_BK_LIGHT_ON_LEVEL +#define EXAMPLE_PIN_NUM_LCD_CS (GPIO_NUM_9) +#define EXAMPLE_PIN_NUM_LCD_PCLK (GPIO_NUM_10) +#define EXAMPLE_PIN_NUM_LCD_DATA0 (GPIO_NUM_11) +#define EXAMPLE_PIN_NUM_LCD_DATA1 (GPIO_NUM_12) +#define EXAMPLE_PIN_NUM_LCD_DATA2 (GPIO_NUM_13) +#define EXAMPLE_PIN_NUM_LCD_DATA3 (GPIO_NUM_14) +#define EXAMPLE_PIN_NUM_LCD_RST (GPIO_NUM_4) +#define EXAMPLE_PIN_NUM_BK_LIGHT (GPIO_NUM_3) + +// 触摸引脚配置 +#define EXAMPLE_PIN_NUM_TOUCH_SCL (GPIO_NUM_18) +#define EXAMPLE_PIN_NUM_TOUCH_SDA (GPIO_NUM_8) +#define EXAMPLE_PIN_NUM_TOUCH_RST (GPIO_NUM_7) +#define EXAMPLE_PIN_NUM_TOUCH_INT (GPIO_NUM_17) + +esp_lcd_touch_handle_t tp = NULL; + + +// LCD分辨率 +#define EXAMPLE_LCD_H_RES 412 +#define EXAMPLE_LCD_V_RES 412 + +// LVGLtask配置 +#define EXAMPLE_LVGL_TICK_PERIOD_MS 2 +#define EXAMPLE_LVGL_TASK_MAX_DELAY_MS 500 +#define EXAMPLE_LVGL_TASK_MIN_DELAY_MS 1 +#define EXAMPLE_LVGL_TASK_STACK_SIZE (4 * 1024) +#define EXAMPLE_LVGL_TASK_PRIORITY 2 + +static bool example_notify_lvgl_flush_ready(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx) +{ + lv_disp_drv_t *disp_driver = (lv_disp_drv_t *)user_ctx; + lv_disp_flush_ready(disp_driver); + return false; +} + + +static void example_lvgl_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) +{ + esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) drv->user_data; + const int offsetx1 = area->x1; + const int offsetx2 = area->x2; + const int offsety1 = area->y1; + const int offsety2 = area->y2; + + // copy a buffer's content to a specific area of the display + esp_lcd_panel_draw_bitmap(panel_handle, offsetx1, offsety1, offsetx2 + 1, offsety2 + 1, color_map); +} + +/* Rotate display and touch, when rotated screen in LVGL. Called when driver parameters are updated. */ +static void example_lvgl_update_cb(lv_disp_drv_t *drv) +{ + esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) drv->user_data; + + switch (drv->rotated) { + case LV_DISP_ROT_NONE: + // Rotate LCD display + esp_lcd_panel_swap_xy(panel_handle, false); + esp_lcd_panel_mirror(panel_handle, true, false); + // Rotate LCD touch + esp_lcd_touch_set_mirror_y(tp, false); + esp_lcd_touch_set_mirror_x(tp, false); + break; + case LV_DISP_ROT_90: + // Rotate LCD display + esp_lcd_panel_swap_xy(panel_handle, true); + esp_lcd_panel_mirror(panel_handle, true, true); + // Rotate LCD touch + esp_lcd_touch_set_mirror_y(tp, false); + esp_lcd_touch_set_mirror_x(tp, false); + break; + case LV_DISP_ROT_180: + // Rotate LCD display + esp_lcd_panel_swap_xy(panel_handle, false); + esp_lcd_panel_mirror(panel_handle, false, true); + // Rotate LCD touch + esp_lcd_touch_set_mirror_y(tp, false); + esp_lcd_touch_set_mirror_x(tp, false); + + break; + case LV_DISP_ROT_270: + // Rotate LCD display + esp_lcd_panel_swap_xy(panel_handle, true); + esp_lcd_panel_mirror(panel_handle, false, false); + // Rotate LCD touch + esp_lcd_touch_set_mirror_y(tp, false); + esp_lcd_touch_set_mirror_x(tp, false); + break; + } +} + +void example_lvgl_rounder_cb(struct _lv_disp_drv_t *disp_drv, lv_area_t *area) +{ + uint16_t x1 = area->x1; + uint16_t x2 = area->x2; + // round the start of coordinate down to the nearest 4M number + area->x1 = (x1 >> 2) << 2; + // round the end of coordinate up to the nearest 4N+3 number + area->x2 = ((x2 >> 2) << 2) + 3; +} + + +// 触屏信号量 +static SemaphoreHandle_t touch_mux = NULL; +// lvgl触摸回调函数 +static void example_lvgl_touch_cb(lv_indev_drv_t *drv, lv_indev_data_t *data) +{ + esp_lcd_touch_handle_t tp = (esp_lcd_touch_handle_t)drv->user_data; + assert(tp); + + uint16_t tp_x; + uint16_t tp_y; + uint8_t tp_cnt = 0; + /* Read data from touch controller into memory */ + if (xSemaphoreTake(touch_mux, 0) == pdTRUE) { + esp_lcd_touch_read_data(tp); + } + + /* Read data from touch controller */ + bool tp_pressed = esp_lcd_touch_get_coordinates(tp, &tp_x, &tp_y, NULL, &tp_cnt, 1); + if (tp_pressed && tp_cnt > 0) { + data->point.x = tp_x; + data->point.y = tp_y; + data->state = LV_INDEV_STATE_PRESSED; + ESP_LOGI(TAG, "Touch position: %d,%d", tp_x, tp_y); + } else { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +static void example_touch_isr_cb(esp_lcd_touch_handle_t tp) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + xSemaphoreGiveFromISR(touch_mux, &xHigherPriorityTaskWoken); + + if (xHigherPriorityTaskWoken) { + portYIELD_FROM_ISR(); + } +} + + +// LVGL任务 +static void example_increase_lvgl_tick(void *arg) +{ + /* Tell LVGL how many milliseconds has elapsed */ + lv_tick_inc(EXAMPLE_LVGL_TICK_PERIOD_MS); +} + +static bool example_lvgl_lock(int timeout_ms) +{ + assert(lvgl_mux && "bsp_display_start must be called first"); + + const TickType_t timeout_ticks = (timeout_ms == -1) ? portMAX_DELAY : pdMS_TO_TICKS(timeout_ms); + return xSemaphoreTake(lvgl_mux, timeout_ticks) == pdTRUE; +} + +static void example_lvgl_unlock(void) +{ + assert(lvgl_mux && "bsp_display_start must be called first"); + xSemaphoreGive(lvgl_mux); +} + + +// LVGL任务 +static void example_lvgl_port_task(void *arg) +{ + ESP_LOGI(TAG, "Starting LVGL task"); + // Initialize ui + setup_ui(&guider_ui); + uint32_t task_delay_ms = EXAMPLE_LVGL_TASK_MAX_DELAY_MS; + while (1) { + ESP_LOGI(TAG, "LVGL task"); + // Lock the mutex due to the LVGL APIs are not thread-safe + if (example_lvgl_lock(-1)) { + task_delay_ms = lv_timer_handler(); + // Release the mutex + example_lvgl_unlock(); + } + if (task_delay_ms > EXAMPLE_LVGL_TASK_MAX_DELAY_MS) { + task_delay_ms = EXAMPLE_LVGL_TASK_MAX_DELAY_MS; + } else if (task_delay_ms < EXAMPLE_LVGL_TASK_MIN_DELAY_MS) { + task_delay_ms = EXAMPLE_LVGL_TASK_MIN_DELAY_MS; + } + vTaskDelay(pdMS_TO_TICKS(task_delay_ms)); + } +} + +void app_main(void) +{ + static lv_disp_draw_buf_t disp_buf; // contains internal graphic buffer(s) called draw buffer(s) + static lv_disp_drv_t disp_drv; // contains callback functions + + // 背光引脚配置 + ESP_LOGI(TAG, "Turn off LCD backlight"); + gpio_config_t bk_gpio_config = { + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = 1ULL << EXAMPLE_PIN_NUM_BK_LIGHT + }; + ESP_ERROR_CHECK(gpio_config(&bk_gpio_config)); + + ESP_LOGI(TAG, "Initialize SPI bus"); + const spi_bus_config_t buscfg = SPD2010_PANEL_BUS_QSPI_CONFIG(EXAMPLE_PIN_NUM_LCD_PCLK, + EXAMPLE_PIN_NUM_LCD_DATA0, + EXAMPLE_PIN_NUM_LCD_DATA1, + EXAMPLE_PIN_NUM_LCD_DATA2, + EXAMPLE_PIN_NUM_LCD_DATA3, + EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES * LCD_BIT_PER_PIXEL / 8); + + ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO)); + + ESP_LOGI(TAG, "Install panel IO"); + esp_lcd_panel_io_handle_t io_handle = NULL; + const esp_lcd_panel_io_spi_config_t io_config = SPD2010_PANEL_IO_QSPI_CONFIG(EXAMPLE_PIN_NUM_LCD_CS, + example_notify_lvgl_flush_ready, + &disp_drv); + spd2010_vendor_config_t vendor_config = { + .flags = { + .use_qspi_interface = 1, + }, + }; + + // Attach the LCD to the SPI bus + ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)LCD_HOST, &io_config, &io_handle)); + + esp_lcd_panel_handle_t panel_handle = NULL; + const esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = EXAMPLE_PIN_NUM_LCD_RST, + .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, + .bits_per_pixel = LCD_BIT_PER_PIXEL, + .vendor_config = &vendor_config, + }; + ESP_LOGI(TAG, "Install SPD2010 panel driver"); + ESP_ERROR_CHECK(esp_lcd_new_panel_spd2010(io_handle, &panel_config, &panel_handle)); + + + ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle)); + ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle)); + // user can flush pre-defined pattern to the screen before we turn on the screen or backlight + ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle, true)); + + // 初始化I2C总线 + touch_mux = xSemaphoreCreateBinary(); + assert(touch_mux); + + ESP_LOGI(TAG, "Initialize I2C bus"); + const i2c_config_t i2c_conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = EXAMPLE_PIN_NUM_TOUCH_SDA, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = EXAMPLE_PIN_NUM_TOUCH_SCL, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = 400 * 1000, + }; + ESP_ERROR_CHECK(i2c_param_config(TOUCH_HOST, &i2c_conf)); + ESP_ERROR_CHECK(i2c_driver_install(TOUCH_HOST, i2c_conf.mode, 0, 0, 0)); + + // 触屏驱动IO句柄 + esp_lcd_panel_io_handle_t tp_io_handle = NULL; + const esp_lcd_panel_io_i2c_config_t tp_io_config = ESP_LCD_TOUCH_IO_I2C_SPD2010_CONFIG(); + + const esp_lcd_touch_config_t tp_cfg = { + .x_max = EXAMPLE_LCD_H_RES, + .y_max = EXAMPLE_LCD_V_RES, + .rst_gpio_num = EXAMPLE_PIN_NUM_TOUCH_RST, + .int_gpio_num = EXAMPLE_PIN_NUM_TOUCH_INT, + .levels = { + .reset = 0, + .interrupt = 0, + }, + .flags = { + .swap_xy = 0, + .mirror_x = 0, + .mirror_y = 0, + }, + .interrupt_callback = example_touch_isr_cb, + }; + + // Attach the TOUCH to the I2C bus + ESP_ERROR_CHECK(esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)TOUCH_HOST, &tp_io_config, &tp_io_handle)); + + // 初始化触摸驱动 + ESP_LOGI(TAG, "Initialize touch controller SPD2010"); + ESP_ERROR_CHECK(esp_lcd_touch_new_i2c_spd2010(tp_io_handle, &tp_cfg, &tp)); + + // 打开背光 + ESP_LOGI(TAG, "Turn on LCD backlight"); + gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL); + + // 初始化LVGL + ESP_LOGI(TAG, "Initialize LVGL library"); + lv_init(); + // alloc draw buffers used by LVGL + // it's recommended to choose the size of the draw buffer(s) to be at least 1/10 screen sized + lv_color_t *buf1 = heap_caps_malloc(EXAMPLE_LCD_H_RES * 10 * sizeof(lv_color_t), MALLOC_CAP_DMA); + assert(buf1); + lv_color_t *buf2 = heap_caps_malloc(EXAMPLE_LCD_H_RES * 10 * sizeof(lv_color_t), MALLOC_CAP_DMA); + assert(buf2); + // initialize LVGL draw buffers + lv_disp_draw_buf_init(&disp_buf, buf1, buf2, EXAMPLE_LCD_H_RES * 10); + + ESP_LOGI(TAG, "Register display driver to LVGL"); + lv_disp_drv_init(&disp_drv); + disp_drv.hor_res = EXAMPLE_LCD_H_RES; + disp_drv.ver_res = EXAMPLE_LCD_V_RES; + disp_drv.flush_cb = example_lvgl_flush_cb; + disp_drv.rounder_cb = example_lvgl_rounder_cb; + disp_drv.drv_update_cb = example_lvgl_update_cb; + disp_drv.draw_buf = &disp_buf; + disp_drv.user_data = panel_handle; + lv_disp_t *disp = lv_disp_drv_register(&disp_drv); + + ESP_LOGI(TAG, "Install LVGL tick timer"); + // Tick interface for LVGL (using esp_timer to generate 2ms periodic event) + const esp_timer_create_args_t lvgl_tick_timer_args = { + .callback = &example_increase_lvgl_tick, + .name = "lvgl_tick" + }; + esp_timer_handle_t lvgl_tick_timer = NULL; + ESP_ERROR_CHECK(esp_timer_create(&lvgl_tick_timer_args, &lvgl_tick_timer)); + ESP_ERROR_CHECK(esp_timer_start_periodic(lvgl_tick_timer, EXAMPLE_LVGL_TICK_PERIOD_MS * 1000)); + + static lv_indev_drv_t indev_drv; // Input device driver (Touch) + lv_indev_drv_init(&indev_drv); + indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.disp = disp; + indev_drv.read_cb = example_lvgl_touch_cb; + indev_drv.user_data = tp; + + lv_indev_drv_register(&indev_drv); + + + lvgl_mux = xSemaphoreCreateMutex(); + assert(lvgl_mux); + xTaskCreate(example_lvgl_port_task, "LVGL", EXAMPLE_LVGL_TASK_STACK_SIZE, NULL, EXAMPLE_LVGL_TASK_PRIORITY, NULL); + + ESP_LOGI(TAG, "Display LVGL demos"); + // Lock the mutex due to the LVGL APIs are not thread-safe + if (example_lvgl_lock(-1)) { + //lv_demo_widgets(); /* A widgets example */ + //lv_demo_music(); /* A modern, smartphone-like music player demo. */ + // lv_demo_stress(); /* A stress test for LVGL. */ + // lv_demo_benchmark(); /* A demo to measure the performance of LVGL or to compare different settings. */ + + // Release the mutex + example_lvgl_unlock(); + } +} + diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.c b/code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.c new file mode 100644 index 0000000..ed3f1d9 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.c @@ -0,0 +1,42 @@ +/* +* Copyright 2023 NXP +* NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in +* accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, +* activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to +* comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license +* terms, then you may not retain, install, activate or otherwise use the software. +*/ + + +/********************* + * INCLUDES + *********************/ +#include +#include "lvgl.h" +#include "custom.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/** + * Create a demo application + */ + +void custom_init(lv_ui *ui) +{ + /* Add your codes here */ +} + diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.h b/code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.h new file mode 100644 index 0000000..6339506 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.h @@ -0,0 +1,23 @@ +/* +* Copyright 2023 NXP +* NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in +* accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, +* activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to +* comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license +* terms, then you may not retain, install, activate or otherwise use the software. +*/ + +#ifndef __CUSTOM_H_ +#define __CUSTOM_H_ +#ifdef __cplusplus +extern "C" { +#endif + +#include "gui_guider.h" + +void custom_init(lv_ui *ui); + +#ifdef __cplusplus +} +#endif +#endif /* EVENT_CB_H_ */ diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.mk b/code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.mk new file mode 100644 index 0000000..39c992d --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/custom/custom.mk @@ -0,0 +1,7 @@ + +GEN_CSRCS += $(notdir $(wildcard $(PRJ_DIR)/custom/*.c)) + +DEPPATH += --dep-path $(PRJ_DIR)/custom +VPATH += :$(PRJ_DIR)/custom + +CFLAGS += "-I$(PRJ_DIR)/custom" diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/custom/lv_conf_ext.h b/code/08.gui/lvgl_spd2010_gui/main/ui/custom/lv_conf_ext.h new file mode 100644 index 0000000..9a1270e --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/custom/lv_conf_ext.h @@ -0,0 +1,42 @@ +/* +* Copyright 2023 NXP +* NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in +* accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, +* activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to +* comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license +* terms, then you may not retain, install, activate or otherwise use the software. +*/ + +/* + * lv_conf_ext.h for custom lvconf file. + * Created on: Feb 8, 2023 + * example : + * #undef LV_FONT_FMT_TXT_LARGE + * #define LV_FONT_FMT_TXT_LARGE 1 + */ + +#ifndef LV_CONF_EXT_H +#define LV_CONF_EXT_H + + +/* common code begin */ + + +/* common code end */ + + +#if LV_USE_GUIDER_SIMULATOR +/* code for simulator begin */ + + +/* code for simulator end */ +#else +/* code for board begin */ + + +/* code for board end */ +#endif + + + +#endif /* LV_CONF_EXT_H */ \ No newline at end of file diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/events_init.c b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/events_init.c new file mode 100644 index 0000000..d489d14 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/events_init.c @@ -0,0 +1,19 @@ +/* +* Copyright 2024 NXP +* NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in +* accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, +* activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to +* comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license +* terms, then you may not retain, install, activate or otherwise use the software. +*/ + +#include "events_init.h" +#include +#include "lvgl.h" + + + +void events_init(lv_ui *ui) +{ + +} diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/events_init.h b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/events_init.h new file mode 100644 index 0000000..c41097e --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/events_init.h @@ -0,0 +1,26 @@ +/* +* Copyright 2024 NXP +* NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in +* accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, +* activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to +* comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license +* terms, then you may not retain, install, activate or otherwise use the software. +*/ + + +#ifndef EVENTS_INIT_H_ +#define EVENTS_INIT_H_ +#ifdef __cplusplus +extern "C" { +#endif + +#include "gui_guider.h" + +void events_init(lv_ui *ui); + +void events_init_screen(lv_ui *ui); + +#ifdef __cplusplus +} +#endif +#endif /* EVENT_CB_H_ */ diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/generated.mk b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/generated.mk new file mode 100644 index 0000000..9c42df2 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/generated.mk @@ -0,0 +1,16 @@ +# images +include $(PRJ_DIR)/generated/images/images.mk + +# GUI Guider fonts +include $(PRJ_DIR)/generated/guider_fonts/guider_fonts.mk + +# GUI Guider customer fonts +include $(PRJ_DIR)/generated/guider_customer_fonts/guider_customer_fonts.mk + + +GEN_CSRCS += $(notdir $(wildcard $(PRJ_DIR)/generated/*.c)) + +DEPPATH += --dep-path $(PRJ_DIR)/generated +VPATH += :$(PRJ_DIR)/generated + +CFLAGS += "-I$(PRJ_DIR)/generated" \ No newline at end of file diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/gui_guider.c b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/gui_guider.c new file mode 100644 index 0000000..3e981c0 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/gui_guider.c @@ -0,0 +1,34 @@ +/* +* Copyright 2024 NXP +* NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in +* accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, +* activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to +* comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license +* terms, then you may not retain, install, activate or otherwise use the software. +*/ + +#include "lvgl.h" +#include +#include "gui_guider.h" + + +void ui_init_style(lv_style_t * style) +{ + if (style->prop_cnt > 1) + lv_style_reset(style); + else + lv_style_init(style); +} + +void init_scr_del_flag(lv_ui *ui) +{ + + ui->screen_del = true; +} + +void setup_ui(lv_ui *ui) +{ + init_scr_del_flag(ui); + setup_scr_screen(ui); + lv_scr_load(ui->screen); +} diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/gui_guider.h b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/gui_guider.h new file mode 100644 index 0000000..09af4a6 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/gui_guider.h @@ -0,0 +1,42 @@ +/* +* Copyright 2024 NXP +* NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in +* accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, +* activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to +* comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license +* terms, then you may not retain, install, activate or otherwise use the software. +*/ + +#ifndef GUI_GUIDER_H +#define GUI_GUIDER_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "lvgl.h" + +typedef struct +{ + + lv_obj_t *screen; + bool screen_del; + lv_obj_t *screen_btn_1; + lv_obj_t *screen_btn_1_label; + lv_obj_t *screen_chart_1; +}lv_ui; + +void ui_init_style(lv_style_t * style); +void init_scr_del_flag(lv_ui *ui); +void setup_ui(lv_ui *ui); +extern lv_ui guider_ui; + +void setup_scr_screen(lv_ui *ui); + +LV_FONT_DECLARE(lv_font_montserratMedium_16) +LV_FONT_DECLARE(lv_font_montserratMedium_12) + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_customer_fonts/guider_customer_fonts.h b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_customer_fonts/guider_customer_fonts.h new file mode 100644 index 0000000..b06d7d4 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_customer_fonts/guider_customer_fonts.h @@ -0,0 +1,21 @@ +/* +* Copyright 2023 NXP +* NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in +* accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, +* activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to +* comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license +* terms, then you may not retain, install, activate or otherwise use the software. +*/ + +#ifndef GUIDER_CUSTOMER_FONTS_H +#define GUIDER_CUSTOMER_FONTS_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "lv_font.h" + +#ifdef __cplusplus +} +#endif +#endif \ No newline at end of file diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_customer_fonts/guider_customer_fonts.mk b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_customer_fonts/guider_customer_fonts.mk new file mode 100644 index 0000000..0cc6a84 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_customer_fonts/guider_customer_fonts.mk @@ -0,0 +1,6 @@ +GEN_CSRCS += $(notdir $(wildcard $(PRJ_DIR)/generated/guider_customer_fonts/*.c)) + +DEPPATH += --dep-path $(PRJ_DIR)/generated/guider_customer_fonts +VPATH += :$(PRJ_DIR)/generated/guider_customer_fonts + +CFLAGS += "-I$(PRJ_DIR)/generated/guider_customer_fonts" \ No newline at end of file diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/guider_fonts.mk b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/guider_fonts.mk new file mode 100644 index 0000000..48804a4 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/guider_fonts.mk @@ -0,0 +1,6 @@ +GEN_CSRCS += $(notdir $(wildcard $(PRJ_DIR)/generated/guider_fonts/*.c)) + +DEPPATH += --dep-path $(PRJ_DIR)/generated/guider_fonts +VPATH += :$(PRJ_DIR)/generated/guider_fonts + +CFLAGS += "-I$(PRJ_DIR)/generated/guider_fonts" \ No newline at end of file diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/lv_font_montserratMedium_12.c b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/lv_font_montserratMedium_12.c new file mode 100644 index 0000000..8ac86e7 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/lv_font_montserratMedium_12.c @@ -0,0 +1,1880 @@ +/* + * Copyright 2024 NXP + * NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in + * accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to + * comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license + * terms, then you may not retain, install, activate or otherwise use the software. + */ +/******************************************************************************* + * Size: 12 px + * Bpp: 4 + * Opts: --user-data-dir=C:\Users\duruofu\AppData\Roaming\gui-guider --app-path=C:\NXP\GUI-Guider-1.6.1-GA\resources\app.asar --no-sandbox --no-zygote --lang=zh-CN --device-scale-factor=1.25 --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=5 --time-ticks-at-unix-epoch=-1717375277958826 --launch-time-ticks=92300759598 --mojo-platform-channel-handle=3020 --field-trial-handle=1732,i,14137332758556215245,7603498977609116181,131072 --disable-features=SpareRendererForSitePerProcess,WinRetrieveSuggestionsOnlyOnDemand /prefetch:1 + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRATMEDIUM_12 +#define LV_FONT_MONTSERRATMEDIUM_12 1 +#endif + +#if LV_FONT_MONTSERRATMEDIUM_12 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xf, 0x40, 0xf3, 0xf, 0x30, 0xf2, 0xe, 0x20, + 0xd1, 0x3, 0x0, 0x81, 0x1e, 0x30, + + /* U+0022 "\"" */ + 0x3c, 0x1e, 0x3b, 0xe, 0x3b, 0xe, 0x15, 0x7, + + /* U+0023 "#" */ + 0x0, 0x48, 0x3, 0xa0, 0x0, 0x6, 0x60, 0x58, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0x10, 0xa, 0x20, + 0x84, 0x0, 0x0, 0xc1, 0xa, 0x30, 0x0, 0xd, + 0x0, 0xb1, 0x0, 0xaf, 0xff, 0xff, 0xfb, 0x0, + 0x1c, 0x0, 0xd0, 0x0, 0x3, 0xa0, 0x1c, 0x0, + 0x0, + + /* U+0024 "$" */ + 0x0, 0x9, 0x20, 0x0, 0x0, 0x92, 0x0, 0x3, + 0xcf, 0xfb, 0x31, 0xf7, 0xa5, 0x74, 0x4e, 0x9, + 0x20, 0x1, 0xf9, 0xb2, 0x0, 0x2, 0xbf, 0xe8, + 0x0, 0x0, 0x97, 0xda, 0x0, 0x9, 0x24, 0xe5, + 0xb4, 0xa5, 0xba, 0x8, 0xef, 0xfa, 0x10, 0x0, + 0x92, 0x0, 0x0, 0x4, 0x10, 0x0, + + /* U+0025 "%" */ + 0xa, 0xc8, 0x0, 0xc, 0x10, 0x66, 0xa, 0x20, + 0x76, 0x0, 0x83, 0x7, 0x42, 0xc0, 0x0, 0x57, + 0xa, 0x2b, 0x20, 0x0, 0x9, 0xc6, 0x68, 0x5c, + 0x90, 0x0, 0x1, 0xc1, 0xc0, 0x67, 0x0, 0xa, + 0x43, 0x90, 0x2a, 0x0, 0x49, 0x1, 0xb0, 0x47, + 0x0, 0xc1, 0x0, 0x7b, 0xb1, + + /* U+0026 "&" */ + 0x0, 0x9e, 0xd4, 0x0, 0x0, 0x5c, 0x3, 0xd0, + 0x0, 0x4, 0xc0, 0x5c, 0x0, 0x0, 0xc, 0xbd, + 0x20, 0x0, 0x3, 0xde, 0x80, 0x10, 0x1, 0xe3, + 0x1d, 0x78, 0x80, 0x6b, 0x0, 0x1d, 0xf2, 0x4, + 0xf4, 0x13, 0xcf, 0x60, 0x6, 0xdf, 0xd6, 0x2b, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0x3c, 0x3b, 0x3b, 0x15, + + /* U+0028 "(" */ + 0xa, 0x71, 0xf1, 0x5c, 0x9, 0x80, 0xb6, 0xc, + 0x40, 0xd4, 0xc, 0x40, 0xb6, 0x9, 0x80, 0x5b, + 0x1, 0xf1, 0xa, 0x70, + + /* U+0029 ")" */ + 0x6b, 0x0, 0xf2, 0xb, 0x60, 0x7a, 0x5, 0xc0, + 0x4d, 0x3, 0xe0, 0x4d, 0x5, 0xc0, 0x7a, 0xb, + 0x60, 0xf1, 0x6b, 0x0, + + /* U+002A "*" */ + 0x0, 0xb0, 0x8, 0x9c, 0xb5, 0xb, 0xf8, 0x8, + 0x7c, 0x95, 0x0, 0xa0, 0x0, + + /* U+002B "+" */ + 0x0, 0xb, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, + 0xf, 0x0, 0x2, 0xee, 0xfe, 0xe2, 0x1, 0x1f, + 0x11, 0x0, 0x0, 0xf0, 0x0, + + /* U+002D "-" */ + 0x4f, 0xfd, 0x2, 0x22, + + /* U+002E "." */ + 0x2a, 0x4, 0xd0, + + /* U+002F "/" */ + 0x0, 0x0, 0x34, 0x0, 0x0, 0xb5, 0x0, 0x0, + 0xf0, 0x0, 0x5, 0xb0, 0x0, 0xa, 0x60, 0x0, + 0xe, 0x10, 0x0, 0x4c, 0x0, 0x0, 0x97, 0x0, + 0x0, 0xe2, 0x0, 0x3, 0xd0, 0x0, 0x8, 0x70, + 0x0, 0xd, 0x20, 0x0, 0x2d, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x9e, 0xe9, 0x0, 0xa, 0xd4, 0x4d, 0xa0, + 0x1f, 0x20, 0x2, 0xf1, 0x5e, 0x0, 0x0, 0xd5, + 0x6c, 0x0, 0x0, 0xc6, 0x5e, 0x0, 0x0, 0xd5, + 0x1f, 0x20, 0x2, 0xf1, 0xa, 0xd4, 0x4d, 0xa0, + 0x0, 0x9e, 0xe9, 0x0, + + /* U+0031 "1" */ + 0xef, 0xf3, 0x22, 0xf3, 0x0, 0xf3, 0x0, 0xf3, + 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, 0x0, 0xf3, + 0x0, 0xf3, + + /* U+0032 "2" */ + 0x19, 0xef, 0xc2, 0x8, 0xb4, 0x3a, 0xe0, 0x0, + 0x0, 0x2f, 0x10, 0x0, 0x5, 0xe0, 0x0, 0x2, + 0xe5, 0x0, 0x1, 0xd7, 0x0, 0x1, 0xd8, 0x0, + 0x1, 0xda, 0x22, 0x21, 0x8f, 0xff, 0xff, 0x70, + + /* U+0033 "3" */ + 0x9f, 0xff, 0xff, 0x1, 0x22, 0x2d, 0x80, 0x0, + 0x9, 0xb0, 0x0, 0x5, 0xf2, 0x0, 0x0, 0x7c, + 0xf8, 0x0, 0x0, 0x2, 0xf2, 0x0, 0x0, 0xe, + 0x4b, 0x94, 0x39, 0xf1, 0x3b, 0xff, 0xc3, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x9b, 0x0, 0x0, 0x4, 0xe1, 0x0, + 0x0, 0x1e, 0x50, 0x0, 0x0, 0xaa, 0x0, 0x0, + 0x5, 0xe1, 0xd, 0x40, 0x1e, 0x40, 0xd, 0x40, + 0x8f, 0xff, 0xff, 0xfd, 0x12, 0x22, 0x2e, 0x62, + 0x0, 0x0, 0xe, 0x40, + + /* U+0035 "5" */ + 0xc, 0xff, 0xff, 0x0, 0xe5, 0x22, 0x20, 0xf, + 0x10, 0x0, 0x1, 0xff, 0xeb, 0x30, 0x2, 0x23, + 0x9f, 0x10, 0x0, 0x0, 0xd6, 0x0, 0x0, 0xd, + 0x69, 0xb4, 0x38, 0xf1, 0x2a, 0xef, 0xc4, 0x0, + + /* U+0036 "6" */ + 0x0, 0x6d, 0xfd, 0x50, 0x8, 0xd5, 0x23, 0x20, + 0x1f, 0x20, 0x0, 0x0, 0x4d, 0x6d, 0xea, 0x10, + 0x6f, 0xc4, 0x3c, 0xa0, 0x5f, 0x30, 0x2, 0xf0, + 0x2f, 0x20, 0x2, 0xf0, 0xa, 0xc3, 0x2b, 0xa0, + 0x1, 0xaf, 0xfa, 0x10, + + /* U+0037 "7" */ + 0xaf, 0xff, 0xff, 0xba, 0x92, 0x22, 0xd7, 0x76, + 0x0, 0x3f, 0x10, 0x0, 0xa, 0x90, 0x0, 0x1, + 0xf2, 0x0, 0x0, 0x7c, 0x0, 0x0, 0xe, 0x50, + 0x0, 0x5, 0xe0, 0x0, 0x0, 0xc8, 0x0, 0x0, + + /* U+0038 "8" */ + 0x3, 0xcf, 0xea, 0x10, 0xe, 0x81, 0x2c, 0xa0, + 0x2f, 0x10, 0x5, 0xd0, 0xe, 0x70, 0x1b, 0x90, + 0x6, 0xff, 0xff, 0x20, 0x3f, 0x50, 0x18, 0xe0, + 0x6c, 0x0, 0x0, 0xf2, 0x3f, 0x61, 0x29, 0xe0, + 0x5, 0xcf, 0xfb, 0x20, + + /* U+0039 "9" */ + 0x7, 0xef, 0xc3, 0x6, 0xe3, 0x15, 0xe1, 0x98, + 0x0, 0xb, 0x87, 0xd2, 0x3, 0xfb, 0xa, 0xff, + 0xd9, 0xc0, 0x0, 0x10, 0x8b, 0x0, 0x0, 0xd, + 0x70, 0x62, 0x4b, 0xd0, 0x1c, 0xfe, 0xa1, 0x0, + + /* U+003A ":" */ + 0x4e, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xa0, 0x4d, 0x0, + + /* U+003B ";" */ + 0x4e, 0x2, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x80, 0x4f, 0x10, 0xd0, 0x38, 0x0, + + /* U+003C "<" */ + 0x0, 0x0, 0x2, 0x10, 0x0, 0x4b, 0xe1, 0x7, + 0xdc, 0x50, 0x3, 0xf8, 0x0, 0x0, 0x4, 0xbe, + 0x71, 0x0, 0x0, 0x29, 0xe2, 0x0, 0x0, 0x0, + 0x0, + + /* U+003D "=" */ + 0x3f, 0xff, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xee, 0xee, 0xe2, 0x1, 0x11, + 0x11, 0x0, + + /* U+003E ">" */ + 0x12, 0x0, 0x0, 0x2, 0xeb, 0x40, 0x0, 0x0, + 0x5c, 0xd6, 0x0, 0x0, 0x8, 0xf2, 0x1, 0x7e, + 0xb4, 0x2, 0xe9, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+003F "?" */ + 0x1a, 0xef, 0xc3, 0x9, 0xa3, 0x2a, 0xe0, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0xa, 0xa0, 0x0, 0x9, + 0xc0, 0x0, 0x2, 0xf1, 0x0, 0x0, 0x1, 0x0, + 0x0, 0x2, 0x80, 0x0, 0x0, 0x4d, 0x0, 0x0, + + /* U+0040 "@" */ + 0x0, 0x4, 0xbd, 0xdd, 0x81, 0x0, 0x0, 0x9b, + 0x30, 0x0, 0x6d, 0x30, 0x7, 0xa0, 0x8e, 0xe8, + 0xd5, 0xd1, 0xd, 0x7, 0xd2, 0x19, 0xf3, 0x77, + 0x4a, 0xd, 0x40, 0x0, 0xf3, 0x1b, 0x58, 0xf, + 0x20, 0x0, 0xd3, 0xc, 0x58, 0xd, 0x40, 0x0, + 0xf3, 0x1b, 0x3a, 0x7, 0xd2, 0x1a, 0xf5, 0x77, + 0xd, 0x0, 0x8e, 0xe8, 0x5f, 0xb0, 0x6, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9b, 0x30, 0x2, + 0x40, 0x0, 0x0, 0x5, 0xbd, 0xed, 0x60, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x6f, 0x30, 0x0, 0x0, 0x0, 0xdd, + 0x90, 0x0, 0x0, 0x4, 0xe3, 0xf1, 0x0, 0x0, + 0xb, 0x80, 0xc7, 0x0, 0x0, 0x1f, 0x20, 0x6e, + 0x0, 0x0, 0x8c, 0x0, 0x1f, 0x50, 0x0, 0xef, + 0xee, 0xef, 0xb0, 0x6, 0xe2, 0x11, 0x14, 0xf2, + 0xc, 0x70, 0x0, 0x0, 0xb9, + + /* U+0042 "B" */ + 0xbf, 0xff, 0xfb, 0x20, 0xb7, 0x11, 0x2a, 0xd0, + 0xb7, 0x0, 0x3, 0xf0, 0xb7, 0x0, 0x8, 0xc0, + 0xbf, 0xff, 0xff, 0x50, 0xb8, 0x22, 0x26, 0xf2, + 0xb7, 0x0, 0x0, 0xc7, 0xb7, 0x11, 0x15, 0xf4, + 0xbf, 0xff, 0xfd, 0x60, + + /* U+0043 "C" */ + 0x0, 0x3b, 0xef, 0xb3, 0x0, 0x5f, 0x93, 0x38, + 0xe0, 0xe, 0x60, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x4, 0xe0, + 0x0, 0x0, 0x0, 0xe, 0x60, 0x0, 0x0, 0x0, + 0x5f, 0x93, 0x38, 0xe0, 0x0, 0x3b, 0xff, 0xb3, + 0x0, + + /* U+0044 "D" */ + 0xbf, 0xff, 0xea, 0x30, 0xb, 0x82, 0x23, 0x9f, + 0x40, 0xb7, 0x0, 0x0, 0x7e, 0xb, 0x70, 0x0, + 0x0, 0xf3, 0xb7, 0x0, 0x0, 0xe, 0x5b, 0x70, + 0x0, 0x0, 0xf3, 0xb7, 0x0, 0x0, 0x7e, 0xb, + 0x82, 0x23, 0x9f, 0x40, 0xbf, 0xff, 0xeb, 0x30, + 0x0, + + /* U+0045 "E" */ + 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, + 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, + 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x50, + + /* U+0046 "F" */ + 0xbf, 0xff, 0xff, 0x3b, 0x82, 0x22, 0x20, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xbf, 0xff, + 0xfa, 0xb, 0x82, 0x22, 0x10, 0xb7, 0x0, 0x0, + 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x3b, 0xef, 0xc4, 0x0, 0x5f, 0x94, 0x38, + 0xe1, 0xe, 0x70, 0x0, 0x0, 0x4, 0xe0, 0x0, + 0x0, 0x0, 0x6c, 0x0, 0x0, 0x8, 0x24, 0xe0, + 0x0, 0x0, 0xe3, 0xe, 0x60, 0x0, 0xe, 0x30, + 0x5f, 0x93, 0x37, 0xf3, 0x0, 0x3b, 0xef, 0xc4, + 0x0, + + /* U+0048 "H" */ + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xbf, 0xff, 0xff, 0xf7, 0xb8, 0x22, 0x22, 0xc7, + 0xb7, 0x0, 0x0, 0xb7, 0xb7, 0x0, 0x0, 0xb7, + 0xb7, 0x0, 0x0, 0xb7, + + /* U+0049 "I" */ + 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, + 0xb7, + + /* U+004A "J" */ + 0x4, 0xff, 0xff, 0x0, 0x22, 0x5f, 0x0, 0x0, + 0x3f, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x3f, 0x0, + 0x0, 0x3f, 0x0, 0x0, 0x4e, 0xd, 0x52, 0xba, + 0x5, 0xdf, 0xb2, + + /* U+004B "K" */ + 0xb7, 0x0, 0x7, 0xd1, 0xb7, 0x0, 0x5e, 0x20, + 0xb7, 0x4, 0xe3, 0x0, 0xb7, 0x3e, 0x40, 0x0, + 0xb9, 0xef, 0x20, 0x0, 0xbf, 0x89, 0xd0, 0x0, + 0xba, 0x0, 0xca, 0x0, 0xb7, 0x0, 0x1e, 0x70, + 0xb7, 0x0, 0x3, 0xf3, + + /* U+004C "L" */ + 0xb7, 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, + 0x0, 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0xb, 0x82, 0x22, 0x20, 0xbf, 0xff, 0xff, 0x0, + + /* U+004D "M" */ + 0xb8, 0x0, 0x0, 0x1, 0xf3, 0xbf, 0x10, 0x0, + 0x9, 0xf3, 0xbe, 0xa0, 0x0, 0x2e, 0xf3, 0xb7, + 0xe3, 0x0, 0xb7, 0xf3, 0xb6, 0x7b, 0x4, 0xd0, + 0xf3, 0xb6, 0xd, 0x4c, 0x50, 0xf3, 0xb6, 0x5, + 0xfc, 0x0, 0xf3, 0xb6, 0x0, 0xb3, 0x0, 0xf3, + 0xb6, 0x0, 0x0, 0x0, 0xf3, + + /* U+004E "N" */ + 0xb9, 0x0, 0x0, 0xb7, 0xbf, 0x50, 0x0, 0xb7, + 0xbc, 0xf2, 0x0, 0xb7, 0xb7, 0xad, 0x0, 0xb7, + 0xb7, 0xd, 0x90, 0xb7, 0xb7, 0x2, 0xf5, 0xb7, + 0xb7, 0x0, 0x6f, 0xd7, 0xb7, 0x0, 0xa, 0xf7, + 0xb7, 0x0, 0x0, 0xd7, + + /* U+004F "O" */ + 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x5, 0xf9, 0x33, + 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, + 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, + 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd5, 0xe, 0x60, + 0x0, 0x5, 0xf1, 0x5, 0xf9, 0x33, 0x8f, 0x60, + 0x0, 0x3b, 0xef, 0xb4, 0x0, + + /* U+0050 "P" */ + 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, + 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, + 0xb7, 0x0, 0x2c, 0xa0, 0xbf, 0xff, 0xfa, 0x10, + 0xb8, 0x22, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, + 0xb7, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x3b, 0xef, 0xb4, 0x0, 0x4, 0xf9, 0x33, + 0x8f, 0x60, 0xe, 0x60, 0x0, 0x5, 0xf1, 0x4e, + 0x0, 0x0, 0x0, 0xd5, 0x6c, 0x0, 0x0, 0x0, + 0xb7, 0x4e, 0x0, 0x0, 0x0, 0xd6, 0xf, 0x60, + 0x0, 0x5, 0xf1, 0x5, 0xf8, 0x32, 0x7f, 0x60, + 0x0, 0x4c, 0xff, 0xc5, 0x0, 0x0, 0x0, 0xc, + 0xb0, 0x28, 0x0, 0x0, 0x1, 0xbf, 0xe5, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+0052 "R" */ + 0xbf, 0xff, 0xd8, 0x0, 0xb8, 0x22, 0x5d, 0x90, + 0xb7, 0x0, 0x4, 0xe0, 0xb7, 0x0, 0x3, 0xf0, + 0xb7, 0x0, 0x1b, 0xb0, 0xbf, 0xff, 0xfb, 0x10, + 0xb8, 0x22, 0xb9, 0x0, 0xb7, 0x0, 0x1f, 0x30, + 0xb7, 0x0, 0x7, 0xd0, + + /* U+0053 "S" */ + 0x3, 0xcf, 0xeb, 0x31, 0xf7, 0x23, 0x74, 0x4e, + 0x0, 0x0, 0x1, 0xf9, 0x20, 0x0, 0x2, 0xbf, + 0xd7, 0x0, 0x0, 0x4, 0xca, 0x0, 0x0, 0x4, + 0xe5, 0xb4, 0x23, 0xbb, 0x8, 0xdf, 0xea, 0x10, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xf2, 0x23, 0xf3, 0x22, 0x0, + 0x1f, 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, + 0x10, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, + 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1f, 0x10, 0x0, + + /* U+0055 "U" */ + 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, + 0xd6, 0x0, 0x0, 0xe4, 0xd6, 0x0, 0x0, 0xe4, + 0xd6, 0x0, 0x0, 0xe4, 0xc7, 0x0, 0x0, 0xf3, + 0x9a, 0x0, 0x2, 0xf1, 0x2f, 0x83, 0x5d, 0xa0, + 0x4, 0xcf, 0xd8, 0x0, + + /* U+0056 "V" */ + 0xc, 0x70, 0x0, 0x0, 0xd5, 0x6, 0xe0, 0x0, + 0x4, 0xe0, 0x0, 0xf4, 0x0, 0xa, 0x80, 0x0, + 0x9b, 0x0, 0x1f, 0x20, 0x0, 0x2f, 0x20, 0x7b, + 0x0, 0x0, 0xc, 0x80, 0xe4, 0x0, 0x0, 0x5, + 0xe5, 0xe0, 0x0, 0x0, 0x0, 0xee, 0x70, 0x0, + 0x0, 0x0, 0x8f, 0x10, 0x0, + + /* U+0057 "W" */ + 0x7c, 0x0, 0x0, 0xe8, 0x0, 0x2, 0xf0, 0x2f, + 0x10, 0x3, 0xfd, 0x0, 0x7, 0xa0, 0xd, 0x60, + 0x8, 0x9f, 0x20, 0xc, 0x50, 0x8, 0xb0, 0xe, + 0x3b, 0x70, 0x1f, 0x0, 0x3, 0xf0, 0x3e, 0x6, + 0xc0, 0x6b, 0x0, 0x0, 0xe5, 0x89, 0x1, 0xf1, + 0xb6, 0x0, 0x0, 0x9a, 0xd4, 0x0, 0xb7, 0xf1, + 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x6f, 0xc0, 0x0, + 0x0, 0xf, 0xa0, 0x0, 0x1f, 0x70, 0x0, + + /* U+0058 "X" */ + 0x5f, 0x10, 0x0, 0xe5, 0xa, 0xb0, 0x9, 0xa0, + 0x1, 0xe6, 0x4e, 0x10, 0x0, 0x4f, 0xe4, 0x0, + 0x0, 0xd, 0xe0, 0x0, 0x0, 0x7d, 0xd8, 0x0, + 0x2, 0xf3, 0x2f, 0x30, 0xc, 0x80, 0x7, 0xd0, + 0x8d, 0x0, 0x0, 0xc9, + + /* U+0059 "Y" */ + 0xc, 0x80, 0x0, 0xa, 0x80, 0x3f, 0x10, 0x3, + 0xe0, 0x0, 0xaa, 0x0, 0xc6, 0x0, 0x1, 0xf3, + 0x5d, 0x0, 0x0, 0x7, 0xce, 0x40, 0x0, 0x0, + 0xe, 0xb0, 0x0, 0x0, 0x0, 0xb7, 0x0, 0x0, + 0x0, 0xb, 0x70, 0x0, 0x0, 0x0, 0xb7, 0x0, + 0x0, + + /* U+005A "Z" */ + 0x6f, 0xff, 0xff, 0xf5, 0x2, 0x22, 0x29, 0xd0, + 0x0, 0x0, 0x3f, 0x30, 0x0, 0x1, 0xe6, 0x0, + 0x0, 0xb, 0xa0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x4, 0xf2, 0x0, 0x0, 0x1e, 0x82, 0x22, 0x21, + 0x7f, 0xff, 0xff, 0xf8, + + /* U+005B "[" */ + 0xbf, 0xcb, 0x60, 0xb6, 0xb, 0x60, 0xb6, 0xb, + 0x60, 0xb6, 0xb, 0x60, 0xb6, 0xb, 0x60, 0xb6, + 0xb, 0x60, 0xbf, 0xc0, + + /* U+005C "\\" */ + 0x35, 0x0, 0x0, 0x2e, 0x0, 0x0, 0xd, 0x30, + 0x0, 0x8, 0x80, 0x0, 0x3, 0xd0, 0x0, 0x0, + 0xd2, 0x0, 0x0, 0x87, 0x0, 0x0, 0x3c, 0x0, + 0x0, 0xe, 0x10, 0x0, 0x9, 0x70, 0x0, 0x4, + 0xc0, 0x0, 0x0, 0xe1, 0x0, 0x0, 0xa6, + + /* U+005D "]" */ + 0xcf, 0xb0, 0x7b, 0x6, 0xb0, 0x6b, 0x6, 0xb0, + 0x6b, 0x6, 0xb0, 0x6b, 0x6, 0xb0, 0x6b, 0x6, + 0xb0, 0x7b, 0xcf, 0xb0, + + /* U+005E "^" */ + 0x0, 0x7, 0x0, 0x0, 0x5, 0xe5, 0x0, 0x0, + 0xb4, 0xb0, 0x0, 0x2c, 0xc, 0x20, 0x8, 0x60, + 0x68, 0x0, 0xd0, 0x0, 0xd0, + + /* U+005F "_" */ + 0xdd, 0xdd, 0xdd, + + /* U+0060 "`" */ + 0x27, 0x10, 0x5, 0xc1, + + /* U+0061 "a" */ + 0x8, 0xdf, 0xc3, 0x0, 0xa4, 0x29, 0xd0, 0x0, + 0x0, 0x1f, 0x10, 0x8d, 0xee, 0xf2, 0x4e, 0x10, + 0xf, 0x24, 0xe0, 0x7, 0xf2, 0x9, 0xed, 0x8f, + 0x20, + + /* U+0062 "b" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x7c, 0xfc, 0x40, 0xef, 0x52, + 0x8f, 0x2e, 0x60, 0x0, 0xb8, 0xe4, 0x0, 0x8, + 0xae, 0x60, 0x0, 0xb8, 0xef, 0x52, 0x8f, 0x2e, + 0x6d, 0xfc, 0x40, + + /* U+0063 "c" */ + 0x2, 0xbf, 0xe8, 0x0, 0xda, 0x24, 0xc3, 0x5d, + 0x0, 0x0, 0x7, 0xb0, 0x0, 0x0, 0x5d, 0x0, + 0x0, 0x0, 0xda, 0x24, 0xd3, 0x2, 0xbf, 0xe8, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, + 0x0, 0x0, 0x1, 0xf1, 0x2, 0xbf, 0xd6, 0xf1, + 0xe, 0x92, 0x3d, 0xf1, 0x5d, 0x0, 0x4, 0xf1, + 0x7b, 0x0, 0x1, 0xf1, 0x5d, 0x0, 0x3, 0xf1, + 0xe, 0x91, 0x2d, 0xf1, 0x2, 0xbf, 0xe6, 0xf1, + + /* U+0065 "e" */ + 0x2, 0xbf, 0xd5, 0x0, 0xe8, 0x14, 0xe4, 0x5c, + 0x0, 0x6, 0xb7, 0xfe, 0xee, 0xec, 0x5d, 0x0, + 0x0, 0x0, 0xe9, 0x23, 0xa2, 0x2, 0xbf, 0xe9, + 0x0, + + /* U+0066 "f" */ + 0x1, 0xcf, 0x60, 0x9a, 0x11, 0xb, 0x60, 0xd, + 0xff, 0xf3, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, + 0x60, 0x0, 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, + 0x0, + + /* U+0067 "g" */ + 0x2, 0xbf, 0xe6, 0xe2, 0xe, 0xa2, 0x3c, 0xf2, + 0x5d, 0x0, 0x2, 0xf2, 0x7b, 0x0, 0x0, 0xf2, + 0x5d, 0x0, 0x2, 0xf2, 0xe, 0xa2, 0x3d, 0xf2, + 0x2, 0xbf, 0xe5, 0xf2, 0x0, 0x0, 0x2, 0xf0, + 0xc, 0x62, 0x3b, 0xa0, 0x6, 0xdf, 0xea, 0x10, + + /* U+0068 "h" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x7d, 0xfc, 0x20, 0xee, 0x42, + 0xac, 0xe, 0x60, 0x2, 0xf0, 0xe4, 0x0, 0xf, + 0x1e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, 0x2e, + 0x40, 0x0, 0xf2, + + /* U+0069 "i" */ + 0xd, 0x40, 0x82, 0x0, 0x0, 0xe4, 0xe, 0x40, + 0xe4, 0xe, 0x40, 0xe4, 0xe, 0x40, 0xe4, + + /* U+006A "j" */ + 0x0, 0xd, 0x50, 0x0, 0x72, 0x0, 0x0, 0x0, + 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, 0xd4, 0x0, + 0xd, 0x40, 0x0, 0xd4, 0x0, 0xd, 0x40, 0x0, + 0xd4, 0x0, 0xd, 0x40, 0x22, 0xf2, 0xd, 0xf8, + 0x0, + + /* U+006B "k" */ + 0xe4, 0x0, 0x0, 0xe, 0x40, 0x0, 0x0, 0xe4, + 0x0, 0x0, 0xe, 0x40, 0xb, 0xa0, 0xe4, 0xb, + 0xb0, 0xe, 0x4b, 0xc0, 0x0, 0xee, 0xfd, 0x0, + 0xe, 0xc1, 0xd9, 0x0, 0xe4, 0x2, 0xf4, 0xe, + 0x40, 0x6, 0xe1, + + /* U+006C "l" */ + 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, 0xe4, + 0xe4, 0xe4, + + /* U+006D "m" */ + 0xe7, 0xdf, 0xb2, 0x9e, 0xe8, 0xe, 0xd3, 0x2c, + 0xfb, 0x23, 0xe5, 0xe6, 0x0, 0x4f, 0x10, 0x9, + 0x9e, 0x40, 0x3, 0xf0, 0x0, 0x8a, 0xe4, 0x0, + 0x3f, 0x0, 0x8, 0xae, 0x40, 0x3, 0xf0, 0x0, + 0x8a, 0xe4, 0x0, 0x3f, 0x0, 0x8, 0xa0, + + /* U+006E "n" */ + 0xe6, 0xdf, 0xc2, 0xe, 0xe4, 0x1a, 0xc0, 0xe6, + 0x0, 0x1f, 0xe, 0x40, 0x0, 0xf1, 0xe4, 0x0, + 0xf, 0x2e, 0x40, 0x0, 0xf2, 0xe4, 0x0, 0xf, + 0x20, + + /* U+006F "o" */ + 0x2, 0xbf, 0xe8, 0x0, 0xe, 0xa2, 0x3e, 0x80, + 0x5d, 0x0, 0x4, 0xf0, 0x7b, 0x0, 0x1, 0xf1, + 0x5d, 0x0, 0x4, 0xf0, 0xd, 0xa2, 0x3e, 0x80, + 0x2, 0xbf, 0xe8, 0x0, + + /* U+0070 "p" */ + 0xe7, 0xdf, 0xc4, 0xe, 0xf4, 0x16, 0xf2, 0xe6, + 0x0, 0xa, 0x8e, 0x40, 0x0, 0x8a, 0xe7, 0x0, + 0xb, 0x8e, 0xf5, 0x28, 0xf2, 0xe6, 0xcf, 0xc4, + 0xe, 0x40, 0x0, 0x0, 0xe4, 0x0, 0x0, 0xe, + 0x40, 0x0, 0x0, + + /* U+0071 "q" */ + 0x2, 0xbf, 0xd5, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, + 0x5d, 0x0, 0x4, 0xf1, 0x7b, 0x0, 0x1, 0xf1, + 0x5d, 0x0, 0x4, 0xf1, 0xe, 0xa2, 0x3e, 0xf1, + 0x2, 0xbf, 0xd5, 0xf1, 0x0, 0x0, 0x1, 0xf1, + 0x0, 0x0, 0x1, 0xf1, 0x0, 0x0, 0x1, 0xf1, + + /* U+0072 "r" */ + 0xe6, 0xd8, 0xee, 0x61, 0xe7, 0x0, 0xe4, 0x0, + 0xe4, 0x0, 0xe4, 0x0, 0xe4, 0x0, + + /* U+0073 "s" */ + 0x9, 0xef, 0xc2, 0x6d, 0x22, 0x61, 0x7d, 0x20, + 0x0, 0x9, 0xfe, 0x91, 0x0, 0x2, 0xc9, 0x56, + 0x22, 0xb8, 0x4c, 0xfe, 0xa0, + + /* U+0074 "t" */ + 0x5, 0x30, 0x0, 0xb6, 0x0, 0xdf, 0xff, 0x30, + 0xb6, 0x0, 0xb, 0x60, 0x0, 0xb6, 0x0, 0xb, + 0x60, 0x0, 0xaa, 0x11, 0x2, 0xdf, 0x60, + + /* U+0075 "u" */ + 0xf3, 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xf3, + 0x0, 0x2f, 0xf, 0x30, 0x2, 0xf0, 0xe4, 0x0, + 0x4f, 0xa, 0xb2, 0x2c, 0xf0, 0x1b, 0xfe, 0x6f, + 0x0, + + /* U+0076 "v" */ + 0xd, 0x50, 0x0, 0x98, 0x6, 0xc0, 0x0, 0xf2, + 0x1, 0xf2, 0x6, 0xb0, 0x0, 0xa8, 0xc, 0x50, + 0x0, 0x3e, 0x3e, 0x0, 0x0, 0xd, 0xd8, 0x0, + 0x0, 0x6, 0xf2, 0x0, + + /* U+0077 "w" */ + 0xc5, 0x0, 0x3f, 0x10, 0x7, 0x86, 0xa0, 0x9, + 0xf6, 0x0, 0xd3, 0x1f, 0x0, 0xe7, 0xb0, 0x2d, + 0x0, 0xb5, 0x4c, 0xe, 0x18, 0x80, 0x6, 0xa9, + 0x60, 0xa6, 0xd3, 0x0, 0x1f, 0xe1, 0x4, 0xed, + 0x0, 0x0, 0xbb, 0x0, 0xe, 0x80, 0x0, + + /* U+0078 "x" */ + 0x5d, 0x0, 0x4e, 0x10, 0xa9, 0x1e, 0x40, 0x1, + 0xed, 0x90, 0x0, 0x8, 0xf1, 0x0, 0x2, 0xeb, + 0xa0, 0x0, 0xc7, 0xd, 0x60, 0x7c, 0x0, 0x3f, + 0x20, + + /* U+0079 "y" */ + 0xd, 0x50, 0x0, 0x98, 0x7, 0xb0, 0x0, 0xe2, + 0x1, 0xf2, 0x5, 0xc0, 0x0, 0xa7, 0xb, 0x50, + 0x0, 0x4d, 0x1e, 0x0, 0x0, 0xe, 0xb9, 0x0, + 0x0, 0x8, 0xf3, 0x0, 0x0, 0x5, 0xd0, 0x0, + 0x5, 0x2c, 0x60, 0x0, 0x1c, 0xf9, 0x0, 0x0, + + /* U+007A "z" */ + 0x7f, 0xff, 0xfb, 0x0, 0x2, 0xf3, 0x0, 0xc, + 0x70, 0x0, 0x9b, 0x0, 0x4, 0xe1, 0x0, 0x1e, + 0x50, 0x0, 0x8f, 0xff, 0xfd, + + /* U+007B "{" */ + 0x0, 0xbf, 0x4, 0xe1, 0x5, 0xc0, 0x5, 0xc0, + 0x5, 0xc0, 0x6, 0xc0, 0x4f, 0x60, 0x8, 0xc0, + 0x5, 0xc0, 0x5, 0xc0, 0x5, 0xc0, 0x4, 0xe1, + 0x0, 0xbf, + + /* U+007C "|" */ + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + 0xb5, 0xb5, 0xb5, 0xb5, 0xb5, + + /* U+007D "}" */ + 0xcd, 0x10, 0xc, 0x70, 0x9, 0x90, 0x9, 0x90, + 0x9, 0x90, 0x8, 0xa0, 0x3, 0xf7, 0x8, 0xb0, + 0x9, 0x90, 0x9, 0x90, 0x9, 0x90, 0xc, 0x80, + 0xcd, 0x20, + + /* U+007E "~" */ + 0xb, 0xe8, 0xa, 0x33, 0x91, 0x8d, 0xa0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x12, 0x0, 0x0, + 0x0, 0x3, 0x7c, 0xff, 0x0, 0x0, 0x59, 0xef, + 0xff, 0xff, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xf, 0xff, 0xfd, 0x84, 0x8f, 0x0, 0xf, + 0xd7, 0x20, 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, + 0x0, 0x8f, 0x0, 0xf, 0x80, 0x0, 0x0, 0x8f, + 0x0, 0xf, 0x80, 0x0, 0x7b, 0xdf, 0x2, 0x3f, + 0x80, 0x6, 0xff, 0xff, 0xaf, 0xff, 0x80, 0x2, + 0xef, 0xf9, 0xef, 0xff, 0x60, 0x0, 0x2, 0x10, + 0x29, 0xa7, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, 0xe8, 0xe7, + 0x22, 0x22, 0x7e, 0x8e, 0xc0, 0xc5, 0x0, 0x0, + 0x6c, 0xc, 0xfc, 0xf6, 0x11, 0x11, 0x7f, 0xcf, + 0xc0, 0xcf, 0xff, 0xff, 0xfb, 0xc, 0xfc, 0xf6, + 0x11, 0x11, 0x7f, 0xcf, 0xc0, 0xc5, 0x0, 0x0, + 0x6c, 0xc, 0xe8, 0xe7, 0x22, 0x22, 0x7e, 0x8e, + 0xb4, 0xdf, 0xff, 0xff, 0xfd, 0x4b, + + /* U+F00B "" */ + 0xdf, 0xf6, 0x9f, 0xff, 0xff, 0xfd, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xef, 0xf6, 0xaf, 0xff, + 0xff, 0xfe, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, + 0xff, 0xf7, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xbf, 0xff, + 0xff, 0xff, 0x13, 0x20, 0x3, 0x33, 0x33, 0x31, + 0xef, 0xf6, 0xaf, 0xff, 0xff, 0xfe, 0xff, 0xf8, + 0xcf, 0xff, 0xff, 0xff, 0xdf, 0xf6, 0xaf, 0xff, + 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0xd4, 0x0, 0x0, + 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x3, + 0xff, 0xf4, 0x4d, 0x30, 0x0, 0x3f, 0xff, 0x40, + 0xef, 0xf3, 0x3, 0xff, 0xf4, 0x0, 0x4f, 0xff, + 0x6f, 0xff, 0x40, 0x0, 0x4, 0xff, 0xff, 0xf4, + 0x0, 0x0, 0x0, 0x4f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x3, 0xd3, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x14, 0x0, 0x0, 0x22, 0xd, 0xf7, 0x0, 0x4f, + 0xf1, 0x9f, 0xf7, 0x4f, 0xfd, 0x0, 0xaf, 0xff, + 0xfd, 0x10, 0x0, 0xbf, 0xfe, 0x10, 0x0, 0x4f, + 0xff, 0xf7, 0x0, 0x4f, 0xfd, 0xaf, 0xf7, 0xe, + 0xfd, 0x10, 0xaf, 0xf2, 0x5b, 0x10, 0x0, 0x99, + 0x0, + + /* U+F011 "" */ + 0x0, 0x0, 0x7, 0x70, 0x0, 0x0, 0x0, 0x32, + 0xf, 0xf0, 0x24, 0x0, 0x5, 0xfc, 0xf, 0xf0, + 0xcf, 0x50, 0x1f, 0xf4, 0xf, 0xf0, 0x5f, 0xf1, + 0x7f, 0x80, 0xf, 0xf0, 0x8, 0xf7, 0xbf, 0x20, + 0xf, 0xf0, 0x2, 0xfb, 0xcf, 0x10, 0xe, 0xe0, + 0x1, 0xfc, 0xaf, 0x40, 0x1, 0x10, 0x4, 0xfa, + 0x5f, 0xb0, 0x0, 0x0, 0xb, 0xf6, 0xd, 0xfa, + 0x10, 0x1, 0xaf, 0xd0, 0x2, 0xdf, 0xfc, 0xcf, + 0xfd, 0x20, 0x0, 0x8, 0xef, 0xfe, 0x91, 0x0, + 0x0, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x14, 0x41, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x3, 0x43, 0xdf, 0xfd, + 0x34, 0x30, 0xe, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0x1b, 0xff, + 0x70, 0x7, 0xff, 0xb1, 0x7, 0xff, 0x20, 0x2, + 0xff, 0x70, 0x1b, 0xff, 0x70, 0x7, 0xff, 0xb1, + 0x6f, 0xff, 0xfb, 0xbf, 0xff, 0xf6, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x3, 0x42, 0xcf, 0xfc, + 0x23, 0x30, 0x0, 0x0, 0x7f, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x4, 0x41, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x73, 0x3, 0x83, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x67, 0xf7, 0x0, 0x0, 0x3, + 0xee, 0x5a, 0xfe, 0xf7, 0x0, 0x0, 0x6f, 0xd3, + 0xb5, 0x7f, 0xf7, 0x0, 0x9, 0xfb, 0x3d, 0xff, + 0x85, 0xfe, 0x30, 0xbf, 0x95, 0xff, 0xff, 0xfb, + 0x3e, 0xf4, 0x76, 0x6f, 0xff, 0xff, 0xff, 0xd2, + 0xa1, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, + 0xcf, 0xfa, 0x2, 0xff, 0xf4, 0x0, 0x0, 0xaf, + 0xf8, 0x1, 0xff, 0xf3, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x27, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0xfd, 0x0, 0x0, 0x4f, 0xff, 0xff, + 0xf4, 0x0, 0x0, 0x4, 0xff, 0xff, 0x40, 0x0, + 0x23, 0x33, 0x5f, 0xf5, 0x33, 0x32, 0xff, 0xff, + 0xa4, 0x4a, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, + 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, + + /* U+F01C "" */ + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xb0, 0x0, 0x1, + 0xed, 0x88, 0x88, 0x89, 0xf8, 0x0, 0xa, 0xf2, + 0x0, 0x0, 0x0, 0xaf, 0x30, 0x5f, 0x70, 0x0, + 0x0, 0x0, 0x1e, 0xc0, 0xef, 0x88, 0x60, 0x0, + 0x28, 0x8b, 0xf6, 0xff, 0xff, 0xf3, 0x0, 0xbf, + 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+F021 "" */ + 0x0, 0x0, 0x1, 0x10, 0x0, 0x59, 0x0, 0x19, + 0xef, 0xfd, 0x70, 0x9f, 0x3, 0xef, 0xda, 0x9d, + 0xfe, 0xbf, 0xe, 0xf6, 0x0, 0x0, 0x5f, 0xff, + 0x7f, 0x70, 0x0, 0x3f, 0xff, 0xff, 0x69, 0x0, + 0x0, 0x2a, 0xaa, 0xa9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaa, 0xaa, 0xa2, 0x0, 0x0, 0xa6, + 0xff, 0xfe, 0xf3, 0x0, 0x7, 0xf7, 0xff, 0xf5, + 0x0, 0x0, 0x7f, 0xe0, 0xfb, 0xef, 0xd9, 0xad, + 0xfe, 0x30, 0xfa, 0x8, 0xef, 0xfe, 0x91, 0x0, + 0x95, 0x0, 0x1, 0x10, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x2a, 0x0, 0x2, 0xef, 0x78, 0x8e, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0x0, 0x7, 0xff, + 0x0, 0x0, 0x7f, 0x0, 0x0, 0x1, + + /* U+F027 "" */ + 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x2e, 0xf0, + 0x0, 0x78, 0x8e, 0xff, 0x3, 0xf, 0xff, 0xff, + 0xf0, 0xba, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, + 0xff, 0xf0, 0xaa, 0xdf, 0xff, 0xff, 0x4, 0x0, + 0x0, 0x8f, 0xf0, 0x0, 0x0, 0x0, 0x8f, 0x0, + 0x0, 0x0, 0x0, 0x10, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, + 0x2a, 0x0, 0x11, 0x8e, 0x10, 0x0, 0x2, 0xef, + 0x0, 0x7d, 0x2b, 0x90, 0x78, 0x8e, 0xff, 0x3, + 0xa, 0xb3, 0xf0, 0xff, 0xff, 0xff, 0xb, 0xa1, + 0xf1, 0xe3, 0xff, 0xff, 0xff, 0x3, 0xf0, 0xe3, + 0xc5, 0xff, 0xff, 0xff, 0xb, 0xa1, 0xf1, 0xe3, + 0xdf, 0xff, 0xff, 0x3, 0xa, 0xb3, 0xf0, 0x0, + 0x7, 0xff, 0x0, 0x7d, 0x2b, 0x90, 0x0, 0x0, + 0x7f, 0x0, 0x11, 0x9e, 0x10, 0x0, 0x0, 0x1, + 0x0, 0x6, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, + + /* U+F03E "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xfd, 0x5b, + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x1, 0xff, 0xff, + 0xef, 0xff, 0xfb, 0x18, 0xff, 0xf6, 0x1c, 0xff, + 0xff, 0xfc, 0xff, 0x60, 0x1, 0xdf, 0xff, 0x60, + 0x96, 0x0, 0x0, 0x8f, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfc, 0x88, 0x88, 0x88, 0x88, 0xcf, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F048 "" */ + 0x58, 0x0, 0x0, 0x35, 0x9f, 0x10, 0x5, 0xfe, + 0x9f, 0x10, 0x6f, 0xfe, 0x9f, 0x17, 0xff, 0xfe, + 0x9f, 0x9f, 0xff, 0xfe, 0x9f, 0xff, 0xff, 0xfe, + 0x9f, 0xef, 0xff, 0xfe, 0x9f, 0x2d, 0xff, 0xfe, + 0x9f, 0x10, 0xcf, 0xfe, 0x9f, 0x10, 0xb, 0xfe, + 0x8f, 0x0, 0x0, 0x9b, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x46, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x40, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xa1, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xfd, 0x50, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xb1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0xb1, 0xff, 0xff, 0xff, 0xfd, + 0x40, 0xf, 0xff, 0xff, 0xf7, 0x0, 0x0, 0xff, + 0xff, 0xa1, 0x0, 0x0, 0xf, 0xfd, 0x40, 0x0, + 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0xaf, 0xfe, 0x30, 0xaf, 0xfe, 0x3f, 0xff, 0xf7, + 0xf, 0xff, 0xf7, 0xff, 0xff, 0x80, 0xff, 0xff, + 0x8f, 0xff, 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, + 0x80, 0xff, 0xff, 0x8f, 0xff, 0xf8, 0xf, 0xff, + 0xf8, 0xff, 0xff, 0x80, 0xff, 0xff, 0x8f, 0xff, + 0xf8, 0xf, 0xff, 0xf8, 0xff, 0xff, 0x80, 0xff, + 0xff, 0x8f, 0xff, 0xf7, 0xf, 0xff, 0xf7, 0x48, + 0x98, 0x10, 0x48, 0x98, 0x10, + + /* U+F04D "" */ + 0x48, 0x88, 0x88, 0x88, 0x88, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x8f, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xaf, + 0xff, 0xff, 0xff, 0xfe, 0x30, + + /* U+F051 "" */ + 0x26, 0x0, 0x0, 0x58, 0x7f, 0xa0, 0x0, 0xbf, + 0x8f, 0xfb, 0x0, 0xbf, 0x8f, 0xff, 0xc1, 0xbf, + 0x8f, 0xff, 0xfd, 0xcf, 0x8f, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xef, 0x8f, 0xff, 0xf4, 0xbf, + 0x8f, 0xff, 0x40, 0xbf, 0x8f, 0xe3, 0x0, 0xbf, + 0x5d, 0x20, 0x0, 0xae, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x3, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xfa, 0x0, 0x0, 0x0, 0x2, 0xef, 0xff, + 0x90, 0x0, 0x0, 0x1e, 0xff, 0xff, 0xf8, 0x0, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0x70, 0xc, 0xff, + 0xff, 0xff, 0xff, 0xf4, 0xd, 0xff, 0xff, 0xff, + 0xff, 0xf5, 0x1, 0x34, 0x44, 0x44, 0x44, 0x30, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xf5, 0xf, 0xff, + 0xff, 0xff, 0xff, 0xf8, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xf5, + + /* U+F053 "" */ + 0x0, 0x0, 0x3, 0x10, 0x0, 0x5, 0xfb, 0x0, + 0x5, 0xff, 0x40, 0x5, 0xff, 0x40, 0x5, 0xff, + 0x50, 0x3, 0xff, 0x50, 0x0, 0xb, 0xfc, 0x10, + 0x0, 0xb, 0xfc, 0x10, 0x0, 0xc, 0xfc, 0x10, + 0x0, 0xc, 0xfb, 0x0, 0x0, 0xa, 0x50, + + /* U+F054 "" */ + 0x3, 0x10, 0x0, 0x3, 0xfc, 0x10, 0x0, 0xb, + 0xfc, 0x10, 0x0, 0xb, 0xfc, 0x10, 0x0, 0xb, + 0xfc, 0x10, 0x0, 0xd, 0xfb, 0x0, 0x5, 0xff, + 0x50, 0x5, 0xff, 0x50, 0x5, 0xff, 0x50, 0x3, + 0xff, 0x50, 0x0, 0xa, 0x50, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x69, 0x10, 0x0, 0x0, 0x0, 0xd, + 0xf5, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, 0x0, + 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x58, 0x88, + 0xff, 0xb8, 0x88, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x9b, 0xbb, 0xff, 0xdb, 0xbb, 0x30, 0x0, + 0xe, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xef, 0x60, + 0x0, 0x0, 0x0, 0xe, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x9d, 0x20, 0x0, 0x0, + + /* U+F068 "" */ + 0x46, 0x66, 0x66, 0x66, 0x66, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xf7, 0xad, 0xdd, 0xdd, 0xdd, 0xdd, + 0x40, + + /* U+F06E "" */ + 0x0, 0x3, 0xad, 0xff, 0xc7, 0x0, 0x0, 0x0, + 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, 0xb, 0xff, + 0x20, 0x77, 0x9, 0xff, 0x40, 0x7f, 0xf9, 0x0, + 0xcf, 0xa1, 0xff, 0xe1, 0xef, 0xf6, 0x7f, 0xff, + 0xf0, 0xef, 0xf7, 0x8f, 0xf9, 0x3f, 0xff, 0xc1, + 0xff, 0xe1, 0xb, 0xff, 0x26, 0xca, 0x19, 0xff, + 0x40, 0x0, 0x9f, 0xe6, 0x24, 0xaf, 0xe3, 0x0, + 0x0, 0x3, 0x9d, 0xff, 0xc7, 0x0, 0x0, + + /* U+F070 "" */ + 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1c, 0xf8, 0x4a, 0xef, 0xeb, 0x50, 0x0, 0x0, + 0x0, 0x9f, 0xfd, 0x52, 0x5d, 0xfc, 0x10, 0x0, + 0x0, 0x5, 0xfe, 0x4a, 0x70, 0xcf, 0xe1, 0x0, + 0xb, 0x80, 0x2d, 0xff, 0xf7, 0x4f, 0xfb, 0x0, + 0x2f, 0xfb, 0x0, 0xaf, 0xfb, 0x2f, 0xff, 0x30, + 0xb, 0xff, 0x50, 0x7, 0xfe, 0x7f, 0xfb, 0x0, + 0x1, 0xdf, 0xc0, 0x0, 0x3e, 0xff, 0xe1, 0x0, + 0x0, 0x1b, 0xfc, 0x42, 0x1, 0xbf, 0xa0, 0x0, + 0x0, 0x0, 0x5b, 0xef, 0xb0, 0x8, 0xfc, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xe0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xef, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xfd, 0xef, 0xa0, 0x0, 0x0, 0x0, 0xb, + 0xfb, 0x3, 0xff, 0x30, 0x0, 0x0, 0x4, 0xff, + 0xc0, 0x4f, 0xfc, 0x0, 0x0, 0x0, 0xdf, 0xfd, + 0x5, 0xff, 0xf6, 0x0, 0x0, 0x7f, 0xff, 0xf8, + 0xcf, 0xff, 0xe1, 0x0, 0x1f, 0xff, 0xfc, 0x4, + 0xff, 0xff, 0x90, 0xa, 0xff, 0xff, 0xd2, 0x7f, + 0xff, 0xff, 0x20, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf6, 0x4, 0x78, 0x88, 0x88, 0x88, 0x88, + 0x87, 0x0, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xc1, 0xff, 0xf8, 0x0, 0x2e, + 0xff, 0xfc, 0xcd, 0xff, 0x62, 0xef, 0xdf, 0xf9, + 0x0, 0x2c, 0x4e, 0xf9, 0xf, 0x90, 0x0, 0x2, + 0xef, 0x90, 0x7, 0x0, 0x0, 0x2e, 0xf8, 0x88, + 0xf, 0xa0, 0xcd, 0xff, 0x80, 0xdf, 0xdf, 0xf9, + 0xff, 0xf8, 0x0, 0x1e, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0xf, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x10, + + /* U+F077 "" */ + 0x0, 0x0, 0x27, 0x0, 0x0, 0x0, 0x0, 0x2e, + 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xff, 0xf9, 0x0, + 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, + 0x0, 0x2e, 0xf9, 0xb, 0xf9, 0x0, 0x0, 0x2e, + 0xf4, 0x27, 0x0, 0x0, 0x0, 0x27, 0x0, + + /* U+F078 "" */ + 0x27, 0x0, 0x0, 0x0, 0x27, 0xb, 0xf9, 0x0, + 0x0, 0x2e, 0xf4, 0x2e, 0xf9, 0x0, 0x2e, 0xf9, + 0x0, 0x2e, 0xf9, 0x2e, 0xf9, 0x0, 0x0, 0x2e, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0x2e, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0x26, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xc0, 0x7, 0x77, 0x77, 0x72, 0x0, + 0x3, 0xff, 0xfc, 0x2e, 0xff, 0xff, 0xf9, 0x0, + 0xf, 0xcf, 0xcf, 0xa0, 0x0, 0x0, 0xe9, 0x0, + 0x4, 0x1e, 0x93, 0x20, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0x0, 0xe9, 0x0, + 0x0, 0xe, 0x90, 0x0, 0x0, 0xb5, 0xe9, 0x97, + 0x0, 0xe, 0xc7, 0x77, 0x73, 0xbf, 0xff, 0xf6, + 0x0, 0xd, 0xff, 0xff, 0xfd, 0xb, 0xff, 0x70, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa6, 0x0, + + /* U+F07B "" */ + 0xbf, 0xff, 0xf6, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xff, 0x98, 0x88, 0x74, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, + + /* U+F093 "" */ + 0x0, 0x0, 0x2, 0x20, 0x0, 0x0, 0x0, 0x0, + 0x3e, 0xe3, 0x0, 0x0, 0x0, 0x3, 0xef, 0xfe, + 0x30, 0x0, 0x0, 0x3e, 0xff, 0xff, 0xe3, 0x0, + 0x0, 0xef, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x8f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf8, 0x0, 0x0, + 0x23, 0x32, 0x8f, 0xf8, 0x23, 0x32, 0xff, 0xfe, + 0x39, 0x93, 0xef, 0xff, 0xff, 0xff, 0xc9, 0x9c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5c, 0x8f, + 0x9a, 0xaa, 0xaa, 0xaa, 0xaa, 0xa8, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3, 0x62, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x2d, 0xff, + 0x90, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xfd, 0x0, 0x0, 0x1, + 0x0, 0x9, 0xff, 0x40, 0x1, 0x8e, 0xe1, 0x1a, + 0xff, 0x70, 0x0, 0xef, 0xff, 0xde, 0xff, 0x90, + 0x0, 0xc, 0xff, 0xff, 0xff, 0x60, 0x0, 0x0, + 0x8f, 0xff, 0xe9, 0x10, 0x0, 0x0, 0x2, 0x76, + 0x30, 0x0, 0x0, 0x0, 0x0, + + /* U+F0C4 "" */ + 0x7, 0x93, 0x0, 0x0, 0x22, 0xa, 0xff, 0xf2, + 0x0, 0x8f, 0xf5, 0xf9, 0x1f, 0x70, 0x8f, 0xf9, + 0xc, 0xfc, 0xf8, 0x8f, 0xf9, 0x0, 0x1a, 0xef, + 0xff, 0xf9, 0x0, 0x0, 0x0, 0xef, 0xfc, 0x0, + 0x0, 0x7, 0xbf, 0xff, 0xf6, 0x0, 0xa, 0xff, + 0xfa, 0xbf, 0xf6, 0x0, 0xf9, 0x1f, 0x70, 0xbf, + 0xf6, 0xc, 0xfc, 0xf4, 0x0, 0xbf, 0xf4, 0x1a, + 0xc6, 0x0, 0x0, 0x56, 0x0, + + /* U+F0C5 "" */ + 0x0, 0x3, 0x44, 0x41, 0x20, 0x0, 0x0, 0xff, + 0xff, 0x5e, 0x40, 0x24, 0x1f, 0xff, 0xf5, 0xee, + 0x2f, 0xf4, 0xff, 0xff, 0xc8, 0x82, 0xff, 0x4f, + 0xff, 0xff, 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, + 0xf5, 0xff, 0x4f, 0xff, 0xff, 0xff, 0x5f, 0xf4, + 0xff, 0xff, 0xff, 0xf5, 0xff, 0x4f, 0xff, 0xff, + 0xff, 0x5f, 0xf4, 0xff, 0xff, 0xff, 0xf4, 0xff, + 0x93, 0x44, 0x44, 0x43, 0xf, 0xff, 0xff, 0xff, + 0x50, 0x0, 0x68, 0x88, 0x88, 0x71, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x48, 0x88, 0x88, 0x87, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfb, 0x0, 0xf8, 0x0, 0x0, 0xb, 0xfb, + 0xf, 0x80, 0x0, 0x0, 0xbf, 0xf3, 0xfb, 0x77, + 0x77, 0x7d, 0xff, 0x4f, 0xff, 0xff, 0xff, 0xff, + 0xf4, 0xff, 0xff, 0x42, 0xdf, 0xff, 0x4f, 0xff, + 0xc0, 0x8, 0xff, 0xf4, 0xff, 0xfe, 0x0, 0xaf, + 0xff, 0x4f, 0xff, 0xfc, 0xaf, 0xff, 0xf4, 0xaf, + 0xff, 0xff, 0xff, 0xfd, 0x10, + + /* U+F0E7 "" */ + 0x1, 0xbb, 0xba, 0x10, 0x0, 0x5f, 0xff, 0xf1, + 0x0, 0x7, 0xff, 0xfb, 0x0, 0x0, 0x9f, 0xff, + 0x60, 0x0, 0xb, 0xff, 0xff, 0xff, 0x60, 0xef, + 0xff, 0xff, 0xf1, 0xe, 0xff, 0xff, 0xf8, 0x0, + 0x0, 0xc, 0xfe, 0x0, 0x0, 0x0, 0xff, 0x50, + 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x7, 0xf3, + 0x0, 0x0, 0x0, 0xa9, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x2a, 0x50, 0x0, 0x0, 0xe, 0xff, 0x8f, + 0xff, 0x20, 0x0, 0xff, 0xf8, 0xff, 0xf4, 0x0, + 0xf, 0xff, 0xeb, 0xbb, 0x30, 0x0, 0xff, 0xf4, + 0x99, 0x92, 0x60, 0xf, 0xff, 0x5f, 0xff, 0x4f, + 0xa0, 0xff, 0xf5, 0xff, 0xf5, 0x56, 0x1f, 0xff, + 0x5f, 0xff, 0xff, 0xf4, 0xff, 0xf5, 0xff, 0xff, + 0xff, 0x4e, 0xff, 0x5f, 0xff, 0xff, 0xf4, 0x0, + 0x5, 0xff, 0xff, 0xff, 0x40, 0x0, 0x5f, 0xff, + 0xff, 0xf4, 0x0, 0x0, 0x44, 0x44, 0x44, 0x0, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x15, 0x0, 0x0, 0x0, 0x0, 0x9, + 0xf1, 0x0, 0x0, 0x0, 0x2d, 0xff, 0xf9, 0x0, + 0x0, 0xe, 0xff, 0xff, 0xf7, 0x0, 0x5, 0xff, + 0xff, 0xff, 0xd0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xf2, 0x0, 0xdf, + 0xff, 0xff, 0xff, 0x50, 0x6f, 0xff, 0xff, 0xff, + 0xfd, 0xe, 0xff, 0xff, 0xff, 0xff, 0xf6, 0x24, + 0x44, 0x44, 0x44, 0x43, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, 0x0, + + /* U+F11C "" */ + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xfc, + 0x8e, 0x8e, 0x8e, 0x88, 0xe8, 0xf7, 0xf8, 0xc, + 0xc, 0xb, 0x0, 0xb0, 0xf8, 0xff, 0xec, 0xfc, + 0xec, 0xee, 0xcf, 0xf8, 0xff, 0xa0, 0xc0, 0xa0, + 0x77, 0x2f, 0xf8, 0xff, 0xec, 0xfc, 0xec, 0xee, + 0xcf, 0xf8, 0xf8, 0xc, 0x0, 0x0, 0x0, 0xb0, + 0xf8, 0xfc, 0x8e, 0x88, 0x88, 0x88, 0xe8, 0xf7, + 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x18, 0xef, 0xe0, 0x0, 0x0, + 0x0, 0x29, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x3a, + 0xff, 0xff, 0xff, 0x30, 0x0, 0x4c, 0xff, 0xff, + 0xff, 0xfc, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x0, 0xe, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x0, 0x1, 0x34, 0x44, 0xdf, 0xff, 0x60, 0x0, + 0x0, 0x0, 0x0, 0xcf, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xf8, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26, + 0x0, 0x0, 0x0, + + /* U+F15B "" */ + 0x9b, 0xbb, 0xb2, 0x70, 0xf, 0xff, 0xff, 0x4f, + 0x90, 0xff, 0xff, 0xf4, 0xff, 0x9f, 0xff, 0xff, + 0x54, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x34, 0x44, + 0x44, 0x44, 0x30, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x5, 0x9b, 0xcb, 0x95, 0x0, 0x0, 0x0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3, 0xef, + 0xfa, 0x53, 0x23, 0x5a, 0xff, 0xe3, 0xdf, 0xa1, + 0x0, 0x0, 0x0, 0x1, 0xaf, 0xd2, 0x60, 0x5, + 0xbe, 0xfe, 0xb5, 0x0, 0x52, 0x0, 0x1c, 0xff, + 0xfe, 0xff, 0xfc, 0x10, 0x0, 0x2, 0xec, 0x40, + 0x0, 0x4c, 0xe2, 0x0, 0x0, 0x1, 0x0, 0x1, + 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xd6, 0x0, + 0x0, 0x0, + + /* U+F240 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x44, 0x44, 0x44, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0xcf, 0xf8, 0xcf, + 0xff, 0xff, 0xff, 0xff, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0xcc, 0xcc, 0xc3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F241 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x44, 0x43, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0xff, 0xc0, 0x2, 0xcf, 0xf8, 0xcf, + 0xff, 0xff, 0xfc, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0xcc, 0x90, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F242 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x44, 0x42, 0x0, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0xff, 0x80, 0x0, 0x2, 0xcf, 0xf8, 0xcf, + 0xff, 0xf8, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0xcc, 0x60, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F243 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x34, 0x41, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x8c, + 0xff, 0x40, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0xcf, + 0xf4, 0x0, 0x0, 0x0, 0x8, 0xff, 0x89, 0xcc, + 0x30, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F244 "" */ + 0x37, 0x77, 0x77, 0x77, 0x77, 0x77, 0x75, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xdf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xcf, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x3, 0xff, 0xfb, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x9f, 0x9c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x25, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0xcb, 0xfe, 0x0, 0x0, 0x0, + 0x1, 0x0, 0xd, 0x10, 0x42, 0x0, 0x0, 0x0, + 0x9f, 0xd1, 0x68, 0x0, 0x0, 0x0, 0x68, 0x0, + 0xff, 0xfe, 0xee, 0xed, 0xdd, 0xdd, 0xef, 0xc0, + 0x9f, 0xd1, 0x0, 0xb3, 0x0, 0x0, 0x68, 0x0, + 0x1, 0x0, 0x0, 0x3b, 0x5, 0x74, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xbe, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x0, 0x34, 0x20, 0x0, 0x0, 0x6e, 0xfe, + 0xfd, 0x20, 0x4, 0xff, 0xf3, 0xff, 0xd0, 0xc, + 0xff, 0xf0, 0x4f, 0xf5, 0xf, 0xd5, 0xf2, 0x95, + 0xf8, 0x2f, 0xf7, 0x41, 0x3c, 0xfa, 0x3f, 0xff, + 0x60, 0xaf, 0xfb, 0x3f, 0xfe, 0x20, 0x4f, 0xfb, + 0x2f, 0xe2, 0x92, 0x75, 0xfa, 0xf, 0xeb, 0xf1, + 0x49, 0xf8, 0x9, 0xff, 0xf0, 0x9f, 0xf2, 0x1, + 0xdf, 0xf9, 0xff, 0x90, 0x0, 0x6, 0xab, 0x95, + 0x0, + + /* U+F2ED "" */ + 0x0, 0x4, 0x88, 0x70, 0x0, 0xb, 0xcc, 0xff, + 0xff, 0xdc, 0xc5, 0xbc, 0xcc, 0xcc, 0xcc, 0xcc, + 0x52, 0x88, 0x88, 0x88, 0x88, 0x60, 0x4f, 0xff, + 0xff, 0xff, 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x5f, + 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, 0xfc, 0x4, 0xfa, + 0xae, 0x6f, 0x4f, 0xc0, 0x4f, 0xaa, 0xe6, 0xf4, + 0xfc, 0x4, 0xfa, 0xae, 0x6f, 0x4f, 0xc0, 0x4f, + 0xaa, 0xe6, 0xf5, 0xfc, 0x3, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x6, 0x88, 0x88, 0x88, 0x72, 0x0, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x1, 0x71, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xef, 0xd1, 0x0, 0x0, 0x0, + 0x1, 0x5f, 0xff, 0xc0, 0x0, 0x0, 0x2, 0xea, + 0x5f, 0xfd, 0x0, 0x0, 0x2, 0xef, 0xfa, 0x5d, + 0x20, 0x0, 0x2, 0xef, 0xff, 0xf8, 0x0, 0x0, + 0x2, 0xef, 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, + 0xff, 0xfe, 0x20, 0x0, 0x2, 0xef, 0xff, 0xfe, + 0x20, 0x0, 0x0, 0xbf, 0xff, 0xfe, 0x20, 0x0, + 0x0, 0xd, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, 0x6, 0x64, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+F55A "" */ + 0x0, 0x5, 0xef, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5, + 0xff, 0xff, 0x91, 0xdd, 0x19, 0xff, 0xf5, 0xff, + 0xff, 0xfd, 0x11, 0x11, 0xdf, 0xff, 0xef, 0xff, + 0xff, 0xfb, 0x0, 0xbf, 0xff, 0xf5, 0xff, 0xff, + 0xfd, 0x11, 0x11, 0xdf, 0xff, 0x5, 0xff, 0xff, + 0x91, 0xdd, 0x19, 0xff, 0xf0, 0x5, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x4, 0xef, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F7C2 "" */ + 0x0, 0x17, 0x88, 0x87, 0x20, 0x2d, 0xff, 0xff, + 0xfd, 0x2e, 0xa0, 0xb3, 0x78, 0xfe, 0xfa, 0xb, + 0x37, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0x4, 0x44, + 0x44, 0x44, 0x0, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xf0, 0x0, 0x69, 0x0, + 0x0, 0x0, 0xdf, 0x0, 0x7f, 0xc0, 0x0, 0x0, + 0xd, 0xf0, 0x8f, 0xff, 0xdd, 0xdd, 0xdd, 0xff, + 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xb, + 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 52, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 51, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 14, .adv_w = 75, .box_w = 4, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 22, .adv_w = 135, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 63, .adv_w = 119, .box_w = 7, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 109, .adv_w = 162, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 154, .adv_w = 132, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 199, .adv_w = 40, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 203, .adv_w = 65, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 223, .adv_w = 65, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 243, .adv_w = 77, .box_w = 5, .box_h = 5, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 256, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 277, .adv_w = 74, .box_w = 4, .box_h = 2, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 281, .adv_w = 44, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 284, .adv_w = 68, .box_w = 6, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 323, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 359, .adv_w = 71, .box_w = 4, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 377, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 409, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 441, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 477, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 509, .adv_w = 118, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 545, .adv_w = 115, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 577, .adv_w = 124, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 613, .adv_w = 118, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 645, .adv_w = 44, .box_w = 3, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 656, .adv_w = 44, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 670, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 695, .adv_w = 112, .box_w = 7, .box_h = 5, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 713, .adv_w = 112, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 738, .adv_w = 110, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 770, .adv_w = 199, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 842, .adv_w = 141, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 887, .adv_w = 145, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 923, .adv_w = 139, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 964, .adv_w = 159, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1005, .adv_w = 129, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1037, .adv_w = 122, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1069, .adv_w = 148, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1110, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1146, .adv_w = 60, .box_w = 2, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1155, .adv_w = 98, .box_w = 6, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1182, .adv_w = 138, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1218, .adv_w = 114, .box_w = 7, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1250, .adv_w = 183, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1295, .adv_w = 156, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1331, .adv_w = 161, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1376, .adv_w = 139, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1412, .adv_w = 161, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1472, .adv_w = 140, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1508, .adv_w = 119, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1540, .adv_w = 113, .box_w = 7, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1572, .adv_w = 152, .box_w = 8, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1608, .adv_w = 137, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1653, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1716, .adv_w = 129, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1752, .adv_w = 124, .box_w = 9, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1793, .adv_w = 126, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1829, .adv_w = 64, .box_w = 3, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1849, .adv_w = 68, .box_w = 6, .box_h = 13, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 1888, .adv_w = 64, .box_w = 3, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1908, .adv_w = 112, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 1929, .adv_w = 96, .box_w = 6, .box_h = 1, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1932, .adv_w = 115, .box_w = 4, .box_h = 2, .ofs_x = 1, .ofs_y = 8}, + {.bitmap_index = 1936, .adv_w = 115, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1961, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1996, .adv_w = 110, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2021, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2061, .adv_w = 118, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2086, .adv_w = 68, .box_w = 5, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2111, .adv_w = 132, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2151, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2186, .adv_w = 54, .box_w = 3, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2201, .adv_w = 55, .box_w = 5, .box_h = 13, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 2234, .adv_w = 118, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2269, .adv_w = 54, .box_w = 2, .box_h = 10, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2279, .adv_w = 203, .box_w = 11, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2318, .adv_w = 131, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2343, .adv_w = 122, .box_w = 8, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2371, .adv_w = 131, .box_w = 7, .box_h = 10, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2406, .adv_w = 131, .box_w = 8, .box_h = 10, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2446, .adv_w = 79, .box_w = 4, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2460, .adv_w = 96, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2481, .adv_w = 79, .box_w = 5, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2504, .adv_w = 130, .box_w = 7, .box_h = 7, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2529, .adv_w = 107, .box_w = 8, .box_h = 7, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2557, .adv_w = 173, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2596, .adv_w = 106, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2621, .adv_w = 107, .box_w = 8, .box_h = 10, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 2661, .adv_w = 100, .box_w = 6, .box_h = 7, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2682, .adv_w = 67, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2708, .adv_w = 57, .box_w = 2, .box_h = 13, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2721, .adv_w = 67, .box_w = 4, .box_h = 13, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2747, .adv_w = 112, .box_w = 7, .box_h = 2, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 2754, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2832, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2886, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2952, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3006, .adv_w = 132, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3047, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3125, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3203, .adv_w = 216, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3280, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3358, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3421, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3499, .adv_w = 96, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3529, .adv_w = 144, .box_w = 9, .box_h = 10, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3574, .adv_w = 216, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3665, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3719, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 3767, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3839, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3900, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3961, .adv_w = 168, .box_w = 8, .box_h = 12, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 4009, .adv_w = 168, .box_w = 12, .box_h = 11, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 4075, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4114, .adv_w = 120, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4153, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4214, .adv_w = 168, .box_w = 11, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 4231, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4294, .adv_w = 240, .box_w = 16, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4398, .adv_w = 216, .box_w = 15, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4496, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4562, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4601, .adv_w = 168, .box_w = 11, .box_h = 7, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 4640, .adv_w = 240, .box_w = 16, .box_h = 10, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4720, .adv_w = 192, .box_w = 12, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4774, .adv_w = 192, .box_w = 12, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4852, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 4937, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4998, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5070, .adv_w = 168, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5131, .adv_w = 120, .box_w = 9, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5190, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5262, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5334, .adv_w = 216, .box_w = 14, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5397, .adv_w = 192, .box_w = 14, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 5488, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5547, .adv_w = 240, .box_w = 15, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5637, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5705, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5773, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5841, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5909, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5977, .adv_w = 240, .box_w = 16, .box_h = 11, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6065, .adv_w = 168, .box_w = 10, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6130, .adv_w = 168, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6202, .adv_w = 192, .box_w = 13, .box_h = 13, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 6287, .adv_w = 240, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6355, .adv_w = 144, .box_w = 9, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6414, .adv_w = 193, .box_w = 13, .box_h = 9, .ofs_x = 0, .ofs_y = 0} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_2[] = { + 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x14, + 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, 0x47, + 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, 0x53, 0x66, + 0x67, 0x6d, 0x6f, 0x70, 0x73, 0x76, 0x77, 0x78, + 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xe9, + 0xf2, 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, + 0x242, 0x243, 0x286, 0x292, 0x2ec, 0x303, 0x559, 0x7c1, + 0x8a1 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 32, .range_length = 12, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 45, .range_length = 82, .glyph_id_start = 13, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 61441, .range_length = 2210, .glyph_id_start = 95, + .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 57, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = +{ + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 9, 10, 11, + 12, 0, 13, 14, 15, 16, 17, 18, + 19, 12, 20, 20, 0, 0, 0, 21, + 22, 23, 24, 25, 22, 26, 27, 28, + 29, 29, 30, 31, 32, 29, 29, 22, + 33, 34, 35, 3, 36, 30, 37, 37, + 38, 39, 40, 41, 42, 43, 0, 44, + 0, 45, 46, 47, 48, 49, 50, 51, + 45, 52, 52, 53, 48, 45, 45, 46, + 46, 54, 55, 56, 57, 51, 58, 58, + 59, 58, 60, 41, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = +{ + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 12, 18, + 19, 20, 21, 21, 0, 0, 0, 22, + 23, 24, 25, 23, 25, 25, 25, 23, + 25, 25, 26, 25, 25, 25, 25, 23, + 25, 23, 25, 3, 27, 28, 29, 29, + 30, 31, 32, 33, 34, 35, 0, 36, + 0, 37, 38, 39, 39, 39, 0, 39, + 38, 40, 41, 38, 38, 42, 42, 39, + 42, 39, 42, 43, 44, 45, 46, 46, + 47, 46, 48, 0, 0, 35, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = +{ + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 2, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 9, 0, 5, -4, 0, 0, 0, + 0, -11, -12, 1, 9, 4, 3, -8, + 1, 9, 1, 8, 2, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 2, -1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -6, 0, 0, 0, 0, 0, -4, + 3, 4, 0, 0, -2, 0, -1, 2, + 0, -2, 0, -2, -1, -4, 0, 0, + 0, 0, -2, 0, 0, -2, -3, 0, + 0, -2, 0, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -2, 0, + 0, -5, 0, -23, 0, 0, -4, 0, + 4, 6, 0, 0, -4, 2, 2, 6, + 4, -3, 4, 0, 0, -11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, -9, 0, -8, -1, 0, 0, 0, + 0, 0, 7, 0, -6, -2, -1, 1, + 0, -3, 0, 0, -1, -14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, -2, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 6, 0, 2, 0, 0, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 2, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 4, 2, 6, -2, 0, 0, 4, + -2, -6, -26, 1, 5, 4, 0, -2, + 0, 7, 0, 6, 0, 6, 0, -18, + 0, -2, 6, 0, 6, -2, 4, 2, + 0, 0, 1, -2, 0, 0, -3, 15, + 0, 15, 0, 6, 0, 8, 2, 3, + 0, 0, 0, -7, 0, 0, 0, 0, + 1, -1, 0, 1, -3, -2, -4, 1, + 0, -2, 0, 0, 0, -8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, -11, 0, -12, 0, 0, 0, 0, + -1, 0, 19, -2, -2, 2, 2, -2, + 0, -2, 2, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -19, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 0, 0, -7, 0, 6, 0, + -13, -19, -13, -4, 6, 0, 0, -13, + 0, 2, -4, 0, -3, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 6, -23, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 1, + 1, -2, -4, 0, -1, -1, -2, 0, + 0, -1, 0, 0, 0, -4, 0, -2, + 0, -4, -4, 0, -5, -6, -6, -4, + 0, -4, 0, -4, 0, 0, 0, 0, + -2, 0, 0, 2, 0, 1, -2, 0, + 0, 0, 0, 2, -1, 0, 0, 0, + -1, 2, 2, -1, 0, 0, 0, -4, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 2, -1, 0, -2, 0, -3, 0, + 0, -1, 0, 6, 0, 0, -2, 0, + 0, 0, 0, 0, -1, 1, -1, -1, + 0, -2, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, -1, 0, + -2, -2, 0, 0, 0, 0, 0, 1, + 0, 0, -1, 0, -2, -2, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, -1, -2, 0, + 0, -6, -1, -6, 4, 0, 0, -4, + 2, 4, 5, 0, -5, -1, -2, 0, + -1, -9, 2, -1, 1, -10, 2, 0, + 0, 1, -10, 0, -10, -2, -17, -1, + 0, -10, 0, 4, 5, 0, 2, 0, + 0, 0, 0, 0, 0, -3, -2, 0, + 0, 0, 0, -2, 0, 0, 0, -2, + 0, 0, 0, 0, 0, -1, -1, 0, + -1, -2, 0, 0, 0, 0, 0, 0, + 0, -2, -2, 0, -1, -2, -2, 0, + 0, -2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -2, 0, + 0, -1, 0, -4, 2, 0, 0, -2, + 1, 2, 2, 0, 0, 0, 0, 0, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 0, -2, 0, -2, -1, -2, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -2, -3, 0, + 0, 6, -1, 1, -6, 0, 0, 5, + -10, -10, -8, -4, 2, 0, -2, -12, + -3, 0, -3, 0, -4, 3, -3, -12, + 0, -5, 0, 0, 1, -1, 2, -1, + 0, 2, 0, -6, -7, 0, -10, -5, + -4, -5, -6, -2, -5, 0, -4, -5, + 0, 1, 0, -2, 0, 0, 0, 1, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, 0, -1, + 0, -1, -2, 0, -3, -4, -4, -1, + 0, -6, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 1, -1, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 9, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, -4, 0, 0, 0, + 0, -10, -6, 0, 0, 0, -3, -10, + 0, 0, -2, 2, 0, -5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, 0, 0, -4, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 2, 0, + 1, -4, -4, 0, -2, -2, -2, 0, + 0, 0, 0, 0, 0, -6, 0, -2, + 0, -3, -2, 0, -4, -5, -6, -2, + 0, -4, 0, -6, 0, 0, 0, 0, + 15, 0, 0, 1, 0, 0, -2, 0, + 0, -8, 0, 0, 0, 0, 0, -18, + -3, 6, 6, -2, -8, 0, 2, -3, + 0, -10, -1, -2, 2, -13, -2, 2, + 0, 3, -7, -3, -7, -6, -8, 0, + 0, -12, 0, 11, 0, 0, -1, 0, + 0, 0, -1, -1, -2, -5, -6, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -2, 0, -1, -2, -3, 0, + 0, -4, 0, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -4, 0, 0, 4, + -1, 2, 0, -4, 2, -1, -1, -5, + -2, 0, -2, -2, -1, 0, -3, -3, + 0, 0, -2, -1, -1, -3, -2, 0, + 0, -2, 0, 2, -1, 0, -4, 0, + 0, 0, -4, 0, -3, 0, -3, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 2, 0, -3, 0, -1, -2, -6, + -1, -1, -1, -1, -1, -2, -1, 0, + 0, 0, 0, 0, -2, -2, -2, 0, + 0, 0, 0, 2, -1, 0, -1, 0, + 0, 0, -1, -2, -1, -2, -2, -2, + 2, 8, -1, 0, -5, 0, -1, 4, + 0, -2, -8, -2, 3, 0, 0, -9, + -3, 2, -3, 1, 0, -1, -2, -6, + 0, -3, 1, 0, 0, -3, 0, 0, + 0, 2, 2, -4, -4, 0, -3, -2, + -3, -2, -2, 0, -3, 1, -4, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, -2, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -3, + 0, 0, -2, 0, 0, -2, -2, 0, + 0, 0, 0, -2, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, -1, 0, + 0, 0, -3, 0, -4, 0, 0, 0, + -6, 0, 1, -4, 4, 0, -1, -9, + 0, 0, -4, -2, 0, -8, -5, -5, + 0, 0, -8, -2, -8, -7, -9, 0, + -5, 0, 2, 13, -2, 0, -4, -2, + -1, -2, -3, -5, -3, -7, -8, -4, + 0, 0, -1, 0, 1, 0, 0, -13, + -2, 6, 4, -4, -7, 0, 1, -6, + 0, -10, -1, -2, 4, -18, -2, 1, + 0, 0, -12, -2, -10, -2, -14, 0, + 0, -13, 0, 11, 1, 0, -1, 0, + 0, 0, 0, -1, -1, -7, -1, 0, + 0, 0, 0, 0, -6, 0, -2, 0, + -1, -5, -9, 0, 0, -1, -3, -6, + -2, 0, -1, 0, 0, 0, 0, -9, + -2, -6, -6, -2, -3, -5, -2, -3, + 0, -4, -2, -6, -3, 0, -2, -4, + -2, -4, 0, 1, 0, -1, -6, 0, + 0, -3, 0, 0, 0, 0, 2, 0, + 1, -4, 8, 0, -2, -2, -2, 0, + 0, 0, 0, 0, 0, -6, 0, -2, + 0, -3, -2, 0, -4, -5, -6, -2, + 0, -4, 2, 8, 0, 0, 0, 0, + 15, 0, 0, 1, 0, 0, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -4, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, -2, -2, 0, 0, -4, -2, 0, + 0, -4, 0, 3, -1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, + 4, 2, -2, 0, -6, -3, 0, 6, + -6, -6, -4, -4, 8, 3, 2, -17, + -1, 4, -2, 0, -2, 2, -2, -7, + 0, -2, 2, -2, -2, -6, -2, 0, + 0, 6, 4, 0, -5, 0, -11, -2, + 6, -2, -7, 1, -2, -6, -6, -2, + 2, 0, -3, 0, -5, 0, 2, 6, + -4, -7, -8, -5, 6, 0, 1, -14, + -2, 2, -3, -1, -4, 0, -4, -7, + -3, -3, -2, 0, 0, -4, -4, -2, + 0, 6, 4, -2, -11, 0, -11, -3, + 0, -7, -11, -1, -6, -3, -6, -5, + 0, 0, -2, 0, -4, -2, 0, -2, + -3, 0, 3, -6, 2, 0, 0, -10, + 0, -2, -4, -3, -1, -6, -5, -6, + -4, 0, -6, -2, -4, -4, -6, -2, + 0, 0, 1, 9, -3, 0, -6, -2, + 0, -2, -4, -4, -5, -5, -7, -2, + 4, 0, -3, 0, -10, -2, 1, 4, + -6, -7, -4, -6, 6, -2, 1, -18, + -3, 4, -4, -3, -7, 0, -6, -8, + -2, -2, -2, -2, -4, -6, -1, 0, + 0, 6, 5, -1, -12, 0, -12, -4, + 5, -7, -13, -4, -7, -8, -10, -6, + 0, 0, 0, 0, -2, 0, 0, 2, + -2, 4, 1, -4, 4, 0, 0, -6, + -1, 0, -1, 0, 1, 1, -2, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, 0, 2, 6, 0, 0, -2, 0, + 0, 0, 0, -1, -1, -2, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 7, 0, 3, 1, 1, -2, + 0, 4, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 6, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, -2, 3, 0, 6, 0, + 0, 19, 2, -4, -4, 2, 2, -1, + 1, -10, 0, 0, 9, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 7, 27, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, 0, 0, -4, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -1, 0, -5, 0, 0, 1, 0, + 0, 2, 25, -4, -2, 6, 5, -5, + 2, 0, 0, 2, 2, -2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -25, 5, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -5, 0, 0, 0, -5, + 0, 0, 0, 0, -4, -1, 0, 0, + 0, -4, 0, -2, 0, -9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, -2, 0, 0, + 0, -3, 0, -5, 0, 0, 0, -3, + 2, -2, 0, 0, -5, -2, -4, 0, + 0, -5, 0, -2, 0, -9, 0, -2, + 0, 0, -16, -4, -8, -2, -7, 0, + 0, -13, 0, -5, -1, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -3, -2, + 0, 0, 0, 0, -4, 0, -4, 2, + -2, 4, 0, -1, -4, -1, -3, -4, + 0, -2, -1, -1, 1, -5, -1, 0, + 0, 0, -17, -2, -3, 0, -4, 0, + -1, -9, -2, 0, 0, -1, -2, 0, + 0, 0, 0, 1, 0, -1, -3, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 0, + 0, -4, 0, -1, 0, 0, 0, -4, + 2, 0, 0, 0, -5, -2, -4, 0, + 0, -5, 0, -2, 0, -9, 0, 0, + 0, 0, -19, 0, -4, -7, -10, 0, + 0, -13, 0, -1, -3, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -3, -1, + 1, 0, 0, 3, -2, 0, 6, 9, + -2, -2, -6, 2, 9, 3, 4, -5, + 2, 8, 2, 6, 4, 5, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 12, 9, -3, -2, 0, -2, 15, + 8, 15, 0, 0, 0, 2, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, -16, -2, -2, -8, -9, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, -16, -2, -2, -8, -9, 0, + 0, -8, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -4, 2, 0, -2, 2, 3, 2, -6, + 0, 0, -2, 2, 0, 2, 0, 0, + 0, 0, -5, 0, -2, -1, -4, 0, + -2, -8, 0, 12, -2, 0, -4, -1, + 0, -1, -3, 0, -2, -5, -4, -2, + 0, 0, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, 0, 0, 0, + 0, 0, 0, 0, 0, 3, 0, 0, + 0, 0, -16, -2, -2, -8, -9, 0, + 0, -13, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, 0, -6, -2, -2, 6, + -2, -2, -8, 1, -1, 1, -1, -5, + 0, 4, 0, 2, 1, 2, -5, -8, + -2, 0, -7, -4, -5, -8, -7, 0, + -3, -4, -2, -2, -2, -1, -2, -1, + 0, -1, -1, 3, 0, 3, -1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -1, -2, -2, 0, + 0, -5, 0, -1, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -2, 0, + 0, 0, 0, 0, -2, 0, 0, -3, + -2, 2, 0, -3, -4, -1, 0, -6, + -1, -4, -1, -2, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -13, 0, 6, 0, 0, -3, 0, + 0, 0, 0, -2, 0, -2, 0, 0, + 0, 0, -1, 0, -4, 0, 0, 8, + -2, -6, -6, 1, 2, 2, 0, -5, + 1, 3, 1, 6, 1, 6, -1, -5, + 0, 0, -8, 0, 0, -6, -5, 0, + 0, -4, 0, -2, -3, 0, -3, 0, + -3, 0, -1, 3, 0, -2, -6, -2, + 0, 0, -2, 0, -4, 0, 0, 2, + -4, 0, 2, -2, 2, 0, 0, -6, + 0, -1, -1, 0, -2, 2, -2, 0, + 0, 0, -8, -2, -4, 0, -6, 0, + 0, -9, 0, 7, -2, 0, -3, 0, + 1, 0, -2, 0, -2, -6, 0, -2, + 0, 0, 0, 0, -1, 0, 0, 2, + -2, 1, 0, 0, -2, -1, 0, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -12, 0, 4, 0, 0, -2, 0, + 0, 0, 0, 0, 0, -2, -2, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = +{ + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 60, + .right_class_cnt = 48, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 3, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserratMedium_12 = { +#else +lv_font_t lv_font_montserratMedium_12 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 12, /*The maximum line height required by the font default: (f.src.ascent - f.src.descent)*/ + .base_line = 1.7999999999999998, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRATMEDIUM_12*/ + diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/lv_font_montserratMedium_16.c b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/lv_font_montserratMedium_16.c new file mode 100644 index 0000000..ebcd0c5 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/guider_fonts/lv_font_montserratMedium_16.c @@ -0,0 +1,2411 @@ +/* + * Copyright 2024 NXP + * NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in + * accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, + * activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to + * comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license + * terms, then you may not retain, install, activate or otherwise use the software. + */ +/******************************************************************************* + * Size: 16 px + * Bpp: 4 + * Opts: --user-data-dir=C:\Users\duruofu\AppData\Roaming\gui-guider --app-path=C:\NXP\GUI-Guider-1.6.1-GA\resources\app.asar --no-sandbox --no-zygote --lang=zh-CN --device-scale-factor=1.25 --num-raster-threads=4 --enable-main-frame-before-activation --renderer-client-id=5 --time-ticks-at-unix-epoch=-1717375277958826 --launch-time-ticks=92300759598 --mojo-platform-channel-handle=3020 --field-trial-handle=1732,i,14137332758556215245,7603498977609116181,131072 --disable-features=SpareRendererForSitePerProcess,WinRetrieveSuggestionsOnlyOnDemand /prefetch:1 + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl.h" +#endif + +#ifndef LV_FONT_MONTSERRATMEDIUM_16 +#define LV_FONT_MONTSERRATMEDIUM_16 1 +#endif + +#if LV_FONT_MONTSERRATMEDIUM_16 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0xbf, 0xb, 0xf0, 0xaf, 0xa, 0xe0, 0x9e, 0x8, + 0xd0, 0x8c, 0x7, 0xc0, 0x0, 0x0, 0x10, 0xbf, + 0x1a, 0xe0, + + /* U+0022 "\"" */ + 0xf5, 0x1f, 0x3f, 0x51, 0xf3, 0xe4, 0xf, 0x3e, + 0x40, 0xf2, 0x72, 0x8, 0x10, + + /* U+0023 "#" */ + 0x0, 0x5, 0xc0, 0x3, 0xe0, 0x0, 0x0, 0x7a, + 0x0, 0x5c, 0x0, 0x0, 0x9, 0x80, 0x7, 0xa0, + 0x1, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x3, 0x3e, + 0x73, 0x3c, 0x83, 0x30, 0x0, 0xf2, 0x0, 0xc5, + 0x0, 0x0, 0xf, 0x10, 0xe, 0x30, 0x0, 0x2, + 0xf0, 0x0, 0xf2, 0x0, 0x9f, 0xff, 0xff, 0xff, + 0xff, 0x41, 0x38, 0xc3, 0x36, 0xe3, 0x30, 0x0, + 0x89, 0x0, 0x5c, 0x0, 0x0, 0xa, 0x70, 0x7, + 0xa0, 0x0, + + /* U+0024 "$" */ + 0x0, 0x0, 0x79, 0x0, 0x0, 0x0, 0x0, 0x79, + 0x0, 0x0, 0x0, 0x5c, 0xff, 0xe9, 0x20, 0x6, + 0xfc, 0xbc, 0x9e, 0x90, 0xe, 0xb0, 0x79, 0x0, + 0x10, 0xf, 0x80, 0x79, 0x0, 0x0, 0xd, 0xf5, + 0x79, 0x0, 0x0, 0x3, 0xef, 0xfd, 0x50, 0x0, + 0x0, 0x6, 0xcf, 0xfe, 0x40, 0x0, 0x0, 0x79, + 0x5e, 0xf1, 0x0, 0x0, 0x79, 0x5, 0xf3, 0x7, + 0x0, 0x79, 0x7, 0xf1, 0x2f, 0xe9, 0xbc, 0xaf, + 0xa0, 0x3, 0xae, 0xff, 0xd7, 0x0, 0x0, 0x0, + 0x79, 0x0, 0x0, 0x0, 0x0, 0x79, 0x0, 0x0, + + /* U+0025 "%" */ + 0x3, 0xde, 0x80, 0x0, 0x5, 0xd0, 0x0, 0xe4, + 0xc, 0x50, 0x1, 0xe3, 0x0, 0x4c, 0x0, 0x5a, + 0x0, 0xa9, 0x0, 0x6, 0xa0, 0x4, 0xc0, 0x4e, + 0x0, 0x0, 0x4c, 0x0, 0x5a, 0xd, 0x50, 0x0, + 0x0, 0xe4, 0x1c, 0x58, 0xa0, 0x0, 0x0, 0x3, + 0xce, 0x73, 0xe1, 0x3c, 0xe9, 0x0, 0x0, 0x0, + 0xd6, 0xe, 0x40, 0xa8, 0x0, 0x0, 0x7c, 0x3, + 0xc0, 0x3, 0xd0, 0x0, 0x2e, 0x20, 0x3c, 0x0, + 0x3d, 0x0, 0xb, 0x70, 0x0, 0xe2, 0x9, 0x80, + 0x6, 0xd0, 0x0, 0x4, 0xdd, 0xa0, + + /* U+0026 "&" */ + 0x0, 0x9, 0xef, 0xb1, 0x0, 0x0, 0x9, 0xe4, + 0x3c, 0xa0, 0x0, 0x0, 0xd9, 0x0, 0x7d, 0x0, + 0x0, 0xc, 0xc0, 0x1c, 0xa0, 0x0, 0x0, 0x3f, + 0xae, 0xc1, 0x0, 0x0, 0x1, 0xdf, 0xc0, 0x0, + 0x0, 0x3, 0xeb, 0x8f, 0x70, 0x18, 0x0, 0xdb, + 0x0, 0x7f, 0x65, 0xf0, 0x3f, 0x40, 0x0, 0x8f, + 0xea, 0x3, 0xf7, 0x0, 0x0, 0xcf, 0x70, 0xb, + 0xf9, 0x66, 0xcf, 0xbf, 0x40, 0x8, 0xdf, 0xea, + 0x30, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+0027 "'" */ + 0xf5, 0xf5, 0xe4, 0xe4, 0x72, + + /* U+0028 "(" */ + 0x0, 0xda, 0x5, 0xf2, 0xb, 0xc0, 0xf, 0x70, + 0x3f, 0x40, 0x5f, 0x20, 0x6f, 0x10, 0x7f, 0x0, + 0x6f, 0x10, 0x5f, 0x20, 0x3f, 0x40, 0xf, 0x70, + 0xb, 0xc0, 0x5, 0xf2, 0x0, 0xda, + + /* U+0029 ")" */ + 0x3f, 0x30, 0xc, 0xb0, 0x6, 0xf1, 0x1, 0xf6, + 0x0, 0xe9, 0x0, 0xbc, 0x0, 0xad, 0x0, 0xae, + 0x0, 0xad, 0x0, 0xbc, 0x0, 0xe9, 0x1, 0xf6, + 0x6, 0xf1, 0xc, 0xb0, 0x3f, 0x30, + + /* U+002A "*" */ + 0x0, 0x4a, 0x0, 0x6, 0x74, 0xa4, 0xa0, 0x2b, + 0xff, 0xe5, 0x0, 0x7f, 0xfb, 0x20, 0x7b, 0x6b, + 0x8d, 0x0, 0x4, 0xa0, 0x0, 0x0, 0x13, 0x0, + 0x0, + + /* U+002B "+" */ + 0x0, 0x5, 0x10, 0x0, 0x0, 0xf, 0x50, 0x0, + 0x0, 0xf, 0x50, 0x0, 0x1, 0x1f, 0x51, 0x10, + 0xef, 0xff, 0xff, 0xf3, 0x34, 0x4f, 0x74, 0x40, + 0x0, 0xf, 0x50, 0x0, 0x0, 0xf, 0x50, 0x0, + + /* U+002D "-" */ + 0x1, 0x11, 0x10, 0x1f, 0xff, 0xf3, 0x4, 0x44, + 0x40, + + /* U+002E "." */ + 0x3, 0x12, 0xfc, 0x1e, 0x90, + + /* U+002F "/" */ + 0x0, 0x0, 0x5, 0xf1, 0x0, 0x0, 0xa, 0xb0, + 0x0, 0x0, 0xf, 0x60, 0x0, 0x0, 0x5f, 0x10, + 0x0, 0x0, 0xab, 0x0, 0x0, 0x0, 0xf6, 0x0, + 0x0, 0x5, 0xf1, 0x0, 0x0, 0xa, 0xb0, 0x0, + 0x0, 0xf, 0x60, 0x0, 0x0, 0x4f, 0x10, 0x0, + 0x0, 0xac, 0x0, 0x0, 0x0, 0xf6, 0x0, 0x0, + 0x4, 0xf1, 0x0, 0x0, 0xa, 0xc0, 0x0, 0x0, + 0xe, 0x60, 0x0, 0x0, 0x4f, 0x10, 0x0, 0x0, + + /* U+0030 "0" */ + 0x0, 0x8, 0xef, 0xc5, 0x0, 0x0, 0xcf, 0xa8, + 0xcf, 0x70, 0x7, 0xf5, 0x0, 0xa, 0xf2, 0xd, + 0xc0, 0x0, 0x1, 0xf8, 0x1f, 0x80, 0x0, 0x0, + 0xdc, 0x3f, 0x60, 0x0, 0x0, 0xbd, 0x3f, 0x60, + 0x0, 0x0, 0xbd, 0x1f, 0x80, 0x0, 0x0, 0xdc, + 0xd, 0xc0, 0x0, 0x1, 0xf8, 0x7, 0xf5, 0x0, + 0xa, 0xf2, 0x0, 0xcf, 0xa8, 0xcf, 0x70, 0x0, + 0x8, 0xef, 0xc5, 0x0, + + /* U+0031 "1" */ + 0xef, 0xff, 0x36, 0x7a, 0xf3, 0x0, 0x5f, 0x30, + 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, + 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, + 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, + + /* U+0032 "2" */ + 0x4, 0xbe, 0xfd, 0x70, 0x7, 0xfd, 0x98, 0xcf, + 0x90, 0x28, 0x0, 0x0, 0xbf, 0x0, 0x0, 0x0, + 0x7, 0xf2, 0x0, 0x0, 0x0, 0xaf, 0x0, 0x0, + 0x0, 0x4f, 0x80, 0x0, 0x0, 0x3f, 0xc0, 0x0, + 0x0, 0x3e, 0xc1, 0x0, 0x0, 0x2e, 0xc1, 0x0, + 0x0, 0x2e, 0xd1, 0x0, 0x0, 0x2e, 0xf8, 0x77, + 0x77, 0x46, 0xff, 0xff, 0xff, 0xfa, + + /* U+0033 "3" */ + 0x6f, 0xff, 0xff, 0xff, 0x2, 0x77, 0x77, 0x9f, + 0xb0, 0x0, 0x0, 0xc, 0xe1, 0x0, 0x0, 0x9, + 0xf3, 0x0, 0x0, 0x5, 0xf6, 0x0, 0x0, 0x0, + 0xdf, 0xe9, 0x10, 0x0, 0x4, 0x59, 0xfd, 0x0, + 0x0, 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0x3f, + 0x64, 0x40, 0x0, 0x8, 0xf3, 0xbf, 0xc9, 0x8c, + 0xfb, 0x0, 0x7c, 0xff, 0xd7, 0x0, + + /* U+0034 "4" */ + 0x0, 0x0, 0x1, 0xeb, 0x0, 0x0, 0x0, 0x0, + 0xbe, 0x10, 0x0, 0x0, 0x0, 0x6f, 0x50, 0x0, + 0x0, 0x0, 0x2f, 0x90, 0x0, 0x0, 0x0, 0xc, + 0xd0, 0x0, 0x0, 0x0, 0x8, 0xf3, 0x1, 0xd5, + 0x0, 0x3, 0xf8, 0x0, 0x2f, 0x60, 0x0, 0xed, + 0x22, 0x23, 0xf7, 0x21, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0x81, 0x55, 0x55, 0x56, 0xf9, 0x52, 0x0, + 0x0, 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0x2, + 0xf6, 0x0, + + /* U+0035 "5" */ + 0x5, 0xff, 0xff, 0xff, 0x0, 0x7f, 0x77, 0x77, + 0x70, 0x8, 0xe0, 0x0, 0x0, 0x0, 0xad, 0x0, + 0x0, 0x0, 0xb, 0xc2, 0x10, 0x0, 0x0, 0xdf, + 0xff, 0xfb, 0x30, 0x4, 0x55, 0x68, 0xff, 0x20, + 0x0, 0x0, 0x4, 0xf8, 0x0, 0x0, 0x0, 0xf, + 0x92, 0x50, 0x0, 0x5, 0xf6, 0x8f, 0xd9, 0x8a, + 0xfd, 0x10, 0x5b, 0xef, 0xe9, 0x10, + + /* U+0036 "6" */ + 0x0, 0x5, 0xce, 0xfc, 0x60, 0x0, 0x9f, 0xc8, + 0x8b, 0x70, 0x5, 0xf8, 0x0, 0x0, 0x0, 0xc, + 0xd0, 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0x0, + 0x0, 0x2f, 0x68, 0xef, 0xfa, 0x10, 0x3f, 0xee, + 0x64, 0x8f, 0xd0, 0x2f, 0xf1, 0x0, 0x6, 0xf4, + 0xe, 0xc0, 0x0, 0x2, 0xf6, 0x9, 0xf1, 0x0, + 0x6, 0xf3, 0x1, 0xde, 0x86, 0x9f, 0xb0, 0x0, + 0x19, 0xef, 0xd8, 0x0, + + /* U+0037 "7" */ + 0x8f, 0xff, 0xff, 0xff, 0xe8, 0xf7, 0x77, 0x77, + 0xfc, 0x8f, 0x0, 0x0, 0x4f, 0x55, 0x90, 0x0, + 0xb, 0xe0, 0x0, 0x0, 0x2, 0xf8, 0x0, 0x0, + 0x0, 0x9f, 0x10, 0x0, 0x0, 0xf, 0xb0, 0x0, + 0x0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0xdd, 0x0, + 0x0, 0x0, 0x3f, 0x70, 0x0, 0x0, 0xa, 0xf1, + 0x0, 0x0, 0x1, 0xf9, 0x0, 0x0, + + /* U+0038 "8" */ + 0x0, 0x5c, 0xff, 0xd7, 0x0, 0x6, 0xfc, 0x76, + 0xaf, 0xa0, 0xc, 0xd0, 0x0, 0x9, 0xf1, 0xd, + 0xc0, 0x0, 0x7, 0xf2, 0x7, 0xf7, 0x11, 0x5e, + 0xc0, 0x0, 0xbf, 0xff, 0xfe, 0x10, 0x9, 0xf9, + 0x54, 0x7e, 0xd0, 0x2f, 0x80, 0x0, 0x4, 0xf6, + 0x4f, 0x50, 0x0, 0x0, 0xf8, 0x1f, 0xa0, 0x0, + 0x5, 0xf6, 0x9, 0xfb, 0x76, 0xaf, 0xd0, 0x0, + 0x6c, 0xff, 0xd8, 0x10, + + /* U+0039 "9" */ + 0x0, 0x8e, 0xfd, 0x80, 0x0, 0xc, 0xf8, 0x68, + 0xfc, 0x0, 0x5f, 0x50, 0x0, 0x3f, 0x70, 0x8f, + 0x0, 0x0, 0xe, 0xc0, 0x7f, 0x30, 0x0, 0x1f, + 0xf0, 0x1f, 0xd4, 0x13, 0xcf, 0xf1, 0x4, 0xef, + 0xff, 0xa9, 0xf0, 0x0, 0x2, 0x31, 0xa, 0xf0, + 0x0, 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, 0x0, + 0x9f, 0x30, 0x9, 0xa7, 0x8d, 0xf7, 0x0, 0x7, + 0xdf, 0xeb, 0x40, 0x0, + + /* U+003A ":" */ + 0x1e, 0x92, 0xfc, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x3, 0x12, 0xfc, 0x1e, 0x90, + + /* U+003B ";" */ + 0x1e, 0x92, 0xfc, 0x3, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xe9, 0x1f, 0xd0, 0xa8, 0xe, + 0x30, 0xa0, + + /* U+003C "<" */ + 0x0, 0x0, 0x0, 0x42, 0x0, 0x1, 0x7d, 0xf3, + 0x3, 0x9f, 0xe8, 0x10, 0xbf, 0xb5, 0x0, 0x0, + 0xee, 0x81, 0x0, 0x0, 0x17, 0xdf, 0xb4, 0x0, + 0x0, 0x4, 0xaf, 0xd2, 0x0, 0x0, 0x1, 0x82, + + /* U+003D "=" */ + 0xef, 0xff, 0xff, 0xf3, 0x45, 0x55, 0x55, 0x51, + 0x0, 0x0, 0x0, 0x0, 0x1, 0x11, 0x11, 0x10, + 0xef, 0xff, 0xff, 0xf3, 0x34, 0x44, 0x44, 0x40, + + /* U+003E ">" */ + 0x50, 0x0, 0x0, 0x0, 0xef, 0x92, 0x0, 0x0, + 0x6, 0xcf, 0xb5, 0x0, 0x0, 0x3, 0x9f, 0xe2, + 0x0, 0x0, 0x6c, 0xf3, 0x2, 0x9e, 0xe9, 0x20, + 0xbf, 0xc6, 0x0, 0x0, 0x93, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x4, 0xbe, 0xfd, 0x70, 0x7, 0xfc, 0x77, 0xbf, + 0xa0, 0x27, 0x0, 0x0, 0xcf, 0x0, 0x0, 0x0, + 0x9, 0xf0, 0x0, 0x0, 0x1, 0xea, 0x0, 0x0, + 0x1, 0xdd, 0x10, 0x0, 0x0, 0xce, 0x10, 0x0, + 0x0, 0x3f, 0x60, 0x0, 0x0, 0x1, 0x30, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x6, 0xf5, + 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + + /* U+0040 "@" */ + 0x0, 0x0, 0x17, 0xce, 0xfd, 0xb5, 0x0, 0x0, + 0x0, 0x5, 0xfb, 0x53, 0x23, 0x7d, 0xc2, 0x0, + 0x0, 0x6e, 0x40, 0x0, 0x0, 0x0, 0x8e, 0x10, + 0x2, 0xf4, 0x1, 0xae, 0xfa, 0x3f, 0x49, 0xb0, + 0xa, 0x90, 0x1e, 0xe6, 0x5b, 0xef, 0x40, 0xe3, + 0xf, 0x30, 0x8f, 0x10, 0x0, 0xaf, 0x40, 0x98, + 0x1f, 0x0, 0xd9, 0x0, 0x0, 0x3f, 0x40, 0x6a, + 0x3f, 0x0, 0xe8, 0x0, 0x0, 0x1f, 0x40, 0x5c, + 0x1f, 0x0, 0xd9, 0x0, 0x0, 0x3f, 0x40, 0x6a, + 0xf, 0x30, 0x8f, 0x10, 0x0, 0xaf, 0x40, 0x98, + 0xa, 0x90, 0x1e, 0xd6, 0x5a, 0xde, 0xa6, 0xf2, + 0x3, 0xf3, 0x1, 0xaf, 0xfa, 0x16, 0xee, 0x50, + 0x0, 0x6e, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xfb, 0x53, 0x23, 0x75, 0x0, 0x0, + 0x0, 0x0, 0x17, 0xce, 0xfd, 0xa3, 0x0, 0x0, + + /* U+0041 "A" */ + 0x0, 0x0, 0x2, 0xfd, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xf, + 0x9e, 0xb0, 0x0, 0x0, 0x0, 0x6, 0xf2, 0x7f, + 0x20, 0x0, 0x0, 0x0, 0xdc, 0x1, 0xf8, 0x0, + 0x0, 0x0, 0x4f, 0x60, 0xb, 0xe0, 0x0, 0x0, + 0xb, 0xf0, 0x0, 0x4f, 0x60, 0x0, 0x1, 0xfa, + 0x11, 0x11, 0xed, 0x0, 0x0, 0x8f, 0xff, 0xff, + 0xff, 0xf3, 0x0, 0xe, 0xc4, 0x44, 0x44, 0x4f, + 0xa0, 0x6, 0xf4, 0x0, 0x0, 0x0, 0xaf, 0x10, + 0xcd, 0x0, 0x0, 0x0, 0x2, 0xf8, + + /* U+0042 "B" */ + 0x5f, 0xff, 0xff, 0xeb, 0x40, 0x5, 0xf8, 0x55, + 0x57, 0xdf, 0x40, 0x5f, 0x40, 0x0, 0x1, 0xfa, + 0x5, 0xf4, 0x0, 0x0, 0xf, 0xa0, 0x5f, 0x51, + 0x11, 0x3a, 0xf4, 0x5, 0xff, 0xff, 0xff, 0xfa, + 0x0, 0x5f, 0x74, 0x44, 0x59, 0xfa, 0x5, 0xf4, + 0x0, 0x0, 0x8, 0xf2, 0x5f, 0x40, 0x0, 0x0, + 0x5f, 0x45, 0xf4, 0x0, 0x0, 0x9, 0xf2, 0x5f, + 0x85, 0x55, 0x6a, 0xfb, 0x5, 0xff, 0xff, 0xff, + 0xd7, 0x0, + + /* U+0043 "C" */ + 0x0, 0x2, 0x8d, 0xfe, 0xb4, 0x0, 0x4, 0xff, + 0xb8, 0x9d, 0xf9, 0x2, 0xfd, 0x20, 0x0, 0x8, + 0x50, 0xbf, 0x20, 0x0, 0x0, 0x0, 0xf, 0xa0, + 0x0, 0x0, 0x0, 0x2, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x2f, 0x60, 0x0, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xd2, 0x0, 0x0, 0x85, 0x0, + 0x5f, 0xfb, 0x89, 0xdf, 0x80, 0x0, 0x29, 0xdf, + 0xeb, 0x40, + + /* U+0044 "D" */ + 0x5f, 0xff, 0xff, 0xea, 0x30, 0x0, 0x5f, 0x97, + 0x77, 0x9e, 0xf8, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0xaf, 0x60, 0x5f, 0x40, 0x0, 0x0, 0xd, 0xe0, + 0x5f, 0x40, 0x0, 0x0, 0x6, 0xf4, 0x5f, 0x40, + 0x0, 0x0, 0x3, 0xf6, 0x5f, 0x40, 0x0, 0x0, + 0x3, 0xf6, 0x5f, 0x40, 0x0, 0x0, 0x6, 0xf4, + 0x5f, 0x40, 0x0, 0x0, 0xd, 0xe0, 0x5f, 0x40, + 0x0, 0x0, 0xaf, 0x60, 0x5f, 0x97, 0x77, 0x9e, + 0xf8, 0x0, 0x5f, 0xff, 0xff, 0xea, 0x30, 0x0, + + /* U+0045 "E" */ + 0x5f, 0xff, 0xff, 0xff, 0x95, 0xf9, 0x77, 0x77, + 0x74, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x51, 0x11, 0x11, 0x5, 0xff, + 0xff, 0xff, 0xe0, 0x5f, 0x74, 0x44, 0x44, 0x5, + 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x97, 0x77, + 0x77, 0x65, 0xff, 0xff, 0xff, 0xfd, + + /* U+0046 "F" */ + 0x5f, 0xff, 0xff, 0xff, 0x95, 0xf9, 0x77, 0x77, + 0x74, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf5, + 0x22, 0x22, 0x10, 0x5f, 0xff, 0xff, 0xfe, 0x5, + 0xf8, 0x55, 0x55, 0x40, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, + 0x0, 0x5, 0xf4, 0x0, 0x0, 0x0, + + /* U+0047 "G" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x4f, + 0xfb, 0x89, 0xdf, 0xb0, 0x2, 0xfd, 0x20, 0x0, + 0x6, 0x60, 0xb, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0x60, 0x0, 0x0, + 0x9, 0xf0, 0xf, 0xa0, 0x0, 0x0, 0x9, 0xf0, + 0xb, 0xf2, 0x0, 0x0, 0x9, 0xf0, 0x2, 0xfd, + 0x20, 0x0, 0xa, 0xf0, 0x0, 0x4f, 0xfb, 0x89, + 0xdf, 0xc0, 0x0, 0x2, 0x8d, 0xfe, 0xc6, 0x0, + + /* U+0048 "H" */ + 0x5f, 0x40, 0x0, 0x0, 0x4f, 0x55, 0xf4, 0x0, + 0x0, 0x4, 0xf5, 0x5f, 0x40, 0x0, 0x0, 0x4f, + 0x55, 0xf4, 0x0, 0x0, 0x4, 0xf5, 0x5f, 0x52, + 0x22, 0x22, 0x5f, 0x55, 0xff, 0xff, 0xff, 0xff, + 0xf5, 0x5f, 0x85, 0x55, 0x55, 0x8f, 0x55, 0xf4, + 0x0, 0x0, 0x4, 0xf5, 0x5f, 0x40, 0x0, 0x0, + 0x4f, 0x55, 0xf4, 0x0, 0x0, 0x4, 0xf5, 0x5f, + 0x40, 0x0, 0x0, 0x4f, 0x55, 0xf4, 0x0, 0x0, + 0x4, 0xf5, + + /* U+0049 "I" */ + 0x5f, 0x45, 0xf4, 0x5f, 0x45, 0xf4, 0x5f, 0x45, + 0xf4, 0x5f, 0x45, 0xf4, 0x5f, 0x45, 0xf4, 0x5f, + 0x45, 0xf4, + + /* U+004A "J" */ + 0x0, 0xff, 0xff, 0xfa, 0x0, 0x77, 0x77, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xfa, 0x0, 0x0, 0x0, 0xfa, + 0x0, 0x0, 0x0, 0xf9, 0x7, 0x20, 0x3, 0xf6, + 0xd, 0xe9, 0x8e, 0xf1, 0x1, 0xae, 0xfb, 0x30, + + /* U+004B "K" */ + 0x5f, 0x40, 0x0, 0x2, 0xeb, 0x5, 0xf4, 0x0, + 0x1, 0xec, 0x0, 0x5f, 0x40, 0x1, 0xde, 0x10, + 0x5, 0xf4, 0x0, 0xce, 0x20, 0x0, 0x5f, 0x40, + 0xbf, 0x30, 0x0, 0x5, 0xf4, 0x9f, 0x90, 0x0, + 0x0, 0x5f, 0xcf, 0xef, 0x40, 0x0, 0x5, 0xff, + 0x91, 0xee, 0x10, 0x0, 0x5f, 0xa0, 0x3, 0xfc, + 0x0, 0x5, 0xf4, 0x0, 0x6, 0xf8, 0x0, 0x5f, + 0x40, 0x0, 0x9, 0xf5, 0x5, 0xf4, 0x0, 0x0, + 0xc, 0xf2, + + /* U+004C "L" */ + 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, 0x0, + 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, 0xf4, + 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x5, + 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, + 0x5, 0xf4, 0x0, 0x0, 0x0, 0x5f, 0x97, 0x77, + 0x77, 0x25, 0xff, 0xff, 0xff, 0xf5, + + /* U+004D "M" */ + 0x5f, 0x40, 0x0, 0x0, 0x0, 0x1e, 0x95, 0xfc, + 0x0, 0x0, 0x0, 0x8, 0xf9, 0x5f, 0xf5, 0x0, + 0x0, 0x2, 0xff, 0x95, 0xfd, 0xe0, 0x0, 0x0, + 0xae, 0xf9, 0x5f, 0x5f, 0x70, 0x0, 0x3f, 0x5f, + 0x95, 0xf3, 0x8f, 0x10, 0xb, 0xc0, 0xf9, 0x5f, + 0x31, 0xe9, 0x4, 0xf3, 0xf, 0x95, 0xf3, 0x7, + 0xf2, 0xdb, 0x0, 0xf9, 0x5f, 0x30, 0xd, 0xef, + 0x20, 0xf, 0x95, 0xf3, 0x0, 0x5f, 0x90, 0x0, + 0xf9, 0x5f, 0x30, 0x0, 0x71, 0x0, 0xf, 0x95, + 0xf3, 0x0, 0x0, 0x0, 0x0, 0xf9, + + /* U+004E "N" */ + 0x5f, 0x50, 0x0, 0x0, 0x4f, 0x55, 0xff, 0x20, + 0x0, 0x4, 0xf5, 0x5f, 0xfd, 0x0, 0x0, 0x4f, + 0x55, 0xfa, 0xf9, 0x0, 0x4, 0xf5, 0x5f, 0x4a, + 0xf5, 0x0, 0x4f, 0x55, 0xf4, 0xd, 0xf2, 0x4, + 0xf5, 0x5f, 0x40, 0x2f, 0xd0, 0x4f, 0x55, 0xf4, + 0x0, 0x6f, 0x94, 0xf5, 0x5f, 0x40, 0x0, 0xaf, + 0xaf, 0x55, 0xf4, 0x0, 0x0, 0xdf, 0xf5, 0x5f, + 0x40, 0x0, 0x2, 0xff, 0x55, 0xf4, 0x0, 0x0, + 0x6, 0xf5, + + /* U+004F "O" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x4, + 0xff, 0xb8, 0x9e, 0xfa, 0x0, 0x2, 0xfd, 0x20, + 0x0, 0x8, 0xf9, 0x0, 0xbf, 0x20, 0x0, 0x0, + 0xa, 0xf2, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x3f, + 0x72, 0xf6, 0x0, 0x0, 0x0, 0x0, 0xf9, 0x2f, + 0x60, 0x0, 0x0, 0x0, 0xf, 0x90, 0xfa, 0x0, + 0x0, 0x0, 0x3, 0xf7, 0xb, 0xf2, 0x0, 0x0, + 0x0, 0xaf, 0x20, 0x2f, 0xd2, 0x0, 0x0, 0x8f, + 0x90, 0x0, 0x4f, 0xfb, 0x89, 0xef, 0xa0, 0x0, + 0x0, 0x28, 0xdf, 0xeb, 0x50, 0x0, + + /* U+0050 "P" */ + 0x5f, 0xff, 0xff, 0xd7, 0x0, 0x5f, 0x97, 0x78, + 0xbf, 0xc0, 0x5f, 0x40, 0x0, 0x7, 0xf6, 0x5f, + 0x40, 0x0, 0x0, 0xfa, 0x5f, 0x40, 0x0, 0x0, + 0xfa, 0x5f, 0x40, 0x0, 0x3, 0xf8, 0x5f, 0x62, + 0x23, 0x6e, 0xf1, 0x5f, 0xff, 0xff, 0xfd, 0x30, + 0x5f, 0x85, 0x54, 0x20, 0x0, 0x5f, 0x40, 0x0, + 0x0, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x0, 0x5f, + 0x40, 0x0, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x0, 0x1, 0x8d, 0xfe, 0xb5, 0x0, 0x0, 0x0, + 0x4e, 0xfb, 0x89, 0xef, 0xa0, 0x0, 0x2, 0xfd, + 0x20, 0x0, 0x8, 0xf9, 0x0, 0xa, 0xf2, 0x0, + 0x0, 0x0, 0xaf, 0x20, 0xf, 0xa0, 0x0, 0x0, + 0x0, 0x3f, 0x70, 0x2f, 0x60, 0x0, 0x0, 0x0, + 0xf, 0x90, 0x2f, 0x60, 0x0, 0x0, 0x0, 0xf, + 0x90, 0x1f, 0x90, 0x0, 0x0, 0x0, 0x2f, 0x70, + 0xb, 0xf1, 0x0, 0x0, 0x0, 0xaf, 0x20, 0x3, + 0xfc, 0x10, 0x0, 0x7, 0xf9, 0x0, 0x0, 0x6f, + 0xfa, 0x78, 0xdf, 0xb0, 0x0, 0x0, 0x3, 0xae, + 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, + 0xd4, 0x15, 0xb0, 0x0, 0x0, 0x0, 0x2, 0xbf, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x1, 0x31, + 0x0, + + /* U+0052 "R" */ + 0x5f, 0xff, 0xff, 0xd7, 0x0, 0x5f, 0x97, 0x78, + 0xbf, 0xc0, 0x5f, 0x40, 0x0, 0x7, 0xf6, 0x5f, + 0x40, 0x0, 0x0, 0xfa, 0x5f, 0x40, 0x0, 0x0, + 0xfa, 0x5f, 0x40, 0x0, 0x3, 0xf8, 0x5f, 0x52, + 0x23, 0x6e, 0xe1, 0x5f, 0xff, 0xff, 0xfc, 0x30, + 0x5f, 0x85, 0x55, 0xf9, 0x0, 0x5f, 0x40, 0x0, + 0x7f, 0x40, 0x5f, 0x40, 0x0, 0xc, 0xe0, 0x5f, + 0x40, 0x0, 0x2, 0xf9, + + /* U+0053 "S" */ + 0x0, 0x5c, 0xef, 0xd9, 0x20, 0x7, 0xfc, 0x87, + 0xaf, 0x90, 0xe, 0xc0, 0x0, 0x1, 0x10, 0xf, + 0x80, 0x0, 0x0, 0x0, 0xd, 0xf5, 0x0, 0x0, + 0x0, 0x3, 0xef, 0xea, 0x50, 0x0, 0x0, 0x5, + 0xae, 0xfe, 0x40, 0x0, 0x0, 0x0, 0x4e, 0xf1, + 0x0, 0x0, 0x0, 0x5, 0xf3, 0x8, 0x0, 0x0, + 0x8, 0xf2, 0x2f, 0xfa, 0x77, 0xbf, 0xa0, 0x2, + 0x9d, 0xff, 0xc7, 0x0, + + /* U+0054 "T" */ + 0xff, 0xff, 0xff, 0xff, 0xf5, 0x67, 0x78, 0xfb, + 0x77, 0x72, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, + 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, + 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, + 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, + + /* U+0055 "U" */ + 0x6f, 0x30, 0x0, 0x0, 0x8f, 0x16, 0xf3, 0x0, + 0x0, 0x8, 0xf1, 0x6f, 0x30, 0x0, 0x0, 0x8f, + 0x16, 0xf3, 0x0, 0x0, 0x8, 0xf1, 0x6f, 0x30, + 0x0, 0x0, 0x8f, 0x16, 0xf3, 0x0, 0x0, 0x8, + 0xf1, 0x6f, 0x30, 0x0, 0x0, 0x8f, 0x5, 0xf4, + 0x0, 0x0, 0x9, 0xf0, 0x3f, 0x70, 0x0, 0x0, + 0xcd, 0x0, 0xde, 0x20, 0x0, 0x5f, 0x80, 0x4, + 0xff, 0xa8, 0xbf, 0xd0, 0x0, 0x3, 0xbe, 0xfd, + 0x81, 0x0, + + /* U+0056 "V" */ + 0xc, 0xe0, 0x0, 0x0, 0x0, 0x6f, 0x30, 0x6f, + 0x50, 0x0, 0x0, 0xc, 0xc0, 0x0, 0xfb, 0x0, + 0x0, 0x3, 0xf6, 0x0, 0x9, 0xf2, 0x0, 0x0, + 0xae, 0x0, 0x0, 0x2f, 0x80, 0x0, 0x1f, 0x90, + 0x0, 0x0, 0xce, 0x0, 0x7, 0xf2, 0x0, 0x0, + 0x5, 0xf6, 0x0, 0xdb, 0x0, 0x0, 0x0, 0xe, + 0xc0, 0x4f, 0x50, 0x0, 0x0, 0x0, 0x8f, 0x3b, + 0xe0, 0x0, 0x0, 0x0, 0x2, 0xfb, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0xb, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xb0, 0x0, 0x0, + + /* U+0057 "W" */ + 0x5f, 0x40, 0x0, 0x0, 0xdf, 0x0, 0x0, 0x2, + 0xf5, 0xf, 0x90, 0x0, 0x2, 0xff, 0x40, 0x0, + 0x7, 0xf0, 0xb, 0xe0, 0x0, 0x7, 0xfe, 0x90, + 0x0, 0xc, 0xb0, 0x6, 0xf3, 0x0, 0xc, 0xaa, + 0xe0, 0x0, 0x1f, 0x60, 0x1, 0xf8, 0x0, 0x1f, + 0x54, 0xf3, 0x0, 0x6f, 0x10, 0x0, 0xcd, 0x0, + 0x7f, 0x10, 0xf8, 0x0, 0xcc, 0x0, 0x0, 0x7f, + 0x20, 0xcb, 0x0, 0xad, 0x1, 0xf7, 0x0, 0x0, + 0x2f, 0x71, 0xf6, 0x0, 0x5f, 0x26, 0xf2, 0x0, + 0x0, 0xd, 0xc6, 0xf1, 0x0, 0xf, 0x7b, 0xd0, + 0x0, 0x0, 0x8, 0xfd, 0xc0, 0x0, 0xb, 0xdf, + 0x80, 0x0, 0x0, 0x3, 0xff, 0x70, 0x0, 0x6, + 0xff, 0x30, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, + 0x1, 0xfe, 0x0, 0x0, + + /* U+0058 "X" */ + 0x3f, 0x90, 0x0, 0x0, 0xcd, 0x0, 0x8f, 0x40, + 0x0, 0x7f, 0x30, 0x0, 0xde, 0x10, 0x2f, 0x80, + 0x0, 0x3, 0xfa, 0xc, 0xd0, 0x0, 0x0, 0x7, + 0xfb, 0xf3, 0x0, 0x0, 0x0, 0xc, 0xf8, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xc0, 0x0, 0x0, 0x0, + 0xbf, 0x7f, 0x70, 0x0, 0x0, 0x6f, 0x60, 0xaf, + 0x20, 0x0, 0x2f, 0xb0, 0x1, 0xed, 0x0, 0xc, + 0xf1, 0x0, 0x4, 0xf8, 0x7, 0xf6, 0x0, 0x0, + 0x9, 0xf3, + + /* U+0059 "Y" */ + 0xc, 0xe0, 0x0, 0x0, 0x7, 0xf2, 0x3, 0xf7, + 0x0, 0x0, 0x1f, 0x90, 0x0, 0xaf, 0x10, 0x0, + 0x9e, 0x10, 0x0, 0x1f, 0xa0, 0x2, 0xf6, 0x0, + 0x0, 0x8, 0xf3, 0xb, 0xd0, 0x0, 0x0, 0x0, + 0xec, 0x4f, 0x40, 0x0, 0x0, 0x0, 0x5f, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0xc, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xf0, 0x0, 0x0, + + /* U+005A "Z" */ + 0x3f, 0xff, 0xff, 0xff, 0xfd, 0x1, 0x77, 0x77, + 0x77, 0xbf, 0x90, 0x0, 0x0, 0x0, 0x1e, 0xc0, + 0x0, 0x0, 0x0, 0xc, 0xf2, 0x0, 0x0, 0x0, + 0x8, 0xf5, 0x0, 0x0, 0x0, 0x4, 0xf9, 0x0, + 0x0, 0x0, 0x1, 0xec, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x20, 0x0, 0x0, 0x0, 0x8f, 0x50, 0x0, + 0x0, 0x0, 0x4f, 0x90, 0x0, 0x0, 0x0, 0x1e, + 0xf8, 0x77, 0x77, 0x77, 0x5, 0xff, 0xff, 0xff, + 0xff, 0xf0, + + /* U+005B "[" */ + 0x5f, 0xff, 0x5, 0xf7, 0x50, 0x5f, 0x30, 0x5, + 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, + 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, 0x5, 0xf3, + 0x0, 0x5f, 0x30, 0x5, 0xf3, 0x0, 0x5f, 0x30, + 0x5, 0xf7, 0x50, 0x5f, 0xff, 0x0, + + /* U+005C "\\" */ + 0x7e, 0x0, 0x0, 0x0, 0x1f, 0x40, 0x0, 0x0, + 0xc, 0x90, 0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, + 0x2, 0xf4, 0x0, 0x0, 0x0, 0xc9, 0x0, 0x0, + 0x0, 0x7e, 0x0, 0x0, 0x0, 0x2f, 0x40, 0x0, + 0x0, 0xc, 0x90, 0x0, 0x0, 0x7, 0xe0, 0x0, + 0x0, 0x2, 0xf3, 0x0, 0x0, 0x0, 0xd9, 0x0, + 0x0, 0x0, 0x7e, 0x0, 0x0, 0x0, 0x2f, 0x30, + 0x0, 0x0, 0xd, 0x90, 0x0, 0x0, 0x7, 0xe0, + + /* U+005D "]" */ + 0xbf, 0xfa, 0x35, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, 0x0, 0xea, + 0x0, 0xea, 0x35, 0xea, 0xbf, 0xfa, + + /* U+005E "^" */ + 0x0, 0x2f, 0x80, 0x0, 0x0, 0x9d, 0xe0, 0x0, + 0x0, 0xf3, 0xd5, 0x0, 0x6, 0xd0, 0x7b, 0x0, + 0xc, 0x60, 0x1f, 0x20, 0x3f, 0x10, 0xb, 0x80, + 0x9a, 0x0, 0x4, 0xe0, + + /* U+005F "_" */ + 0xff, 0xff, 0xff, 0xff, 0x11, 0x11, 0x11, 0x11, + + /* U+0060 "`" */ + 0x7, 0xf6, 0x0, 0x3, 0xe7, + + /* U+0061 "a" */ + 0x1, 0x9e, 0xfd, 0x80, 0x0, 0xce, 0x87, 0xaf, + 0x90, 0x2, 0x0, 0x0, 0xaf, 0x0, 0x0, 0x0, + 0x6, 0xf2, 0x2, 0xbe, 0xff, 0xff, 0x20, 0xec, + 0x42, 0x27, 0xf2, 0x2f, 0x50, 0x0, 0x7f, 0x20, + 0xec, 0x42, 0x7f, 0xf2, 0x2, 0xbf, 0xfb, 0x6f, + 0x20, + + /* U+0062 "b" */ + 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x2b, 0xfe, 0xb3, 0x0, 0x8f, 0xec, 0x78, 0xef, + 0x30, 0x8f, 0xa0, 0x0, 0x1e, 0xc0, 0x8f, 0x20, + 0x0, 0x7, 0xf1, 0x8f, 0x0, 0x0, 0x5, 0xf3, + 0x8f, 0x20, 0x0, 0x7, 0xf1, 0x8f, 0xa0, 0x0, + 0x1e, 0xd0, 0x8f, 0xec, 0x78, 0xef, 0x30, 0x8e, + 0x2b, 0xfe, 0xb3, 0x0, + + /* U+0063 "c" */ + 0x0, 0x3a, 0xef, 0xc4, 0x0, 0x4f, 0xd8, 0x7c, + 0xf4, 0xd, 0xd0, 0x0, 0x7, 0x13, 0xf6, 0x0, + 0x0, 0x0, 0x4f, 0x30, 0x0, 0x0, 0x3, 0xf6, + 0x0, 0x0, 0x0, 0xd, 0xd0, 0x0, 0x6, 0x10, + 0x4f, 0xd7, 0x7c, 0xf4, 0x0, 0x3a, 0xef, 0xc4, + 0x0, + + /* U+0064 "d" */ + 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x3b, 0xff, 0xa3, 0xf7, 0x4, 0xfd, 0x87, 0xce, + 0xf7, 0xe, 0xd0, 0x0, 0xb, 0xf7, 0x3f, 0x60, + 0x0, 0x3, 0xf7, 0x4f, 0x30, 0x0, 0x1, 0xf7, + 0x3f, 0x50, 0x0, 0x3, 0xf7, 0xe, 0xc0, 0x0, + 0xa, 0xf7, 0x4, 0xfc, 0x65, 0xbe, 0xf7, 0x0, + 0x3b, 0xff, 0xb2, 0xf7, + + /* U+0065 "e" */ + 0x0, 0x3b, 0xfe, 0xa2, 0x0, 0x4, 0xfc, 0x67, + 0xee, 0x20, 0xe, 0xc0, 0x0, 0x1e, 0xa0, 0x3f, + 0x50, 0x0, 0x7, 0xf0, 0x4f, 0xff, 0xff, 0xff, + 0xf1, 0x3f, 0x72, 0x22, 0x22, 0x20, 0xe, 0xc0, + 0x0, 0x2, 0x0, 0x4, 0xfd, 0x87, 0xaf, 0x50, + 0x0, 0x3a, 0xef, 0xd6, 0x0, + + /* U+0066 "f" */ + 0x0, 0x5d, 0xfc, 0x0, 0x2f, 0xb5, 0x70, 0x4, + 0xf3, 0x0, 0xc, 0xff, 0xff, 0xa0, 0x48, 0xf7, + 0x53, 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, + 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, + 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, 0x0, 0x5f, + 0x30, 0x0, + + /* U+0067 "g" */ + 0x0, 0x3b, 0xff, 0xb2, 0xe9, 0x4, 0xfe, 0x87, + 0xcf, 0xf9, 0xe, 0xd1, 0x0, 0xa, 0xf9, 0x3f, + 0x60, 0x0, 0x1, 0xf9, 0x4f, 0x40, 0x0, 0x0, + 0xf9, 0x3f, 0x60, 0x0, 0x1, 0xf9, 0xe, 0xd0, + 0x0, 0x9, 0xf9, 0x4, 0xfd, 0x87, 0xcf, 0xf8, + 0x0, 0x3b, 0xff, 0xb3, 0xf7, 0x0, 0x0, 0x0, + 0x5, 0xf4, 0x9, 0xe9, 0x77, 0xaf, 0xb0, 0x1, + 0x7c, 0xff, 0xd8, 0x0, + + /* U+0068 "h" */ + 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf2, 0xbf, + 0xea, 0x10, 0x8f, 0xfb, 0x89, 0xfd, 0x8, 0xf8, + 0x0, 0x6, 0xf4, 0x8f, 0x10, 0x0, 0x1f, 0x78, + 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, + 0x88, 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, + 0xf, 0x88, 0xf0, 0x0, 0x0, 0xf8, + + /* U+0069 "i" */ + 0x9e, 0x1a, 0xf2, 0x0, 0x8, 0xf0, 0x8f, 0x8, + 0xf0, 0x8f, 0x8, 0xf0, 0x8f, 0x8, 0xf0, 0x8f, + 0x8, 0xf0, + + /* U+006A "j" */ + 0x0, 0x7, 0xe2, 0x0, 0x9, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, + 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, + 0x0, 0x7, 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x7, + 0xf1, 0x0, 0x7, 0xf1, 0x0, 0x8, 0xf0, 0x18, + 0x6e, 0xc0, 0x3e, 0xfc, 0x20, + + /* U+006B "k" */ + 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, 0x0, + 0x0, 0x8f, 0x0, 0x0, 0x0, 0x8, 0xf0, 0x0, + 0x1d, 0xd1, 0x8f, 0x0, 0x1d, 0xe2, 0x8, 0xf0, + 0x1d, 0xe2, 0x0, 0x8f, 0x2d, 0xf3, 0x0, 0x8, + 0xfe, 0xff, 0x70, 0x0, 0x8f, 0xe2, 0xbf, 0x30, + 0x8, 0xf2, 0x1, 0xee, 0x10, 0x8f, 0x0, 0x3, + 0xfb, 0x8, 0xf0, 0x0, 0x7, 0xf7, + + /* U+006C "l" */ + 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8f, + 0x8f, 0x8f, 0x8f, 0x8f, + + /* U+006D "m" */ + 0x8e, 0x3c, 0xfe, 0x91, 0x3b, 0xfe, 0xa2, 0x8, + 0xff, 0x96, 0x9f, 0xcf, 0xc6, 0x8f, 0xd0, 0x8f, + 0x70, 0x0, 0x9f, 0xc0, 0x0, 0x5f, 0x58, 0xf1, + 0x0, 0x5, 0xf6, 0x0, 0x1, 0xf7, 0x8f, 0x0, + 0x0, 0x4f, 0x40, 0x0, 0xf, 0x88, 0xf0, 0x0, + 0x4, 0xf4, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, + 0x4f, 0x40, 0x0, 0xf, 0x88, 0xf0, 0x0, 0x4, + 0xf4, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0x4f, + 0x40, 0x0, 0xf, 0x80, + + /* U+006E "n" */ + 0x8e, 0x3b, 0xfe, 0xa1, 0x8, 0xff, 0xa6, 0x8f, + 0xd0, 0x8f, 0x80, 0x0, 0x6f, 0x48, 0xf1, 0x0, + 0x1, 0xf7, 0x8f, 0x0, 0x0, 0xf, 0x88, 0xf0, + 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, 0x88, + 0xf0, 0x0, 0x0, 0xf8, 0x8f, 0x0, 0x0, 0xf, + 0x80, + + /* U+006F "o" */ + 0x0, 0x3b, 0xef, 0xc4, 0x0, 0x4, 0xfd, 0x87, + 0xcf, 0x60, 0xe, 0xd0, 0x0, 0xb, 0xf1, 0x3f, + 0x60, 0x0, 0x3, 0xf5, 0x4f, 0x30, 0x0, 0x1, + 0xf7, 0x3f, 0x60, 0x0, 0x3, 0xf5, 0xe, 0xd0, + 0x0, 0xb, 0xf1, 0x4, 0xfd, 0x77, 0xcf, 0x60, + 0x0, 0x3b, 0xef, 0xc4, 0x0, + + /* U+0070 "p" */ + 0x8e, 0x3b, 0xfe, 0xb3, 0x0, 0x8f, 0xfb, 0x57, + 0xdf, 0x30, 0x8f, 0x90, 0x0, 0xd, 0xc0, 0x8f, + 0x10, 0x0, 0x7, 0xf1, 0x8f, 0x0, 0x0, 0x5, + 0xf3, 0x8f, 0x20, 0x0, 0x7, 0xf1, 0x8f, 0xa0, + 0x0, 0x1e, 0xd0, 0x8f, 0xec, 0x78, 0xef, 0x30, + 0x8f, 0x2b, 0xfe, 0xb3, 0x0, 0x8f, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x0, 0x0, 0x0, 0x0, + + /* U+0071 "q" */ + 0x0, 0x3b, 0xff, 0xa2, 0xf7, 0x4, 0xfd, 0x87, + 0xde, 0xf7, 0xe, 0xd0, 0x0, 0xb, 0xf7, 0x3f, + 0x60, 0x0, 0x3, 0xf7, 0x4f, 0x30, 0x0, 0x1, + 0xf7, 0x3f, 0x60, 0x0, 0x3, 0xf7, 0xe, 0xd0, + 0x0, 0xb, 0xf7, 0x4, 0xfd, 0x77, 0xce, 0xf7, + 0x0, 0x3b, 0xff, 0xa3, 0xf7, 0x0, 0x0, 0x0, + 0x1, 0xf7, 0x0, 0x0, 0x0, 0x1, 0xf7, 0x0, + 0x0, 0x0, 0x1, 0xf7, + + /* U+0072 "r" */ + 0x8e, 0x2b, 0xf0, 0x8f, 0xed, 0x90, 0x8f, 0xa0, + 0x0, 0x8f, 0x20, 0x0, 0x8f, 0x0, 0x0, 0x8f, + 0x0, 0x0, 0x8f, 0x0, 0x0, 0x8f, 0x0, 0x0, + 0x8f, 0x0, 0x0, + + /* U+0073 "s" */ + 0x2, 0xae, 0xfd, 0x91, 0x1e, 0xd7, 0x69, 0xd0, + 0x4f, 0x30, 0x0, 0x0, 0x2f, 0xb4, 0x10, 0x0, + 0x6, 0xef, 0xfd, 0x60, 0x0, 0x1, 0x5b, 0xf5, + 0x1, 0x0, 0x0, 0xf7, 0x5f, 0xa7, 0x6b, 0xf3, + 0x19, 0xdf, 0xec, 0x40, + + /* U+0074 "t" */ + 0x5, 0xf3, 0x0, 0x0, 0x5f, 0x30, 0x0, 0xcf, + 0xff, 0xfa, 0x4, 0x8f, 0x75, 0x30, 0x5, 0xf3, + 0x0, 0x0, 0x5f, 0x30, 0x0, 0x5, 0xf3, 0x0, + 0x0, 0x5f, 0x30, 0x0, 0x4, 0xf4, 0x0, 0x0, + 0x1f, 0xc6, 0x80, 0x0, 0x5d, 0xfc, 0x10, + + /* U+0075 "u" */ + 0xae, 0x0, 0x0, 0x2f, 0x5a, 0xe0, 0x0, 0x2, + 0xf5, 0xae, 0x0, 0x0, 0x2f, 0x5a, 0xe0, 0x0, + 0x2, 0xf5, 0xae, 0x0, 0x0, 0x2f, 0x59, 0xf0, + 0x0, 0x4, 0xf5, 0x6f, 0x30, 0x0, 0xaf, 0x51, + 0xee, 0x76, 0xbf, 0xf5, 0x2, 0xbe, 0xfb, 0x3f, + 0x50, + + /* U+0076 "v" */ + 0xd, 0xc0, 0x0, 0x0, 0xcb, 0x6, 0xf2, 0x0, + 0x2, 0xf5, 0x0, 0xf9, 0x0, 0x9, 0xe0, 0x0, + 0x9e, 0x0, 0xf, 0x80, 0x0, 0x2f, 0x60, 0x6f, + 0x10, 0x0, 0xc, 0xc0, 0xcb, 0x0, 0x0, 0x5, + 0xf6, 0xf4, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x0, + 0x0, 0x0, 0x8f, 0x70, 0x0, + + /* U+0077 "w" */ + 0xbb, 0x0, 0x0, 0x9f, 0x10, 0x0, 0x4f, 0x16, + 0xf1, 0x0, 0xe, 0xf6, 0x0, 0x9, 0xc0, 0xf, + 0x60, 0x5, 0xfc, 0xb0, 0x0, 0xf6, 0x0, 0xac, + 0x0, 0xab, 0x5f, 0x10, 0x5f, 0x10, 0x5, 0xf1, + 0xf, 0x50, 0xf7, 0xa, 0xb0, 0x0, 0xf, 0x76, + 0xf0, 0x9, 0xc0, 0xf5, 0x0, 0x0, 0xac, 0xba, + 0x0, 0x4f, 0x8f, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0xef, 0xa0, 0x0, 0x0, 0xe, 0xe0, 0x0, + 0x8, 0xf4, 0x0, 0x0, + + /* U+0078 "x" */ + 0x4f, 0x70, 0x0, 0x9f, 0x20, 0x8f, 0x30, 0x5f, + 0x50, 0x0, 0xcd, 0x2e, 0x90, 0x0, 0x2, 0xff, + 0xd0, 0x0, 0x0, 0xa, 0xf6, 0x0, 0x0, 0x4, + 0xfd, 0xe1, 0x0, 0x1, 0xeb, 0xd, 0xc0, 0x0, + 0xbe, 0x10, 0x3f, 0x80, 0x6f, 0x40, 0x0, 0x7f, + 0x40, + + /* U+0079 "y" */ + 0xd, 0xc0, 0x0, 0x0, 0xcb, 0x6, 0xf3, 0x0, + 0x2, 0xf4, 0x0, 0xea, 0x0, 0x9, 0xd0, 0x0, + 0x8f, 0x10, 0x1f, 0x70, 0x0, 0x1f, 0x70, 0x7f, + 0x10, 0x0, 0xa, 0xe0, 0xd9, 0x0, 0x0, 0x3, + 0xf9, 0xf2, 0x0, 0x0, 0x0, 0xcf, 0xb0, 0x0, + 0x0, 0x0, 0x6f, 0x40, 0x0, 0x0, 0x0, 0xad, + 0x0, 0x0, 0x1c, 0x79, 0xf5, 0x0, 0x0, 0x1a, + 0xee, 0x70, 0x0, 0x0, + + /* U+007A "z" */ + 0x4f, 0xff, 0xff, 0xf9, 0x15, 0x55, 0x5b, 0xf4, + 0x0, 0x0, 0x4f, 0x80, 0x0, 0x1, 0xec, 0x0, + 0x0, 0xb, 0xe1, 0x0, 0x0, 0x8f, 0x40, 0x0, + 0x4, 0xf7, 0x0, 0x0, 0x1e, 0xe5, 0x55, 0x53, + 0x5f, 0xff, 0xff, 0xfc, + + /* U+007B "{" */ + 0x0, 0x2c, 0xf5, 0x0, 0xaf, 0x61, 0x0, 0xcc, + 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, 0x0, 0x0, + 0xdb, 0x0, 0x2, 0xea, 0x0, 0x1f, 0xf4, 0x0, + 0x5, 0xfa, 0x0, 0x0, 0xdb, 0x0, 0x0, 0xdb, + 0x0, 0x0, 0xdb, 0x0, 0x0, 0xcc, 0x0, 0x0, + 0xaf, 0x61, 0x0, 0x2c, 0xf5, + + /* U+007C "|" */ + 0x5f, 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x15, + 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, + 0x15, 0xf1, 0x5f, 0x15, 0xf1, 0x5f, 0x10, + + /* U+007D "}" */ + 0xbe, 0x80, 0x3, 0xaf, 0x40, 0x1, 0xf6, 0x0, + 0x1f, 0x70, 0x1, 0xf7, 0x0, 0x1f, 0x70, 0x0, + 0xf9, 0x0, 0xa, 0xfb, 0x0, 0xfb, 0x20, 0x1f, + 0x70, 0x1, 0xf7, 0x0, 0x1f, 0x70, 0x1, 0xf6, + 0x3, 0xaf, 0x40, 0xbe, 0x90, 0x0, + + /* U+007E "~" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3d, 0xe4, 0x0, + 0xb5, 0xc, 0x86, 0xf5, 0x1e, 0x20, 0xf0, 0x3, + 0xef, 0x90, 0x2, 0x0, 0x0, 0x10, 0x0, + + /* U+F001 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, 0xdc, + 0x0, 0x0, 0x0, 0x0, 0x16, 0xbf, 0xff, 0xff, + 0x0, 0x0, 0x3, 0x8d, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, + 0x0, 0x0, 0xff, 0xff, 0xea, 0x51, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x83, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xff, + 0x0, 0x0, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xff, + 0x2b, 0xff, 0xff, 0x0, 0x0, 0xdf, 0xff, 0xfd, + 0xdf, 0xff, 0xff, 0x0, 0x0, 0x2b, 0xff, 0xb2, + 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2b, 0xff, 0xb2, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F008 "" */ + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xf0, 0xf, 0xec, 0xcc, 0xcc, 0xce, 0xf0, 0xf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x8, 0xff, 0xff, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xf0, 0xf, 0x80, 0x0, 0x0, 0x8, 0xf0, 0xf, + 0xff, 0xff, 0xc8, 0x88, 0x88, 0x8c, 0xff, 0xff, + 0xd0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xd, + + /* U+F00B "" */ + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xa5, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xdf, 0xff, 0x73, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F00C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xff, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xc0, + 0x1b, 0xa0, 0x0, 0x0, 0xb, 0xff, 0xfc, 0x0, + 0xcf, 0xfb, 0x0, 0x0, 0xbf, 0xff, 0xc0, 0x0, + 0xbf, 0xff, 0xb0, 0xb, 0xff, 0xfc, 0x0, 0x0, + 0xc, 0xff, 0xfb, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, 0xcf, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0xc, 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+F00D "" */ + 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xfc, 0x10, + 0x0, 0x1c, 0xf8, 0xff, 0xfc, 0x10, 0x1c, 0xff, + 0xf5, 0xff, 0xfc, 0x2c, 0xff, 0xf5, 0x5, 0xff, + 0xff, 0xff, 0xf5, 0x0, 0x5, 0xff, 0xff, 0xf5, + 0x0, 0x0, 0x1d, 0xff, 0xfd, 0x10, 0x0, 0x1c, + 0xff, 0xff, 0xfc, 0x10, 0x1c, 0xff, 0xf9, 0xff, + 0xfc, 0x1c, 0xff, 0xf5, 0x5, 0xff, 0xfc, 0xdf, + 0xf5, 0x0, 0x5, 0xff, 0xd1, 0xa4, 0x0, 0x0, + 0x4, 0xa1, + + /* U+F011 "" */ + 0x0, 0x0, 0x0, 0x4f, 0xe0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0x10, 0x6f, 0xf1, 0x3, 0x10, 0x0, + 0x0, 0x5f, 0xd0, 0x6f, 0xf1, 0x3f, 0xd1, 0x0, + 0x3, 0xff, 0xf1, 0x6f, 0xf1, 0x5f, 0xfd, 0x0, + 0xd, 0xff, 0x40, 0x6f, 0xf1, 0x9, 0xff, 0x70, + 0x4f, 0xf7, 0x0, 0x6f, 0xf1, 0x0, 0xcf, 0xe0, + 0x9f, 0xf0, 0x0, 0x6f, 0xf1, 0x0, 0x5f, 0xf3, + 0xbf, 0xc0, 0x0, 0x6f, 0xf1, 0x0, 0x2f, 0xf5, + 0xbf, 0xc0, 0x0, 0x4f, 0xe0, 0x0, 0x1f, 0xf6, + 0xaf, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf4, + 0x6f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf0, + 0xf, 0xfe, 0x10, 0x0, 0x0, 0x5, 0xff, 0xa0, + 0x6, 0xff, 0xd3, 0x0, 0x0, 0x7f, 0xff, 0x20, + 0x0, 0x9f, 0xff, 0xda, 0xbe, 0xff, 0xf4, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xfd, 0x30, 0x0, + 0x0, 0x0, 0x17, 0xbd, 0xca, 0x50, 0x0, 0x0, + + /* U+F013 "" */ + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x4, 0xfd, 0xdf, 0xff, 0xff, 0xfd, 0xef, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x0, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0x0, + 0x8, 0xff, 0xff, 0x20, 0x2, 0xff, 0xff, 0x80, + 0x4f, 0xff, 0xff, 0xf9, 0x9f, 0xff, 0xff, 0xf4, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x4, 0xfe, 0xdf, 0xff, 0xff, 0xfd, 0xdf, 0x40, + 0x0, 0x30, 0x6, 0xff, 0xff, 0x60, 0x3, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8b, 0xb8, 0x0, 0x0, 0x0, + + /* U+F015 "" */ + 0x0, 0x0, 0x0, 0x3, 0xdd, 0x30, 0x3f, 0xf3, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xf5, 0x4f, + 0xf4, 0x0, 0x0, 0x0, 0x9, 0xff, 0x99, 0xff, + 0xbf, 0xf4, 0x0, 0x0, 0x1, 0xbf, 0xf6, 0x22, + 0x6f, 0xff, 0xf4, 0x0, 0x0, 0x2d, 0xfe, 0x35, + 0xff, 0x53, 0xef, 0xf4, 0x0, 0x4, 0xff, 0xc1, + 0x8f, 0xff, 0xf8, 0x2d, 0xfe, 0x40, 0x7f, 0xfa, + 0x1a, 0xff, 0xff, 0xff, 0xa1, 0xaf, 0xf7, 0xcf, + 0x82, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x28, 0xfc, + 0x14, 0xe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, + 0x41, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf9, 0x0, 0x8f, + 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, 0x0, + 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xff, 0xf8, + 0x0, 0x8f, 0xff, 0xf0, 0x0, 0x0, 0xe, 0xff, + 0xf6, 0x0, 0x6f, 0xff, 0xe0, 0x0, + + /* U+F019 "" */ + 0x0, 0x0, 0x0, 0xdf, 0xfd, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xfc, 0x1b, 0xb1, 0xcf, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xc2, 0x2c, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F01C "" */ + 0x0, 0x4, 0xef, 0xff, 0xff, 0xff, 0xfe, 0x40, + 0x0, 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xe1, 0x0, 0x0, 0xaf, 0xb0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x0, 0x5, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x1, 0xff, 0x50, 0x1e, 0xf6, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xe1, 0xaf, 0xb0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0xff, 0xff, + 0xff, 0x80, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F021 "" */ + 0x0, 0x0, 0x6, 0xbd, 0xda, 0x50, 0x2, 0xff, + 0x0, 0x5, 0xef, 0xff, 0xff, 0xfe, 0x42, 0xff, + 0x0, 0x7f, 0xff, 0xa7, 0x7b, 0xff, 0xf9, 0xff, + 0x5, 0xff, 0xc1, 0x0, 0x0, 0x2c, 0xff, 0xff, + 0xe, 0xfc, 0x0, 0x0, 0x2, 0x22, 0xdf, 0xff, + 0x5f, 0xf2, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x8f, 0xb0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xb, 0xf8, + 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0x2f, 0xf4, + 0xff, 0xfd, 0x22, 0x20, 0x0, 0x0, 0xcf, 0xe0, + 0xff, 0xff, 0xc2, 0x0, 0x0, 0x2c, 0xff, 0x40, + 0xff, 0x9f, 0xff, 0xb7, 0x6a, 0xff, 0xf7, 0x0, + 0xff, 0x24, 0xdf, 0xff, 0xff, 0xfe, 0x50, 0x0, + 0xff, 0x20, 0x5, 0xac, 0xdb, 0x60, 0x0, 0x0, + + /* U+F026 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8d, + 0x0, 0x0, 0x8, 0xff, 0x0, 0x0, 0x8f, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, + 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, + + /* U+F027 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8d, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0x0, 0x0, + 0xcf, 0xff, 0xff, 0xff, 0x1, 0x50, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xbe, 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, + 0xff, 0xff, 0xff, 0xff, 0x5, 0xf8, 0xdf, 0xff, + 0xff, 0xff, 0x2, 0x60, 0x0, 0x0, 0x9f, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, + 0x3, 0xee, 0x10, 0x0, 0x0, 0x8, 0xff, 0x0, + 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x8f, 0xff, + 0x0, 0x5, 0xfc, 0x7, 0xf4, 0xdf, 0xff, 0xff, + 0xff, 0x2, 0x50, 0x5f, 0x60, 0xf9, 0xff, 0xff, + 0xff, 0xff, 0x6, 0xf7, 0xd, 0xc0, 0xbd, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xae, 0x9, 0xf0, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x6, 0xf7, 0xd, + 0xc0, 0xad, 0xdf, 0xff, 0xff, 0xff, 0x2, 0x50, + 0x5f, 0x60, 0xe9, 0x0, 0x0, 0x8f, 0xff, 0x0, + 0x5, 0xfc, 0x6, 0xf4, 0x0, 0x0, 0x8, 0xff, + 0x0, 0xa, 0xb1, 0x2f, 0xb0, 0x0, 0x0, 0x0, + 0x8d, 0x0, 0x0, 0x2, 0xee, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x10, 0x0, + + /* U+F03E "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfc, 0x0, 0xc, 0xff, 0xff, 0xee, 0xff, 0xff, + 0xff, 0x20, 0x2f, 0xff, 0xfe, 0x22, 0xef, 0xff, + 0xff, 0xfc, 0xff, 0xff, 0xe2, 0x0, 0x2e, 0xff, + 0xff, 0xfe, 0x4e, 0xfe, 0x20, 0x0, 0x2, 0xff, + 0xff, 0xe2, 0x2, 0xc2, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F048 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x1, 0xcc, 0xff, 0x40, 0x0, 0x2d, 0xff, 0xff, + 0x40, 0x3, 0xef, 0xff, 0xff, 0x40, 0x3f, 0xff, + 0xff, 0xff, 0x44, 0xff, 0xff, 0xff, 0xff, 0x9f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0xff, + 0xff, 0xff, 0xff, 0x45, 0xff, 0xff, 0xff, 0xff, + 0x40, 0x4f, 0xff, 0xff, 0xff, 0x40, 0x3, 0xef, + 0xff, 0xff, 0x40, 0x0, 0x2e, 0xff, 0xff, 0x30, + 0x0, 0x1, 0xcc, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04B "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfd, + 0x40, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, + 0x10, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd5, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xb2, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xb2, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xd5, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfa, 0x10, + 0x0, 0x0, 0xff, 0xff, 0xfd, 0x40, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x8e, 0xa1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xff, 0xf8, 0x0, 0x8f, 0xff, 0xf8, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0xff, + 0xff, 0xff, 0x7f, 0xff, 0xf7, 0x0, 0x7f, 0xff, + 0xf7, + + /* U+F04D "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F051 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xcc, 0x10, 0x0, + 0x3, 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xff, + 0xfe, 0x30, 0x4, 0xff, 0xff, 0xff, 0xf4, 0x4, + 0xff, 0xff, 0xff, 0xff, 0x54, 0xff, 0xff, 0xff, + 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xff, 0x44, 0xff, 0xff, + 0xff, 0xf3, 0x4, 0xff, 0xff, 0xfe, 0x30, 0x4, + 0xff, 0xff, 0xd2, 0x0, 0x4, 0xff, 0xcc, 0x10, + 0x0, 0x3, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F052 "" */ + 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xef, 0xfe, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xff, 0xfc, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x0, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, + + /* U+F053 "" */ + 0x0, 0x0, 0x0, 0x1a, 0x40, 0x0, 0x0, 0x1, + 0xdf, 0xf0, 0x0, 0x0, 0x1d, 0xff, 0xa0, 0x0, + 0x1, 0xdf, 0xfa, 0x0, 0x0, 0x1d, 0xff, 0xa0, + 0x0, 0x1, 0xdf, 0xfa, 0x0, 0x0, 0xc, 0xff, + 0xa0, 0x0, 0x0, 0xd, 0xff, 0x80, 0x0, 0x0, + 0x1, 0xdf, 0xf8, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0x80, 0x0, 0x0, 0x1, 0xdf, 0xf8, 0x0, 0x0, + 0x0, 0x1d, 0xff, 0x80, 0x0, 0x0, 0x1, 0xdf, + 0xf0, 0x0, 0x0, 0x0, 0x1b, 0x50, + + /* U+F054 "" */ + 0x4, 0xa1, 0x0, 0x0, 0x0, 0xf, 0xfd, 0x10, + 0x0, 0x0, 0xa, 0xff, 0xd1, 0x0, 0x0, 0x0, + 0xaf, 0xfd, 0x10, 0x0, 0x0, 0xa, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0xaf, 0xfd, 0x10, 0x0, 0x0, + 0xa, 0xff, 0xc0, 0x0, 0x0, 0x8, 0xff, 0xd0, + 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, 0xff, + 0xd1, 0x0, 0x0, 0x8f, 0xfd, 0x10, 0x0, 0x8, + 0xff, 0xd1, 0x0, 0x0, 0xf, 0xfd, 0x10, 0x0, + 0x0, 0x5, 0xb1, 0x0, 0x0, 0x0, + + /* U+F067 "" */ + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x48, 0x88, 0x8c, 0xff, 0xc8, + 0x88, 0x84, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x48, 0x88, 0x8c, 0xff, 0xc8, 0x88, 0x84, 0x0, + 0x0, 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x8, 0xff, + 0x80, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x40, + 0x0, 0x0, + + /* U+F068 "" */ + 0x14, 0x44, 0x44, 0x44, 0x44, 0x44, 0x41, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x7b, 0xbb, 0xbb, + 0xbb, 0xbb, 0xbb, 0xb7, + + /* U+F06E "" */ + 0x0, 0x0, 0x5, 0xad, 0xff, 0xda, 0x50, 0x0, + 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, 0xfd, + 0x40, 0x0, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, + 0xef, 0xf7, 0x0, 0x7, 0xff, 0xf4, 0x0, 0x9e, + 0x80, 0x4f, 0xff, 0x70, 0x4f, 0xff, 0xc0, 0x0, + 0xaf, 0xf8, 0xc, 0xff, 0xf4, 0xdf, 0xff, 0x80, + 0x9a, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0xdf, 0xff, + 0x80, 0xef, 0xff, 0xfe, 0x8, 0xff, 0xfd, 0x4f, + 0xff, 0xc0, 0x8f, 0xff, 0xf8, 0xc, 0xff, 0xf4, + 0x7, 0xff, 0xf4, 0x8, 0xee, 0x80, 0x4f, 0xff, + 0x70, 0x0, 0x7f, 0xfe, 0x40, 0x0, 0x4, 0xef, + 0xf8, 0x0, 0x0, 0x4, 0xdf, 0xfc, 0x88, 0xcf, + 0xfd, 0x40, 0x0, 0x0, 0x0, 0x5, 0xad, 0xff, + 0xda, 0x50, 0x0, 0x0, + + /* U+F070 "" */ + 0x8c, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xdf, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1b, 0xff, 0x80, 0x49, + 0xdf, 0xfd, 0xa5, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xff, 0xff, 0xd8, 0x8c, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x4, 0xef, 0xf8, 0x0, 0x0, 0x4e, 0xff, + 0x70, 0x0, 0x0, 0x0, 0x1c, 0xff, 0x69, 0xe8, + 0x4, 0xff, 0xf7, 0x0, 0x4, 0xe3, 0x0, 0x9f, + 0xfe, 0xff, 0x80, 0xcf, 0xff, 0x40, 0xd, 0xff, + 0x70, 0x5, 0xff, 0xff, 0xe0, 0x8f, 0xff, 0xd0, + 0xd, 0xff, 0xf7, 0x0, 0x2d, 0xff, 0xe0, 0x8f, + 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x0, 0x0, 0xaf, + 0xf8, 0xcf, 0xff, 0x30, 0x0, 0x7f, 0xff, 0x40, + 0x0, 0x6, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x8, + 0xff, 0xf4, 0x0, 0x0, 0x3e, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x4d, 0xff, 0xc8, 0x82, 0x1, 0xbf, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x5a, 0xdf, 0xfc, + 0x10, 0x8, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4e, 0xfd, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xc8, + + /* U+F071 "" */ + 0x0, 0x0, 0x0, 0x0, 0x2d, 0xd2, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, + 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xd, 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xd8, 0x8d, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xa0, 0xa, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xb0, 0xb, 0xff, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0xcf, 0xff, 0xc0, 0xc, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x5, 0xff, 0xff, 0xd0, 0xd, + 0xff, 0xff, 0x50, 0x0, 0x0, 0xe, 0xff, 0xff, + 0xf9, 0x9f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x8f, + 0xff, 0xff, 0xe2, 0x2e, 0xff, 0xff, 0xf8, 0x0, + 0x2, 0xff, 0xff, 0xff, 0x90, 0x9, 0xff, 0xff, + 0xff, 0x10, 0xa, 0xff, 0xff, 0xff, 0xe3, 0x3e, + 0xff, 0xff, 0xff, 0xa0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F074 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0x78, 0x8e, 0xff, 0x15, 0xff, 0xe8, 0xff, 0xe2, + 0x0, 0x2, 0xe5, 0x4f, 0xfe, 0x20, 0xfe, 0x20, + 0x0, 0x0, 0x13, 0xff, 0xf3, 0x0, 0x52, 0x0, + 0x0, 0x0, 0x3f, 0xff, 0x31, 0x0, 0x52, 0x0, + 0x0, 0x2, 0xef, 0xf4, 0x5e, 0x20, 0xfe, 0x20, + 0x78, 0x8e, 0xff, 0x51, 0xff, 0xe8, 0xff, 0xe2, + 0xff, 0xff, 0xf6, 0x0, 0x6f, 0xff, 0xff, 0xfd, + 0xff, 0xff, 0x70, 0x0, 0x7, 0xff, 0xff, 0xf8, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x80, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F077 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x1d, 0xff, 0xd1, 0x0, 0x0, 0x0, 0x1, 0xdf, + 0xff, 0xfd, 0x10, 0x0, 0x0, 0x1d, 0xff, 0x99, + 0xff, 0xd1, 0x0, 0x1, 0xdf, 0xf9, 0x0, 0x9f, + 0xfd, 0x10, 0x1d, 0xff, 0x90, 0x0, 0x9, 0xff, + 0xd1, 0xbf, 0xf9, 0x0, 0x0, 0x0, 0x9f, 0xfb, + 0x5f, 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F078 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, + 0x90, 0x0, 0x0, 0x0, 0x9, 0xf5, 0xbf, 0xf9, + 0x0, 0x0, 0x0, 0x9f, 0xfb, 0x1d, 0xff, 0x90, + 0x0, 0x9, 0xff, 0xd1, 0x1, 0xdf, 0xf9, 0x0, + 0x9f, 0xfd, 0x10, 0x0, 0x1d, 0xff, 0x99, 0xff, + 0xd1, 0x0, 0x0, 0x1, 0xdf, 0xff, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x1d, 0xff, 0xd1, 0x0, 0x0, + 0x0, 0x0, 0x1, 0xdd, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+F079 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1d, 0xd1, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x1, 0xdf, 0xfd, 0x10, + 0xef, 0xff, 0xff, 0xff, 0xd0, 0x0, 0x1d, 0xff, + 0xff, 0xd1, 0xaf, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x6b, 0x1f, 0xf1, 0xb6, 0x0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0xf, + 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, 0x6b, 0x1f, + 0xf1, 0xb6, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x0, + 0xcf, 0xcf, 0xfc, 0xfc, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xfa, 0x1d, 0xff, 0xff, 0xd1, 0x0, 0xd, + 0xff, 0xff, 0xff, 0xfe, 0x1, 0xdf, 0xfd, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, + 0xd1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+F07B "" */ + 0x8f, 0xff, 0xff, 0xe2, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xfe, 0x20, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, + + /* U+F093 "" */ + 0x0, 0x0, 0x0, 0xb, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xff, 0xff, 0xfb, 0x0, 0x0, + 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0x4f, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xdf, 0xff, 0xf0, 0xdf, 0xfd, 0xf, 0xff, 0xfd, + 0xff, 0xff, 0xf9, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xe0, 0xff, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xea, + 0x62, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xff, 0xff, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xef, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xff, 0x30, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x4f, 0xff, 0x90, 0x0, 0x2, 0x8f, + 0xf3, 0x0, 0x6f, 0xff, 0xd0, 0x0, 0xa, 0xff, + 0xff, 0xe4, 0xbf, 0xff, 0xd1, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x6f, 0xff, 0xff, 0xfb, 0x30, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xdb, 0x72, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F0C4 "" */ + 0x8, 0xee, 0x80, 0x0, 0x0, 0x6, 0x61, 0x8, + 0xff, 0xff, 0x80, 0x0, 0x2d, 0xff, 0xd0, 0xef, + 0x33, 0xfe, 0x0, 0x2e, 0xff, 0xf3, 0xe, 0xf3, + 0x3f, 0xe0, 0x2e, 0xff, 0xf3, 0x0, 0x8f, 0xff, + 0xff, 0x6e, 0xff, 0xf3, 0x0, 0x0, 0x8e, 0xff, + 0xff, 0xff, 0xf3, 0x0, 0x0, 0x0, 0x2, 0xef, + 0xff, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x2e, 0xff, + 0xff, 0x30, 0x0, 0x0, 0x8, 0xef, 0xff, 0xff, + 0xff, 0x30, 0x0, 0x8, 0xff, 0xff, 0xf6, 0xef, + 0xff, 0x30, 0x0, 0xef, 0x33, 0xfe, 0x2, 0xef, + 0xff, 0x30, 0xe, 0xf3, 0x3f, 0xe0, 0x2, 0xef, + 0xff, 0x30, 0x8f, 0xff, 0xf8, 0x0, 0x2, 0xdf, + 0xfd, 0x0, 0x8e, 0xe8, 0x0, 0x0, 0x0, 0x66, + 0x10, + + /* U+F0C5 "" */ + 0x0, 0x0, 0xdf, 0xff, 0xff, 0xd, 0x20, 0x0, + 0x0, 0xff, 0xff, 0xff, 0xf, 0xe2, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xf, 0xfd, 0xdf, 0xf0, 0xff, + 0xff, 0xff, 0x20, 0x0, 0xff, 0xf0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xdf, 0xff, + 0xff, 0xff, 0xfd, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xfd, 0x0, 0x0, + + /* U+F0C7 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xc2, 0x0, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x20, 0xff, 0x0, + 0x0, 0x0, 0x1, 0xff, 0xe2, 0xff, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfc, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x11, 0xbf, 0xff, 0xff, 0xff, + 0xff, 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, + 0xf1, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x11, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf8, + + /* U+F0E7 "" */ + 0x0, 0xdf, 0xff, 0xfd, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf7, + 0x0, 0x0, 0x6, 0xff, 0xff, 0xf2, 0x0, 0x0, + 0x8, 0xff, 0xff, 0xd0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xff, 0xff, 0xd0, 0xc, 0xff, 0xff, 0xff, + 0xff, 0xa0, 0xe, 0xff, 0xff, 0xff, 0xff, 0x20, + 0xd, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xe, 0xff, + 0x50, 0x0, 0x0, 0x0, 0x2f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x9f, 0xa0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0x10, + 0x0, 0x0, 0x0, 0x0, 0xd7, 0x0, 0x0, 0x0, + + /* U+F0EA "" */ + 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0x99, 0xff, 0xfd, 0x0, 0x0, 0xff, 0xff, + 0x99, 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xff, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xd, 0xff, 0xff, + 0xd, 0x20, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, + 0xe2, 0xff, 0xff, 0xf, 0xff, 0xff, 0xf, 0xfd, + 0xff, 0xff, 0xf, 0xff, 0xff, 0x20, 0x0, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xf, 0xff, + 0xff, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, + 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xfd, + + /* U+F0F3 "" */ + 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0x30, 0x0, 0x0, 0x0, 0x1, + 0xbf, 0xff, 0xfc, 0x20, 0x0, 0x0, 0x1e, 0xff, + 0xff, 0xff, 0xe1, 0x0, 0x0, 0x9f, 0xff, 0xff, + 0xff, 0xf8, 0x0, 0x0, 0xef, 0xff, 0xff, 0xff, + 0xfd, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x1e, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xe1, 0xcf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xcf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xff, 0xe0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xee, 0x40, 0x0, 0x0, + + /* U+F11C "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, 0xf0, + 0xf, 0x0, 0xff, 0xff, 0x0, 0xf0, 0xf, 0x0, + 0xf0, 0xf, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x8, + 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, 0xf8, + 0x8, 0x80, 0x88, 0x8, 0x80, 0x8f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, 0x0, + 0xff, 0xff, 0x0, 0xf0, 0x0, 0x0, 0x0, 0xf, + 0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf8, + + /* U+F124 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xdf, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x17, + 0xef, 0xff, 0xff, 0xff, 0x30, 0x0, 0x0, 0x18, + 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x2a, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf4, 0x0, 0x8, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, + 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0xff, 0xf1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+F15B "" */ + 0xdf, 0xff, 0xff, 0xf0, 0xd2, 0x0, 0xff, 0xff, + 0xff, 0xf0, 0xfe, 0x20, 0xff, 0xff, 0xff, 0xf0, + 0xff, 0xe2, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xfd, + 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xfd, + + /* U+F1EB "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x9c, 0xef, 0xfe, + 0xc9, 0x40, 0x0, 0x0, 0x0, 0x7, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x70, 0x0, 0x4, 0xdf, + 0xff, 0xfc, 0xa8, 0x8a, 0xcf, 0xff, 0xfd, 0x40, + 0x6f, 0xff, 0xd5, 0x0, 0x0, 0x0, 0x0, 0x5d, + 0xff, 0xf6, 0xcf, 0xf6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xfc, 0x1a, 0x30, 0x0, 0x5a, + 0xdf, 0xfd, 0xa5, 0x0, 0x3, 0xa1, 0x0, 0x0, + 0x4d, 0xff, 0xff, 0xff, 0xff, 0xd4, 0x0, 0x0, + 0x0, 0x5, 0xff, 0xfe, 0xa8, 0x8a, 0xef, 0xff, + 0x50, 0x0, 0x0, 0x1, 0xdf, 0x70, 0x0, 0x0, + 0x7, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x12, 0x0, + 0x0, 0x0, 0x0, 0x21, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4e, 0xe4, 0x0, 0x0, 0x0, 0x0, + + /* U+F240 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F241 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F242 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xff, + 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F243 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0xf, + 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0xf, 0xff, 0xf0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F244 "" */ + 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, + 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xff, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x80, + + /* U+F287 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xcf, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xb9, 0x29, 0xfe, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x10, 0x2, + 0x0, 0x0, 0x0, 0x0, 0x3, 0xdf, 0x80, 0xa, + 0x90, 0x0, 0x0, 0x0, 0x3, 0x70, 0x0, 0xdf, + 0xff, 0x77, 0xf7, 0x55, 0x55, 0x55, 0x55, 0x8f, + 0xd3, 0xf, 0xff, 0xfd, 0xcc, 0xdf, 0xdc, 0xcc, + 0xcc, 0xcd, 0xff, 0xb0, 0x8f, 0xfe, 0x10, 0x0, + 0xaa, 0x0, 0x0, 0x0, 0x4d, 0x40, 0x0, 0x46, + 0x10, 0x0, 0x1, 0xf2, 0x2, 0x33, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xb1, 0xcf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xa, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x22, + 0x0, 0x0, 0x0, + + /* U+F293 "" */ + 0x0, 0x18, 0xdf, 0xfd, 0x92, 0x0, 0x2, 0xef, + 0xfb, 0xef, 0xff, 0x30, 0xd, 0xff, 0xfa, 0x2e, + 0xff, 0xe0, 0x4f, 0xff, 0xfa, 0x3, 0xff, 0xf5, + 0x9f, 0xfa, 0xfa, 0x35, 0x4f, 0xfa, 0xcf, 0xc0, + 0x8a, 0x3d, 0xb, 0xfd, 0xef, 0xfb, 0x3, 0x12, + 0x8f, 0xfe, 0xff, 0xff, 0xb0, 0x6, 0xff, 0xff, + 0xff, 0xff, 0xd1, 0x8, 0xff, 0xff, 0xef, 0xfd, + 0x11, 0x10, 0x9f, 0xff, 0xdf, 0xd1, 0x59, 0x3b, + 0xb, 0xfd, 0xaf, 0xd7, 0xfa, 0x38, 0x1d, 0xfb, + 0x5f, 0xff, 0xfa, 0x1, 0xdf, 0xf7, 0xd, 0xff, + 0xfa, 0x1d, 0xff, 0xf1, 0x3, 0xef, 0xfc, 0xdf, + 0xff, 0x50, 0x0, 0x18, 0xdf, 0xfe, 0xa3, 0x0, + + /* U+F2ED "" */ + 0x0, 0x0, 0x7f, 0xff, 0xf7, 0x0, 0x0, 0xef, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xef, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, 0x9f, + 0xf0, 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, + 0xf, 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, + 0xf8, 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, + 0x8f, 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, + 0x88, 0xf8, 0x8f, 0xf0, 0xf, 0xf8, 0x8f, 0x88, + 0xf8, 0x8f, 0xf0, 0xf, 0xf9, 0x9f, 0x99, 0xf9, + 0x9f, 0xf0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf0, 0x8, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, + + /* U+F304 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xff, + 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x8a, 0x1d, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xfa, + 0x1d, 0xff, 0x70, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xfa, 0x1d, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x8f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0xb, 0xff, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xff, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xde, 0xdb, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+F55A "" */ + 0x0, 0x0, 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xe4, 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfe, 0x0, 0x1d, 0xff, 0xff, + 0xfa, 0xef, 0xfe, 0xaf, 0xff, 0xff, 0x1, 0xdf, + 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, 0xff, 0xff, + 0x1d, 0xff, 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, + 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xfe, 0x20, + 0x2, 0xef, 0xff, 0xff, 0xcf, 0xff, 0xff, 0xff, + 0xfe, 0x20, 0x2, 0xef, 0xff, 0xff, 0x1d, 0xff, + 0xff, 0xff, 0xe2, 0x2, 0x20, 0x2e, 0xff, 0xff, + 0x1, 0xdf, 0xff, 0xff, 0xa0, 0x2e, 0xe2, 0xa, + 0xff, 0xff, 0x0, 0x1d, 0xff, 0xff, 0xfa, 0xef, + 0xfe, 0xaf, 0xff, 0xff, 0x0, 0x1, 0xdf, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0, 0x0, + 0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F7C2 "" */ + 0x0, 0x8, 0xff, 0xff, 0xff, 0xe4, 0x0, 0x8f, + 0xff, 0xff, 0xff, 0xfe, 0x8, 0xf8, 0xf, 0xb, + 0x40, 0xff, 0x8f, 0xf8, 0xf, 0xb, 0x40, 0xff, + 0xff, 0xf8, 0xf, 0xb, 0x40, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, + 0xff, 0xfe, 0x4e, 0xff, 0xff, 0xff, 0xff, 0xe4, + + /* U+F8A2 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xe0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, + 0xef, 0x10, 0x0, 0xbf, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf1, 0x0, 0xcf, 0xf1, 0x0, 0x0, 0x0, + 0x7, 0xff, 0x11, 0xcf, 0xff, 0x77, 0x77, 0x77, + 0x77, 0xbf, 0xf1, 0xcf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x17, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 69, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 69, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 18, .adv_w = 100, .box_w = 5, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 31, .adv_w = 180, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 97, .adv_w = 159, .box_w = 10, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 177, .adv_w = 216, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 255, .adv_w = 176, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 327, .adv_w = 54, .box_w = 2, .box_h = 5, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 332, .adv_w = 86, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 362, .adv_w = 87, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 392, .adv_w = 102, .box_w = 7, .box_h = 7, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 417, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 449, .adv_w = 98, .box_w = 6, .box_h = 3, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 458, .adv_w = 58, .box_w = 3, .box_h = 3, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 463, .adv_w = 90, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 527, .adv_w = 171, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 587, .adv_w = 95, .box_w = 5, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 617, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 671, .adv_w = 146, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 725, .adv_w = 171, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 791, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 845, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 905, .adv_w = 153, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 959, .adv_w = 165, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1019, .adv_w = 158, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1079, .adv_w = 58, .box_w = 3, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1093, .adv_w = 58, .box_w = 3, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1111, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1143, .adv_w = 149, .box_w = 8, .box_h = 6, .ofs_x = 1, .ofs_y = 3}, + {.bitmap_index = 1167, .adv_w = 149, .box_w = 8, .box_h = 8, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 1199, .adv_w = 147, .box_w = 9, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1253, .adv_w = 265, .box_w = 16, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1373, .adv_w = 187, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1451, .adv_w = 194, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1517, .adv_w = 185, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1583, .adv_w = 211, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1655, .adv_w = 172, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1709, .adv_w = 163, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1763, .adv_w = 198, .box_w = 12, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1835, .adv_w = 208, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1901, .adv_w = 79, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1919, .adv_w = 131, .box_w = 8, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 1967, .adv_w = 184, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2033, .adv_w = 152, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2087, .adv_w = 244, .box_w = 13, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2165, .adv_w = 208, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2231, .adv_w = 215, .box_w = 13, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2309, .adv_w = 185, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2369, .adv_w = 215, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2474, .adv_w = 186, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2534, .adv_w = 159, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2594, .adv_w = 150, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2654, .adv_w = 202, .box_w = 11, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2720, .adv_w = 182, .box_w = 13, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 2798, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2906, .adv_w = 172, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2972, .adv_w = 166, .box_w = 12, .box_h = 12, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 3044, .adv_w = 168, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3110, .adv_w = 85, .box_w = 5, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3148, .adv_w = 90, .box_w = 8, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 3212, .adv_w = 85, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3242, .adv_w = 149, .box_w = 8, .box_h = 7, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 3270, .adv_w = 128, .box_w = 8, .box_h = 2, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3278, .adv_w = 154, .box_w = 5, .box_h = 2, .ofs_x = 1, .ofs_y = 10}, + {.bitmap_index = 3283, .adv_w = 153, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3324, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3384, .adv_w = 146, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3425, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3485, .adv_w = 157, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3530, .adv_w = 90, .box_w = 7, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3572, .adv_w = 177, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3632, .adv_w = 174, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3686, .adv_w = 71, .box_w = 3, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3704, .adv_w = 73, .box_w = 6, .box_h = 15, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 3749, .adv_w = 158, .box_w = 9, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3803, .adv_w = 71, .box_w = 2, .box_h = 12, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3815, .adv_w = 271, .box_w = 15, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3883, .adv_w = 174, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 3924, .adv_w = 163, .box_w = 10, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 3969, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4029, .adv_w = 175, .box_w = 10, .box_h = 12, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4089, .adv_w = 105, .box_w = 6, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4116, .adv_w = 128, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4152, .adv_w = 106, .box_w = 7, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4191, .adv_w = 173, .box_w = 9, .box_h = 9, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 4232, .adv_w = 143, .box_w = 10, .box_h = 9, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 4277, .adv_w = 230, .box_w = 15, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4345, .adv_w = 141, .box_w = 9, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4386, .adv_w = 143, .box_w = 10, .box_h = 12, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 4446, .adv_w = 133, .box_w = 8, .box_h = 9, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4482, .adv_w = 90, .box_w = 6, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4527, .adv_w = 77, .box_w = 3, .box_h = 15, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 4550, .adv_w = 90, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 4588, .adv_w = 149, .box_w = 9, .box_h = 5, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 4611, .adv_w = 256, .box_w = 16, .box_h = 17, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4747, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 4843, .adv_w = 256, .box_w = 16, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4955, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5051, .adv_w = 176, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5117, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5245, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5373, .adv_w = 288, .box_w = 18, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5499, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5627, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 5735, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5863, .adv_w = 128, .box_w = 8, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5919, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6003, .adv_w = 288, .box_w = 18, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 6147, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 6243, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6323, .adv_w = 224, .box_w = 14, .box_h = 18, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 6449, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6554, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6652, .adv_w = 224, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 6732, .adv_w = 224, .box_w = 16, .box_h = 14, .ofs_x = -1, .ofs_y = -1}, + {.bitmap_index = 6844, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6914, .adv_w = 160, .box_w = 10, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 6984, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7082, .adv_w = 224, .box_w = 14, .box_h = 4, .ofs_x = 0, .ofs_y = 4}, + {.bitmap_index = 7110, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 7218, .adv_w = 320, .box_w = 20, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7378, .adv_w = 288, .box_w = 20, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 7538, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 7666, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7736, .adv_w = 224, .box_w = 14, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 7806, .adv_w = 320, .box_w = 20, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 7946, .adv_w = 256, .box_w = 16, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 8042, .adv_w = 256, .box_w = 16, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8170, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8315, .adv_w = 224, .box_w = 15, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8420, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8532, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 8630, .adv_w = 160, .box_w = 12, .box_h = 16, .ofs_x = -1, .ofs_y = -2}, + {.bitmap_index = 8726, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8838, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 8950, .adv_w = 288, .box_w = 18, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9058, .adv_w = 256, .box_w = 18, .box_h = 18, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 9220, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 9316, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 9466, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9566, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9666, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9766, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9866, .adv_w = 320, .box_w = 20, .box_h = 10, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 9966, .adv_w = 320, .box_w = 21, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 10113, .adv_w = 224, .box_w = 12, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 10209, .adv_w = 224, .box_w = 14, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10321, .adv_w = 256, .box_w = 17, .box_h = 17, .ofs_x = -1, .ofs_y = -3}, + {.bitmap_index = 10466, .adv_w = 320, .box_w = 20, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 10586, .adv_w = 192, .box_w = 12, .box_h = 16, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 10682, .adv_w = 258, .box_w = 17, .box_h = 11, .ofs_x = 0, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_2[] = { + 0x0, 0x7, 0xa, 0xb, 0xc, 0x10, 0x12, 0x14, + 0x18, 0x1b, 0x20, 0x25, 0x26, 0x27, 0x3d, 0x47, + 0x4a, 0x4b, 0x4c, 0x50, 0x51, 0x52, 0x53, 0x66, + 0x67, 0x6d, 0x6f, 0x70, 0x73, 0x76, 0x77, 0x78, + 0x7a, 0x92, 0x94, 0xc3, 0xc4, 0xc6, 0xe6, 0xe9, + 0xf2, 0x11b, 0x123, 0x15a, 0x1ea, 0x23f, 0x240, 0x241, + 0x242, 0x243, 0x286, 0x292, 0x2ec, 0x303, 0x559, 0x7c1, + 0x8a1 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 32, .range_length = 12, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 45, .range_length = 82, .glyph_id_start = 13, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 61441, .range_length = 2210, .glyph_id_start = 95, + .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 57, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + +/*----------------- + * KERNING + *----------------*/ + + +/*Map glyph_ids to kern left classes*/ +static const uint8_t kern_left_class_mapping[] = +{ + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 9, 10, 11, + 12, 0, 13, 14, 15, 16, 17, 18, + 19, 12, 20, 20, 0, 0, 0, 21, + 22, 23, 24, 25, 22, 26, 27, 28, + 29, 29, 30, 31, 32, 29, 29, 22, + 33, 34, 35, 3, 36, 30, 37, 37, + 38, 39, 40, 41, 42, 43, 0, 44, + 0, 45, 46, 47, 48, 49, 50, 51, + 45, 52, 52, 53, 48, 45, 45, 46, + 46, 54, 55, 56, 57, 51, 58, 58, + 59, 58, 60, 41, 0, 0, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/*Map glyph_ids to kern right classes*/ +static const uint8_t kern_right_class_mapping[] = +{ + 0, 0, 1, 2, 0, 3, 4, 5, + 2, 6, 7, 8, 9, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 12, 18, + 19, 20, 21, 21, 0, 0, 0, 22, + 23, 24, 25, 23, 25, 25, 25, 23, + 25, 25, 26, 25, 25, 25, 25, 23, + 25, 23, 25, 3, 27, 28, 29, 29, + 30, 31, 32, 33, 34, 35, 0, 36, + 0, 37, 38, 39, 39, 39, 0, 39, + 38, 40, 41, 38, 38, 42, 42, 39, + 42, 39, 42, 43, 44, 45, 46, 46, + 47, 46, 48, 0, 0, 35, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +/*Kern values between classes*/ +static const int8_t kern_class_values[] = +{ + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 3, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 12, 0, 7, -6, 0, 0, 0, + 0, -14, -15, 2, 12, 6, 4, -10, + 2, 13, 1, 11, 3, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 2, -2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -8, 0, 0, 0, 0, 0, -5, + 4, 5, 0, 0, -3, 0, -2, 3, + 0, -3, 0, -3, -1, -5, 0, 0, + 0, 0, -3, 0, 0, -3, -4, 0, + 0, -3, 0, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -3, 0, + 0, -7, 0, -31, 0, 0, -5, 0, + 5, 8, 0, 0, -5, 3, 3, 8, + 5, -4, 5, 0, 0, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -9, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -3, -13, 0, -10, -2, 0, 0, 0, + 0, 1, 10, 0, -8, -2, -1, 1, + 0, -4, 0, 0, -2, -19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -20, -2, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 0, 3, 0, 0, -5, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 10, 2, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -9, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 2, 5, 3, 8, -3, 0, 0, 5, + -3, -8, -35, 2, 7, 5, 1, -3, + 0, 9, 0, 8, 0, 8, 0, -24, + 0, -3, 8, 0, 8, -3, 5, 3, + 0, 0, 1, -3, 0, 0, -4, 20, + 0, 20, 0, 8, 0, 11, 3, 4, + 0, 0, 0, -9, 0, 0, 0, 0, + 1, -2, 0, 2, -5, -3, -5, 2, + 0, -3, 0, 0, 0, -10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, -14, 0, -16, 0, 0, 0, 0, + -2, 0, 25, -3, -3, 3, 3, -2, + 0, -3, 3, 0, 0, -14, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -25, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 0, 0, -9, 0, 8, 0, + -17, -25, -17, -5, 8, 0, 0, -17, + 0, 3, -6, 0, -4, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 7, 8, -31, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 2, + 2, -3, -5, 0, -1, -1, -3, 0, + 0, -2, 0, 0, 0, -5, 0, -2, + 0, -6, -5, 0, -6, -8, -8, -5, + 0, -5, 0, -5, 0, 0, 0, 0, + -2, 0, 0, 3, 0, 2, -3, 0, + 0, 0, 0, 3, -2, 0, 0, 0, + -2, 3, 3, -1, 0, 0, 0, -5, + 0, -1, 0, 0, 0, 0, 0, 1, + 0, 3, -2, 0, -3, 0, -4, 0, + 0, -2, 0, 8, 0, 0, -3, 0, + 0, 0, 0, 0, -1, 1, -2, -2, + 0, -3, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -1, -1, 0, + -3, -3, 0, 0, 0, 0, 0, 1, + 0, 0, -2, 0, -3, -3, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, -2, -3, 0, + 0, -8, -2, -8, 5, 0, 0, -5, + 3, 5, 7, 0, -6, -1, -3, 0, + -1, -12, 3, -2, 2, -14, 3, 0, + 0, 1, -13, 0, -14, -2, -22, -2, + 0, -13, 0, 5, 7, 0, 3, 0, + 0, 0, 0, 1, 0, -5, -3, 0, + 0, 0, 0, -3, 0, 0, 0, -3, + 0, 0, 0, 0, 0, -1, -1, 0, + -1, -3, 0, 0, 0, 0, 0, 0, + 0, -3, -3, 0, -2, -3, -2, 0, + 0, -3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -2, -2, 0, + 0, -2, 0, -5, 3, 0, 0, -3, + 1, 3, 3, 0, 0, 0, 0, 0, + 0, -2, 0, 0, 0, 0, 0, 2, + 0, 0, -3, 0, -3, -2, -3, 0, + 0, 0, 0, 0, 0, 0, 2, 0, + -2, 0, 0, 0, 0, -3, -4, 0, + 0, 8, -2, 1, -8, 0, 0, 7, + -13, -13, -11, -5, 3, 0, -2, -17, + -5, 0, -5, 0, -5, 4, -5, -16, + 0, -7, 0, 0, 1, -1, 2, -2, + 0, 3, 0, -8, -10, 0, -13, -6, + -5, -6, -8, -3, -7, -1, -5, -7, + 0, 1, 0, -3, 0, 0, 0, 2, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, 0, -1, + 0, -1, -3, 0, -4, -6, -6, -1, + 0, -8, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, 0, 1, -2, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 12, 0, 0, 0, 0, 0, + 0, 2, 0, 0, 0, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -2, 0, 0, 0, -5, 0, 0, 0, + 0, -13, -8, 0, 0, 0, -4, -13, + 0, 0, -3, 3, 0, -7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -4, 0, 0, -5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -5, 0, 0, 0, 0, 3, 0, + 2, -5, -5, 0, -3, -3, -3, 0, + 0, 0, 0, 0, 0, -8, 0, -3, + 0, -4, -3, 0, -6, -6, -8, -2, + 0, -5, 0, -8, 0, 0, 0, 0, + 20, 0, 0, 1, 0, 0, -3, 0, + 0, -11, 0, 0, 0, 0, 0, -24, + -5, 8, 8, -2, -11, 0, 3, -4, + 0, -13, -1, -3, 3, -18, -3, 3, + 0, 4, -9, -4, -9, -8, -11, 0, + 0, -15, 0, 15, 0, 0, -1, 0, + 0, 0, -1, -1, -3, -7, -8, -1, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -3, 0, -1, -3, -4, 0, + 0, -5, 0, -3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -1, 0, -5, 0, 0, 5, + -1, 3, 0, -6, 3, -2, -1, -7, + -3, 0, -3, -3, -2, 0, -4, -4, + 0, 0, -2, -1, -2, -4, -3, 0, + 0, -3, 0, 3, -2, 0, -6, 0, + 0, 0, -5, 0, -4, 0, -4, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + -5, 3, 0, -4, 0, -2, -3, -8, + -2, -2, -2, -1, -2, -3, -1, 0, + 0, 0, 0, 0, -3, -2, -2, 0, + 0, 0, 0, 3, -2, 0, -2, 0, + 0, 0, -2, -3, -2, -2, -3, -2, + 2, 10, -1, 0, -7, 0, -2, 5, + 0, -3, -11, -3, 4, 0, 0, -12, + -4, 3, -4, 2, 0, -2, -2, -8, + 0, -4, 1, 0, 0, -4, 0, 0, + 0, 3, 3, -5, -5, 0, -4, -3, + -4, -3, -3, 0, -4, 1, -5, -4, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, -3, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -4, + 0, 0, -3, 0, 0, -3, -3, 0, + 0, 0, 0, -3, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, -2, 0, + 0, 0, -4, 0, -5, 0, 0, 0, + -8, 0, 2, -6, 5, 1, -2, -12, + 0, 0, -6, -3, 0, -10, -6, -7, + 0, 0, -11, -3, -10, -10, -12, 0, + -7, 0, 2, 17, -3, 0, -6, -3, + -1, -3, -4, -7, -5, -9, -10, -6, + 0, 0, -2, 0, 1, 0, 0, -18, + -2, 8, 6, -6, -9, 0, 1, -8, + 0, -13, -2, -3, 5, -24, -3, 1, + 0, 0, -17, -3, -13, -3, -19, 0, + 0, -18, 0, 15, 1, 0, -2, 0, + 0, 0, 0, -1, -2, -10, -2, 0, + 0, 0, 0, 0, -8, 0, -2, 0, + -1, -7, -12, 0, 0, -1, -4, -8, + -3, 0, -2, 0, 0, 0, 0, -12, + -3, -8, -8, -2, -4, -6, -3, -4, + 0, -5, -2, -8, -4, 0, -3, -5, + -3, -5, 0, 1, 0, -2, -8, 0, + 0, -5, 0, 0, 0, 0, 3, 0, + 2, -5, 10, 0, -3, -3, -3, 0, + 0, 0, 0, 0, 0, -8, 0, -3, + 0, -4, -3, 0, -6, -6, -8, -2, + 0, -5, 2, 10, 0, 0, 0, 0, + 20, 0, 0, 1, 0, 0, -3, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + -1, 0, 0, 0, 0, 0, -2, -5, + 0, 0, 0, 0, 0, -1, 0, 0, + 0, -3, -3, 0, 0, -5, -3, 0, + 0, -5, 0, 4, -1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, + 5, 2, -2, 0, -8, -4, 0, 8, + -8, -8, -5, -5, 10, 5, 3, -22, + -2, 5, -3, 0, -3, 3, -3, -9, + 0, -3, 3, -3, -2, -8, -2, 0, + 0, 8, 5, 0, -7, 0, -14, -3, + 7, -3, -10, 1, -3, -8, -8, -3, + 3, 0, -4, 0, -7, 0, 2, 8, + -6, -9, -10, -6, 8, 0, 1, -19, + -2, 3, -4, -2, -6, 0, -6, -9, + -4, -4, -2, 0, 0, -6, -5, -3, + 0, 8, 6, -3, -14, 0, -14, -4, + 0, -9, -15, -1, -8, -4, -8, -7, + 0, 0, -3, 0, -5, -2, 0, -3, + -5, 0, 4, -8, 3, 0, 0, -14, + 0, -3, -6, -4, -2, -8, -6, -8, + -6, 0, -8, -3, -6, -5, -8, -3, + 0, 0, 1, 12, -4, 0, -8, -3, + 0, -3, -5, -6, -7, -7, -10, -3, + 5, 0, -4, 0, -13, -3, 2, 5, + -8, -9, -5, -8, 8, -3, 1, -24, + -5, 5, -6, -4, -9, 0, -8, -11, + -3, -3, -2, -3, -5, -8, -1, 0, + 0, 8, 7, -2, -17, 0, -15, -6, + 6, -10, -17, -5, -9, -11, -13, -8, + 0, 0, 0, 0, -3, 0, 0, 3, + -3, 5, 2, -5, 5, 0, 0, -8, + -1, 0, -1, 0, 1, 1, -2, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, 0, 2, 8, 1, 0, -3, 0, + 0, 0, 0, -2, -2, -3, 0, 0, + 1, 2, 0, 0, 0, 0, 2, 0, + -2, 0, 10, 0, 5, 1, 1, -3, + 0, 5, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 8, 0, 7, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, -3, 4, 0, 8, 0, + 0, 25, 3, -5, -5, 3, 3, -2, + 1, -13, 0, 0, 12, -15, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 10, 36, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, 0, 0, -5, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -2, 0, -7, 0, 0, 1, 0, + 0, 3, 33, -5, -2, 8, 7, -7, + 3, 0, 0, 3, 3, -3, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -33, 7, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -7, 0, 0, 0, -7, + 0, 0, 0, 0, -6, -1, 0, 0, + 0, -6, 0, -3, 0, -12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, -3, 0, 0, + 0, -4, 0, -7, 0, 0, 0, -4, + 3, -3, 0, 0, -7, -3, -6, 0, + 0, -7, 0, -3, 0, -12, 0, -3, + 0, 0, -21, -5, -10, -3, -9, 0, + 0, -17, 0, -7, -1, 0, 0, 0, + 0, 0, 0, 0, 0, -4, -5, -2, + 0, 0, 0, 0, -6, 0, -6, 3, + -3, 5, 0, -2, -6, -2, -4, -5, + 0, -3, -1, -2, 2, -7, -1, 0, + 0, 0, -23, -2, -4, 0, -6, 0, + -2, -12, -2, 0, 0, -2, -2, 0, + 0, 0, 0, 2, 0, -2, -4, -2, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 3, 0, 0, 0, 0, + 0, -6, 0, -2, 0, 0, 0, -5, + 3, 0, 0, 0, -7, -3, -5, 0, + 0, -7, 0, -3, 0, -12, 0, 0, + 0, 0, -25, 0, -5, -9, -13, 0, + 0, -17, 0, -2, -4, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -4, -1, + 1, 0, 0, 4, -3, 0, 8, 13, + -3, -3, -8, 3, 13, 4, 6, -7, + 3, 11, 3, 7, 6, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 16, 12, -5, -3, 0, -2, 20, + 11, 20, 0, 0, 0, 3, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, -22, -3, -2, -10, -13, 0, + 0, -17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, -22, -3, -2, -10, -13, 0, + 0, -10, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + -6, 3, 0, -3, 2, 5, 3, -8, + 0, -1, -2, 3, 0, 2, 0, 0, + 0, 0, -6, 0, -2, -2, -5, 0, + -2, -10, 0, 16, -3, 0, -6, -2, + 0, -2, -4, 0, -3, -7, -5, -3, + 0, 0, -4, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, 0, 0, 0, + 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, -22, -3, -2, -10, -13, 0, + 0, -17, 0, 0, 0, 0, 0, 0, + 13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, -4, 0, -8, -3, -2, 8, + -2, -3, -10, 1, -2, 1, -2, -7, + 1, 6, 1, 2, 1, 2, -6, -10, + -3, 0, -10, -5, -7, -11, -10, 0, + -4, -5, -3, -3, -2, -2, -3, -2, + 0, -2, -1, 4, 0, 4, -2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -2, -3, -3, 0, + 0, -7, 0, -1, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -3, -3, 0, + 0, 0, 0, 0, -2, 0, 0, -4, + -3, 3, 0, -4, -5, -2, 0, -7, + -2, -6, -2, -3, 0, -4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -17, 0, 8, 0, 0, -5, 0, + 0, 0, 0, -3, 0, -3, 0, 0, + 0, 0, -2, 0, -6, 0, 0, 11, + -3, -8, -8, 2, 3, 3, -1, -7, + 2, 4, 2, 8, 2, 8, -2, -7, + 0, 0, -10, 0, 0, -8, -7, 0, + 0, -5, 0, -3, -4, 0, -4, 0, + -4, 0, -2, 4, 0, -2, -8, -3, + 0, 0, -2, 0, -5, 0, 0, 3, + -6, 0, 3, -3, 2, 0, 0, -8, + 0, -2, -1, 0, -3, 3, -2, 0, + 0, 0, -10, -3, -6, 0, -8, 0, + 0, -12, 0, 9, -3, 0, -5, 0, + 2, 0, -3, 0, -3, -8, 0, -3, + 0, 0, 0, 0, -2, 0, 0, 3, + -3, 1, 0, 0, -3, -2, 0, -3, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, -16, 0, 6, 0, 0, -2, 0, + 0, 0, 0, 1, 0, -3, -3, 0 +}; + + +/*Collect the kern class' data in one place*/ +static const lv_font_fmt_txt_kern_classes_t kern_classes = +{ + .class_pair_values = kern_class_values, + .left_class_mapping = kern_left_class_mapping, + .right_class_mapping = kern_right_class_mapping, + .left_class_cnt = 60, + .right_class_cnt = 48, +}; + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = &kern_classes, + .kern_scale = 16, + .cmap_num = 3, + .bpp = 4, + .kern_classes = 1, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t lv_font_montserratMedium_16 = { +#else +lv_font_t lv_font_montserratMedium_16 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 16, /*The maximum line height required by the font default: (f.src.ascent - f.src.descent)*/ + .base_line = 2.4, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if LV_FONT_MONTSERRATMEDIUM_16*/ + diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/images/images.mk b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/images/images.mk new file mode 100644 index 0000000..60a7a4d --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/images/images.mk @@ -0,0 +1,6 @@ +GEN_CSRCS += $(notdir $(wildcard $(PRJ_DIR)/generated/images/*.c)) + +DEPPATH += --dep-path $(PRJ_DIR)/generated/images +VPATH += :$(PRJ_DIR)/generated/images + +CFLAGS += "-I$(PRJ_DIR)/generated/images" \ No newline at end of file diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/setup_scr_screen.c b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/setup_scr_screen.c new file mode 100644 index 0000000..4f4ffd7 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/setup_scr_screen.c @@ -0,0 +1,90 @@ +/* +* Copyright 2024 NXP +* NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in +* accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, +* activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to +* comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license +* terms, then you may not retain, install, activate or otherwise use the software. +*/ + +#include "lvgl.h" +#include +#include "gui_guider.h" +#include "events_init.h" +#include "widgets_init.h" +#include "custom.h" + + +void setup_scr_screen(lv_ui *ui) +{ + //Write codes screen + ui->screen = lv_obj_create(NULL); + lv_obj_set_size(ui->screen, 412, 412); + + //Write style for screen, Part: LV_PART_MAIN, State: LV_STATE_DEFAULT. + lv_obj_set_style_bg_opa(ui->screen, 0, LV_PART_MAIN|LV_STATE_DEFAULT); + + //Write codes screen_btn_1 + ui->screen_btn_1 = lv_btn_create(ui->screen); + ui->screen_btn_1_label = lv_label_create(ui->screen_btn_1); + lv_label_set_text(ui->screen_btn_1_label, "Button"); + lv_label_set_long_mode(ui->screen_btn_1_label, LV_LABEL_LONG_WRAP); + lv_obj_align(ui->screen_btn_1_label, LV_ALIGN_CENTER, 0, 0); + lv_obj_set_style_pad_all(ui->screen_btn_1, 0, LV_STATE_DEFAULT); + lv_obj_set_pos(ui->screen_btn_1, 156, 290); + lv_obj_set_size(ui->screen_btn_1, 100, 50); + + //Write style for screen_btn_1, Part: LV_PART_MAIN, State: LV_STATE_DEFAULT. + lv_obj_set_style_bg_opa(ui->screen_btn_1, 255, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_bg_color(ui->screen_btn_1, lv_color_hex(0x2195f6), LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_border_width(ui->screen_btn_1, 0, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_radius(ui->screen_btn_1, 5, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_shadow_width(ui->screen_btn_1, 0, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_text_color(ui->screen_btn_1, lv_color_hex(0xffffff), LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_text_font(ui->screen_btn_1, &lv_font_montserratMedium_16, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_text_align(ui->screen_btn_1, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN|LV_STATE_DEFAULT); + + //Write codes screen_chart_1 + ui->screen_chart_1 = lv_chart_create(ui->screen); + lv_chart_set_type(ui->screen_chart_1, LV_CHART_TYPE_LINE); + lv_chart_set_div_line_count(ui->screen_chart_1, 3, 5); + lv_chart_set_point_count(ui->screen_chart_1, 5); + lv_chart_set_range(ui->screen_chart_1, LV_CHART_AXIS_PRIMARY_Y, 0, 100); + lv_chart_set_range(ui->screen_chart_1, LV_CHART_AXIS_SECONDARY_Y, 0, 100); + lv_chart_set_zoom_x(ui->screen_chart_1, 256); + lv_chart_set_zoom_y(ui->screen_chart_1, 256); + lv_chart_series_t * screen_chart_1_0 = lv_chart_add_series(ui->screen_chart_1, lv_color_hex(0x000000), LV_CHART_AXIS_PRIMARY_Y); + lv_chart_set_next_value(ui->screen_chart_1, screen_chart_1_0, 1); + lv_chart_set_next_value(ui->screen_chart_1, screen_chart_1_0, 20); + lv_chart_set_next_value(ui->screen_chart_1, screen_chart_1_0, 30); + lv_chart_set_next_value(ui->screen_chart_1, screen_chart_1_0, 40); + lv_chart_set_next_value(ui->screen_chart_1, screen_chart_1_0, 5); + lv_obj_set_pos(ui->screen_chart_1, 104, 100); + lv_obj_set_size(ui->screen_chart_1, 205, 155); + lv_obj_set_scrollbar_mode(ui->screen_chart_1, LV_SCROLLBAR_MODE_OFF); + + //Write style for screen_chart_1, Part: LV_PART_MAIN, State: LV_STATE_DEFAULT. + lv_obj_set_style_bg_opa(ui->screen_chart_1, 255, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_bg_color(ui->screen_chart_1, lv_color_hex(0xffffff), LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_border_width(ui->screen_chart_1, 1, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_border_opa(ui->screen_chart_1, 255, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_border_color(ui->screen_chart_1, lv_color_hex(0xe8e8e8), LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_border_side(ui->screen_chart_1, LV_BORDER_SIDE_FULL, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_radius(ui->screen_chart_1, 0, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_line_width(ui->screen_chart_1, 2, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_line_color(ui->screen_chart_1, lv_color_hex(0xe8e8e8), LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_line_opa(ui->screen_chart_1, 255, LV_PART_MAIN|LV_STATE_DEFAULT); + lv_obj_set_style_shadow_width(ui->screen_chart_1, 0, LV_PART_MAIN|LV_STATE_DEFAULT); + + //Write style for screen_chart_1, Part: LV_PART_TICKS, State: LV_STATE_DEFAULT. + lv_obj_set_style_text_color(ui->screen_chart_1, lv_color_hex(0x151212), LV_PART_TICKS|LV_STATE_DEFAULT); + lv_obj_set_style_text_font(ui->screen_chart_1, &lv_font_montserratMedium_12, LV_PART_TICKS|LV_STATE_DEFAULT); + lv_obj_set_style_line_width(ui->screen_chart_1, 2, LV_PART_TICKS|LV_STATE_DEFAULT); + lv_obj_set_style_line_color(ui->screen_chart_1, lv_color_hex(0xe8e8e8), LV_PART_TICKS|LV_STATE_DEFAULT); + lv_obj_set_style_line_opa(ui->screen_chart_1, 255, LV_PART_TICKS|LV_STATE_DEFAULT); + + //Update current screen layout. + lv_obj_update_layout(ui->screen); + + +} diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/widgets_init.c b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/widgets_init.c new file mode 100644 index 0000000..958ae3d --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/widgets_init.c @@ -0,0 +1,78 @@ +/* +* Copyright 2024 NXP +* NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in +* accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, +* activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to +* comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license +* terms, then you may not retain, install, activate or otherwise use the software. +*/ + +#include "lvgl.h" +#include "gui_guider.h" +#include "widgets_init.h" +#include + + +__attribute__((unused)) void kb_event_cb (lv_event_t *e) { + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t *kb = lv_event_get_target(e); + if(code == LV_EVENT_READY || code == LV_EVENT_CANCEL){ + lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); + } +} + +__attribute__((unused)) void ta_event_cb (lv_event_t *e) { + lv_event_code_t code = lv_event_get_code(e); +#if LV_USE_KEYBOARD || LV_USE_ZH_KEYBOARD + lv_obj_t *ta = lv_event_get_target(e); +#endif + lv_obj_t *kb = lv_event_get_user_data(e); + if (code == LV_EVENT_FOCUSED || code == LV_EVENT_CLICKED) + { +#if LV_USE_ZH_KEYBOARD != 0 + lv_zh_keyboard_set_textarea(kb, ta); +#endif +#if LV_USE_KEYBOARD != 0 + lv_keyboard_set_textarea(kb, ta); +#endif + lv_obj_move_foreground(kb); + lv_obj_clear_flag(kb, LV_OBJ_FLAG_HIDDEN); + } + if (code == LV_EVENT_CANCEL || code == LV_EVENT_DEFOCUSED) + { + +#if LV_USE_ZH_KEYBOARD != 0 + lv_zh_keyboard_set_textarea(kb, ta); +#endif +#if LV_USE_KEYBOARD != 0 + lv_keyboard_set_textarea(kb, ta); +#endif + lv_obj_move_background(kb); + lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN); + } +} + +#if LV_USE_ANALOGCLOCK != 0 +void clock_count(int *hour, int *min, int *sec) +{ + (*sec)++; + if(*sec == 60) + { + *sec = 0; + (*min)++; + } + if(*min == 60) + { + *min = 0; + if(*hour < 12) + { + (*hour)++; + } else { + (*hour)++; + *hour = *hour %12; + } + } +} +#endif + + diff --git a/code/08.gui/lvgl_spd2010_gui/main/ui/generated/widgets_init.h b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/widgets_init.h new file mode 100644 index 0000000..55fa3c5 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/main/ui/generated/widgets_init.h @@ -0,0 +1,30 @@ +/* +* Copyright 2024 NXP +* NXP Confidential and Proprietary. This software is owned or controlled by NXP and may only be used strictly in +* accordance with the applicable license terms. By expressly accepting such terms or by downloading, installing, +* activating and/or otherwise using the software, you are agreeing that you have read, and that you agree to +* comply with and are bound by, such license terms. If you do not agree to be bound by the applicable license +* terms, then you may not retain, install, activate or otherwise use the software. +*/ + +#ifndef WIDGET_INIT_H +#define WIDGET_INIT_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "lvgl.h" +#include "gui_guider.h" + +__attribute__((unused)) void kb_event_cb(lv_event_t *e); +__attribute__((unused)) void ta_event_cb(lv_event_t *e); +#if LV_USE_ANALOGCLOCK != 0 +void clock_count(int *hour, int *min, int *sec); +#endif + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/code/08.gui/lvgl_spd2010_gui/partitions.csv b/code/08.gui/lvgl_spd2010_gui/partitions.csv new file mode 100644 index 0000000..57bcbf0 --- /dev/null +++ b/code/08.gui/lvgl_spd2010_gui/partitions.csv @@ -0,0 +1,5 @@ +# Name, Type, SubType, Offset, Size, Flags +# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap +nvs, data, nvs, 0x10000, 0x6000, +phy_init, data, phy, , 0x1000, +factory, app, factory, , 0x2c0000, diff --git a/code/08.gui/lvgl_transplant_gc9a01/.gitignore b/code/08.gui/lvgl_transplant_gc9a01/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/08.gui/lvgl_transplant_gc9a01/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/08.gui/lvgl_transplant_gc9a01/CMakeLists.txt b/code/08.gui/lvgl_transplant_gc9a01/CMakeLists.txt new file mode 100644 index 0000000..7969748 --- /dev/null +++ b/code/08.gui/lvgl_transplant_gc9a01/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(lvgl_component) diff --git a/code/08.gui/lvgl_transplant_gc9a01/docs/1.28寸ESP32圆形TFT屏幕开发板说明书 V1.01.pdf b/code/08.gui/lvgl_transplant_gc9a01/docs/1.28寸ESP32圆形TFT屏幕开发板说明书 V1.01.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9450a2e4da0e8379d21194910766fe6af4d81de5 GIT binary patch literal 673114 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

B=H~QTqaW$S=(bHqY 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

fh> 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Μ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%0D$_(SYUo-9wB*by~C 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

Tu6c^FbeV$qLDLQ)DGj?t~uDM~d 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%0DTvdkR-P;LM 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 z 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� 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 QD+eqT35kfDC@j?f0*e3?SpWb4 literal 0 HcmV?d00001 diff --git a/code/08.gui/lvgl_transplant_gc9a01/docs/原理图.pdf b/code/08.gui/lvgl_transplant_gc9a01/docs/原理图.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59d1e856604f088862c53cde7665cc69229c1c4a GIT binary patch literal 27385 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.1.0" + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true diff --git a/code/08.gui/lvgl_transplant_gc9a01/main/main.c b/code/08.gui/lvgl_transplant_gc9a01/main/main.c new file mode 100644 index 0000000..79dae97 --- /dev/null +++ b/code/08.gui/lvgl_transplant_gc9a01/main/main.c @@ -0,0 +1,245 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "freertos/task.h" +#include "esp_timer.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "driver/gpio.h" +#include "driver/spi_master.h" +#include "driver/i2c.h" +#include "esp_err.h" +#include "esp_log.h" +#include "lvgl.h" +#include "sdkconfig.h" +#include "esp_lcd_gc9a01.h" // 屏幕驱动 +#include "lv_demos.h" +// Using SPI2 +#define LCD_HOST SPI2_HOST + +// 屏幕尺寸 +#define EXAMPLE_LCD_H_RES 240 +#define EXAMPLE_LCD_V_RES 240 + +// 引脚接线 +// | Name | Description | GPIO | +// | BLK | 背光,悬空使能接地关闭,默认上拉至3.3V | 32 | +// | CS | 片选,低电平使能 | 5 | +// | DC | 数据/命令选择,低电平命令,高电平数据 | 27 | +// | RES | 复位,低电平使能 | 33 | +// | SDA | SPI数据输入端口 | 15 | +// | SCL | SPI时钟信号输入端口 | 14 | +#define EXAMPLE_LCD_BK_LIGHT_ON_LEVEL 1 +#define EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL !EXAMPLE_LCD_BK_LIGHT_ON_LEVEL +#define EXAMPLE_PIN_NUM_BK_LIGHT 32 +#define EXAMPLE_PIN_NUM_LCD_CS 5 +#define EXAMPLE_PIN_NUM_LCD_DC 27 +#define EXAMPLE_PIN_NUM_LCD_RST 33 +#define EXAMPLE_PIN_NUM_DATA0 15 +#define EXAMPLE_PIN_NUM_SCLK 14 + +// 日志标签 +static const char *TAG = "main"; + +static SemaphoreHandle_t lvgl_mux = NULL; + +// LVGL定时器周期 +#define EXAMPLE_LVGL_TICK_PERIOD_MS 2 +// LVGL任务参数 +#define EXAMPLE_LVGL_TASK_MAX_DELAY_MS 500 +#define EXAMPLE_LVGL_TASK_MIN_DELAY_MS 1 +#define EXAMPLE_LVGL_TASK_STACK_SIZE (5 * 1024) +#define EXAMPLE_LVGL_TASK_PRIORITY 2 + + +// 回调函数:颜色传输完成 (通知LVGL刷新) +static bool notify_lvgl_flush_ready(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx) +{ + lv_disp_drv_t *disp_driver = (lv_disp_drv_t *)user_ctx; + lv_disp_flush_ready(disp_driver); + return false; +} + +// 回调函数:刷新屏幕 +static void lvgl_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) +{ + esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) drv->user_data; + int offsetx1 = area->x1; + int offsetx2 = area->x2; + int offsety1 = area->y1; + int offsety2 = area->y2; + /* Copy a buffer's content to a specific area of the display */ + esp_lcd_panel_draw_bitmap(panel_handle, offsetx1, offsety1, offsetx2 + 1, offsety2 + 1, color_map); +} + +// 回调函数:增加LVGL的tick +static void example_increase_lvgl_tick(void *arg) +{ + /* Tell LVGL how many milliseconds has elapsed */ + lv_tick_inc(EXAMPLE_LVGL_TICK_PERIOD_MS); + +} + + + +static bool example_lvgl_lock(int timeout_ms) +{ + assert(lvgl_mux && "bsp_display_start must be called first"); + + const TickType_t timeout_ticks = (timeout_ms == -1) ? portMAX_DELAY : pdMS_TO_TICKS(timeout_ms); + return xSemaphoreTake(lvgl_mux, timeout_ticks) == pdTRUE; +} + +static void example_lvgl_unlock(void) +{ + assert(lvgl_mux && "bsp_display_start must be called first"); + xSemaphoreGive(lvgl_mux); +} + + + +// 测试UI +void test_ui(void) { + // ESP_LOGI(TAG, "Create a test_ui"); + // // 创建一个屏幕对象 + // lv_obj_t *scr = lv_disp_get_scr_act(NULL); + + // // 创建一个矩形对象 + // lv_obj_t *rect = lv_obj_create(scr); + // lv_obj_set_size(rect, LV_HOR_RES, LV_VER_RES); // 设置矩形大小为屏幕大小 + // lv_obj_set_style_local_bg_color(rect, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLUE); // 设置矩形对象背景颜色为蓝色 + // lv_obj_set_style_outline_color(rect, LV_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_SIZE); // 设置矩形对象背景颜色为白色 + + + + + + +} + +// LVGL任务 +static void example_lvgl_port_task(void *arg) +{ + ESP_LOGI(TAG, "Starting LVGL task"); + ESP_LOGI(TAG, "Display LVGL UI"); + + //test_ui(); + lv_demo_widgets(); + //lv_demo_music(); + + uint32_t task_delay_ms = EXAMPLE_LVGL_TASK_MAX_DELAY_MS; + while (1) { + ESP_LOGI(TAG, "LVGL task"); + /* Lock the mutex due to the LVGL APIs are not thread-safe */ + if (example_lvgl_lock(-1)) { + task_delay_ms = lv_timer_handler(); + /* Release the mutex */ + example_lvgl_unlock(); + } + if (task_delay_ms > EXAMPLE_LVGL_TASK_MAX_DELAY_MS) { + task_delay_ms = EXAMPLE_LVGL_TASK_MAX_DELAY_MS; + } else if (task_delay_ms < EXAMPLE_LVGL_TASK_MIN_DELAY_MS) { + task_delay_ms = EXAMPLE_LVGL_TASK_MIN_DELAY_MS; + } + vTaskDelay(pdMS_TO_TICKS(task_delay_ms)); + } +} + + + +void app_main(void) +{ + static lv_disp_draw_buf_t disp_buf; // contains internal graphic buffer(s) called draw buffer(s) + static lv_disp_drv_t disp_drv; // contains callback functions + + // 配置屏幕背光 + ESP_LOGI(TAG, "Turn off LCD backlight"); + gpio_config_t bk_gpio_config = { + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = 1ULL << EXAMPLE_PIN_NUM_BK_LIGHT}; + ESP_ERROR_CHECK(gpio_config(&bk_gpio_config)); + + // 初始化SPI总线 + ESP_LOGI(TAG, "Initialize SPI bus"); + const spi_bus_config_t buscfg = GC9A01_PANEL_BUS_SPI_CONFIG(EXAMPLE_PIN_NUM_SCLK, EXAMPLE_PIN_NUM_DATA0, EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES); + ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO)); + + // 创建屏幕句柄 + ESP_LOGI(TAG, "Install panel IO"); + esp_lcd_panel_io_handle_t io_handle = NULL; + const esp_lcd_panel_io_spi_config_t io_config = GC9A01_PANEL_IO_SPI_CONFIG(EXAMPLE_PIN_NUM_LCD_CS, EXAMPLE_PIN_NUM_LCD_DC, notify_lvgl_flush_ready, &disp_drv); + + // 将LCD连接到SPI总线 + ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)LCD_HOST, &io_config, &io_handle)); + + // 创建屏幕驱动句柄 + ESP_LOGI(TAG, "Install GC9A01 panel driver"); + esp_lcd_panel_handle_t panel_handle = NULL; + // 屏幕配置 + const esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = EXAMPLE_PIN_NUM_LCD_RST, // Set to -1 if not use + .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_BGR, + .bits_per_pixel = 16, // Implemented by LCD command `3Ah` (16/18) + //.vendor_config = &vendor_config, + }; + // 创建屏幕实例 + ESP_ERROR_CHECK(esp_lcd_new_panel_gc9a01(io_handle, &panel_config, &panel_handle)); + // 屏幕复位 + ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle)); + // 初始化屏幕 + ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle)); + // 反转颜色 + ESP_ERROR_CHECK(esp_lcd_panel_invert_color(panel_handle, true)); + // 镜像 + ESP_ERROR_CHECK(esp_lcd_panel_mirror(panel_handle, true, false)); + // 打开屏幕 + ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle, true)); + // 打开背光 + ESP_ERROR_CHECK(gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL)); + + + + // 初始化LVGL + ESP_LOGI(TAG, "Initialize LVGL"); + lv_init(); + // 申请内存 两个buf + lv_color_t *buf1 = heap_caps_malloc(EXAMPLE_LCD_H_RES * 50 * sizeof(lv_color_t), MALLOC_CAP_DMA); + assert(buf1); // 检查内存是否申请成功 + lv_color_t *buf2 = heap_caps_malloc(EXAMPLE_LCD_H_RES * 50 * sizeof(lv_color_t), MALLOC_CAP_DMA); + assert(buf2); + // 初始化LVGL显示缓冲区 + lv_disp_draw_buf_init(&disp_buf, buf1, buf2, EXAMPLE_LCD_H_RES * 50); + + // 初始化LVGL显示驱动 + ESP_LOGI(TAG, "Initialize LVGL display driver"); + lv_disp_drv_init(&disp_drv); + disp_drv.hor_res = EXAMPLE_LCD_H_RES; // 设置屏幕水平分辨率 + disp_drv.ver_res = EXAMPLE_LCD_V_RES; // 设置屏幕垂直分辨率 + disp_drv.flush_cb = lvgl_flush_cb; // 设置刷新回调函数 + disp_drv.draw_buf = &disp_buf; // 设置显示缓冲区 + disp_drv.user_data = panel_handle; // 设置用户数据 + lv_disp_t *disp = lv_disp_drv_register(&disp_drv); // 注册显示驱动 + + // 配置输入设备 + ESP_LOGI(TAG, "Initialize LVGL input device"); + // lv_indev_drv_t indev_drv; + + + // 创建定时器 + ESP_LOGI(TAG, "Install LVGL tick timer"); + /* Tick interface for LVGL (using esp_timer to generate 2ms periodic event) */ + const esp_timer_create_args_t lvgl_tick_timer_args = { + .callback = &example_increase_lvgl_tick, + .name = "lvgl_tick" + }; + esp_timer_handle_t lvgl_tick_timer = NULL; + ESP_ERROR_CHECK(esp_timer_create(&lvgl_tick_timer_args, &lvgl_tick_timer)); + ESP_ERROR_CHECK(esp_timer_start_periodic(lvgl_tick_timer, EXAMPLE_LVGL_TICK_PERIOD_MS * 1000)); + + // 创建LVGL任务 + ESP_LOGI(TAG, "Create LVGL task"); + lvgl_mux = xSemaphoreCreateMutex(); + assert(lvgl_mux); + xTaskCreate(example_lvgl_port_task, "LVGL", EXAMPLE_LVGL_TASK_STACK_SIZE, NULL, EXAMPLE_LVGL_TASK_PRIORITY, NULL); +} diff --git a/code/08.gui/lvgl_transplant_gc9a01/partitions.csv b/code/08.gui/lvgl_transplant_gc9a01/partitions.csv new file mode 100644 index 0000000..57bcbf0 --- /dev/null +++ b/code/08.gui/lvgl_transplant_gc9a01/partitions.csv @@ -0,0 +1,5 @@ +# Name, Type, SubType, Offset, Size, Flags +# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap +nvs, data, nvs, 0x10000, 0x6000, +phy_init, data, phy, , 0x1000, +factory, app, factory, , 0x2c0000, diff --git a/code/08.gui/lvgl_transplant_spd2010/.gitignore b/code/08.gui/lvgl_transplant_spd2010/.gitignore new file mode 100644 index 0000000..8da877b --- /dev/null +++ b/code/08.gui/lvgl_transplant_spd2010/.gitignore @@ -0,0 +1,6 @@ +build +*managed_components +dependencies.lock +sdkconfig +sdkconfig.old + diff --git a/code/08.gui/lvgl_transplant_spd2010/CMakeLists.txt b/code/08.gui/lvgl_transplant_spd2010/CMakeLists.txt new file mode 100644 index 0000000..bdafdcf --- /dev/null +++ b/code/08.gui/lvgl_transplant_spd2010/CMakeLists.txt @@ -0,0 +1,8 @@ +# For more information about build system see +# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html +# The following five lines of boilerplate have to be in your project's +# CMakeLists in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.16) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(lvgl_transplant_spd2010) diff --git a/code/08.gui/lvgl_transplant_spd2010/main/CMakeLists.txt b/code/08.gui/lvgl_transplant_spd2010/main/CMakeLists.txt new file mode 100644 index 0000000..cf2c455 --- /dev/null +++ b/code/08.gui/lvgl_transplant_spd2010/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "main.c" + INCLUDE_DIRS ".") diff --git a/code/08.gui/lvgl_transplant_spd2010/main/idf_component.yml b/code/08.gui/lvgl_transplant_spd2010/main/idf_component.yml new file mode 100644 index 0000000..6529be1 --- /dev/null +++ b/code/08.gui/lvgl_transplant_spd2010/main/idf_component.yml @@ -0,0 +1,19 @@ +## IDF Component Manager Manifest File +dependencies: + lvgl/lvgl: "^8.3.11" + espressif/esp_lcd_spd2010: "*" + espressif/esp_lcd_touch_spd2010: "^0.0.1" + ## Required IDF version + idf: + version: ">=4.1.0" + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true diff --git a/code/08.gui/lvgl_transplant_spd2010/main/main.c b/code/08.gui/lvgl_transplant_spd2010/main/main.c new file mode 100644 index 0000000..113d3df --- /dev/null +++ b/code/08.gui/lvgl_transplant_spd2010/main/main.c @@ -0,0 +1,408 @@ +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "driver/i2c.h" +#include "driver/spi_master.h" +#include "esp_timer.h" +#include "esp_lcd_panel_io.h" +#include "esp_lcd_panel_vendor.h" +#include "esp_lcd_panel_ops.h" +#include "esp_err.h" +#include "esp_log.h" + +#include "lvgl.h" +#include "lv_demos.h" +#include "esp_lcd_spd2010.h" +#include "esp_lcd_touch_spd2010.h" + + +static const char *TAG = "main"; +static SemaphoreHandle_t lvgl_mux = NULL; + +// LCD和触摸控制器配置 +#define LCD_HOST SPI2_HOST +#define TOUCH_HOST I2C_NUM_0 + + +// 颜色深度 +#define LCD_BIT_PER_PIXEL (16) + +// 引脚配置 +// ESP Board SPD1020 Panel (QSPI) +// ┌──────────────────────┐ ┌────────────────────┐ +// │ GND ├─────────────►│ GND │ +// │ │ │ │ +// │ 3V3 ├─────────────►│ VCC │ +// │ │ │ │ +// │ CS ├─────────────►│ CS │ +// │ │ │ │ +// │ SCK ├─────────────►│ CLK │ +// │ │ │ │ +// │ D3 ├─────────────►│ IO3 │ +// │ │ │ │ +// │ D2 ├─────────────►│ IO2 │ +// │ │ │ │ +// │ D1 ├─────────────►│ IO1 │ +// │ │ │ │ +// │ D0 ├─────────────►│ IO0 │ +// │ │ │ │ +// │ RST ├─────────────►│ RSTN │ +// │ │ │ │ +// │ (SCL) ├─────────────►│ TP_SCL │ +// │ │ │ │ +// │ (SDA) ├─────────────►│ TP_SDA │ +// │ │ │ │ +// │ (TP_INT) ├─────────────►│ TP_INT │ +// │ │ │ │ +// │ (3V3) ├─────────────►│ TP_RST │ +// │ │ │ │ +// └──────────────────────┘ └────────────────────┘ +#define EXAMPLE_LCD_BK_LIGHT_ON_LEVEL 0 +#define EXAMPLE_LCD_BK_LIGHT_OFF_LEVEL !EXAMPLE_LCD_BK_LIGHT_ON_LEVEL +#define EXAMPLE_PIN_NUM_LCD_CS (GPIO_NUM_9) +#define EXAMPLE_PIN_NUM_LCD_PCLK (GPIO_NUM_10) +#define EXAMPLE_PIN_NUM_LCD_DATA0 (GPIO_NUM_11) +#define EXAMPLE_PIN_NUM_LCD_DATA1 (GPIO_NUM_12) +#define EXAMPLE_PIN_NUM_LCD_DATA2 (GPIO_NUM_13) +#define EXAMPLE_PIN_NUM_LCD_DATA3 (GPIO_NUM_14) +#define EXAMPLE_PIN_NUM_LCD_RST (GPIO_NUM_4) +#define EXAMPLE_PIN_NUM_BK_LIGHT (GPIO_NUM_3) + +// 触摸引脚配置 +#define EXAMPLE_PIN_NUM_TOUCH_SCL (GPIO_NUM_18) +#define EXAMPLE_PIN_NUM_TOUCH_SDA (GPIO_NUM_8) +#define EXAMPLE_PIN_NUM_TOUCH_RST (GPIO_NUM_7) +#define EXAMPLE_PIN_NUM_TOUCH_INT (GPIO_NUM_17) + +esp_lcd_touch_handle_t tp = NULL; + + +// LCD分辨率 +#define EXAMPLE_LCD_H_RES 412 +#define EXAMPLE_LCD_V_RES 412 + +// LVGLtask配置 +#define EXAMPLE_LVGL_TICK_PERIOD_MS 2 +#define EXAMPLE_LVGL_TASK_MAX_DELAY_MS 500 +#define EXAMPLE_LVGL_TASK_MIN_DELAY_MS 1 +#define EXAMPLE_LVGL_TASK_STACK_SIZE (4 * 1024) +#define EXAMPLE_LVGL_TASK_PRIORITY 2 + +static bool example_notify_lvgl_flush_ready(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx) +{ + lv_disp_drv_t *disp_driver = (lv_disp_drv_t *)user_ctx; + lv_disp_flush_ready(disp_driver); + return false; +} + + +static void example_lvgl_flush_cb(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map) +{ + esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) drv->user_data; + const int offsetx1 = area->x1; + const int offsetx2 = area->x2; + const int offsety1 = area->y1; + const int offsety2 = area->y2; + + // copy a buffer's content to a specific area of the display + esp_lcd_panel_draw_bitmap(panel_handle, offsetx1, offsety1, offsetx2 + 1, offsety2 + 1, color_map); +} + +/* Rotate display and touch, when rotated screen in LVGL. Called when driver parameters are updated. */ +static void example_lvgl_update_cb(lv_disp_drv_t *drv) +{ + esp_lcd_panel_handle_t panel_handle = (esp_lcd_panel_handle_t) drv->user_data; + + switch (drv->rotated) { + case LV_DISP_ROT_NONE: + // Rotate LCD display + esp_lcd_panel_swap_xy(panel_handle, false); + esp_lcd_panel_mirror(panel_handle, true, false); + // Rotate LCD touch + esp_lcd_touch_set_mirror_y(tp, false); + esp_lcd_touch_set_mirror_x(tp, false); + break; + case LV_DISP_ROT_90: + // Rotate LCD display + esp_lcd_panel_swap_xy(panel_handle, true); + esp_lcd_panel_mirror(panel_handle, true, true); + // Rotate LCD touch + esp_lcd_touch_set_mirror_y(tp, false); + esp_lcd_touch_set_mirror_x(tp, false); + break; + case LV_DISP_ROT_180: + // Rotate LCD display + esp_lcd_panel_swap_xy(panel_handle, false); + esp_lcd_panel_mirror(panel_handle, false, true); + // Rotate LCD touch + esp_lcd_touch_set_mirror_y(tp, false); + esp_lcd_touch_set_mirror_x(tp, false); + + break; + case LV_DISP_ROT_270: + // Rotate LCD display + esp_lcd_panel_swap_xy(panel_handle, true); + esp_lcd_panel_mirror(panel_handle, false, false); + // Rotate LCD touch + esp_lcd_touch_set_mirror_y(tp, false); + esp_lcd_touch_set_mirror_x(tp, false); + break; + } +} + +void example_lvgl_rounder_cb(struct _lv_disp_drv_t *disp_drv, lv_area_t *area) +{ + uint16_t x1 = area->x1; + uint16_t x2 = area->x2; + // round the start of coordinate down to the nearest 4M number + area->x1 = (x1 >> 2) << 2; + // round the end of coordinate up to the nearest 4N+3 number + area->x2 = ((x2 >> 2) << 2) + 3; +} + + +// 触屏信号量 +static SemaphoreHandle_t touch_mux = NULL; +// lvgl触摸回调函数 +static void example_lvgl_touch_cb(lv_indev_drv_t *drv, lv_indev_data_t *data) +{ + esp_lcd_touch_handle_t tp = (esp_lcd_touch_handle_t)drv->user_data; + assert(tp); + + uint16_t tp_x; + uint16_t tp_y; + uint8_t tp_cnt = 0; + /* Read data from touch controller into memory */ + if (xSemaphoreTake(touch_mux, 0) == pdTRUE) { + esp_lcd_touch_read_data(tp); + } + + /* Read data from touch controller */ + bool tp_pressed = esp_lcd_touch_get_coordinates(tp, &tp_x, &tp_y, NULL, &tp_cnt, 1); + if (tp_pressed && tp_cnt > 0) { + data->point.x = tp_x; + data->point.y = tp_y; + data->state = LV_INDEV_STATE_PRESSED; + ESP_LOGI(TAG, "Touch position: %d,%d", tp_x, tp_y); + } else { + data->state = LV_INDEV_STATE_RELEASED; + } +} + +static void example_touch_isr_cb(esp_lcd_touch_handle_t tp) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + xSemaphoreGiveFromISR(touch_mux, &xHigherPriorityTaskWoken); + + if (xHigherPriorityTaskWoken) { + portYIELD_FROM_ISR(); + } +} + + +// LVGL任务 +static void example_increase_lvgl_tick(void *arg) +{ + /* Tell LVGL how many milliseconds has elapsed */ + lv_tick_inc(EXAMPLE_LVGL_TICK_PERIOD_MS); +} + +static bool example_lvgl_lock(int timeout_ms) +{ + assert(lvgl_mux && "bsp_display_start must be called first"); + + const TickType_t timeout_ticks = (timeout_ms == -1) ? portMAX_DELAY : pdMS_TO_TICKS(timeout_ms); + return xSemaphoreTake(lvgl_mux, timeout_ticks) == pdTRUE; +} + +static void example_lvgl_unlock(void) +{ + assert(lvgl_mux && "bsp_display_start must be called first"); + xSemaphoreGive(lvgl_mux); +} + + +// LVGL任务 +static void example_lvgl_port_task(void *arg) +{ + ESP_LOGI(TAG, "Starting LVGL task"); + uint32_t task_delay_ms = EXAMPLE_LVGL_TASK_MAX_DELAY_MS; + while (1) { + ESP_LOGI(TAG, "LVGL task"); + // Lock the mutex due to the LVGL APIs are not thread-safe + if (example_lvgl_lock(-1)) { + task_delay_ms = lv_timer_handler(); + // Release the mutex + example_lvgl_unlock(); + } + if (task_delay_ms > EXAMPLE_LVGL_TASK_MAX_DELAY_MS) { + task_delay_ms = EXAMPLE_LVGL_TASK_MAX_DELAY_MS; + } else if (task_delay_ms < EXAMPLE_LVGL_TASK_MIN_DELAY_MS) { + task_delay_ms = EXAMPLE_LVGL_TASK_MIN_DELAY_MS; + } + vTaskDelay(pdMS_TO_TICKS(task_delay_ms)); + } +} + +void app_main(void) +{ + static lv_disp_draw_buf_t disp_buf; // contains internal graphic buffer(s) called draw buffer(s) + static lv_disp_drv_t disp_drv; // contains callback functions + + // 背光引脚配置 + ESP_LOGI(TAG, "Turn off LCD backlight"); + gpio_config_t bk_gpio_config = { + .mode = GPIO_MODE_OUTPUT, + .pin_bit_mask = 1ULL << EXAMPLE_PIN_NUM_BK_LIGHT + }; + ESP_ERROR_CHECK(gpio_config(&bk_gpio_config)); + + ESP_LOGI(TAG, "Initialize SPI bus"); + const spi_bus_config_t buscfg = SPD2010_PANEL_BUS_QSPI_CONFIG(EXAMPLE_PIN_NUM_LCD_PCLK, + EXAMPLE_PIN_NUM_LCD_DATA0, + EXAMPLE_PIN_NUM_LCD_DATA1, + EXAMPLE_PIN_NUM_LCD_DATA2, + EXAMPLE_PIN_NUM_LCD_DATA3, + EXAMPLE_LCD_H_RES * EXAMPLE_LCD_V_RES * LCD_BIT_PER_PIXEL / 8); + + ESP_ERROR_CHECK(spi_bus_initialize(LCD_HOST, &buscfg, SPI_DMA_CH_AUTO)); + + ESP_LOGI(TAG, "Install panel IO"); + esp_lcd_panel_io_handle_t io_handle = NULL; + const esp_lcd_panel_io_spi_config_t io_config = SPD2010_PANEL_IO_QSPI_CONFIG(EXAMPLE_PIN_NUM_LCD_CS, + example_notify_lvgl_flush_ready, + &disp_drv); + spd2010_vendor_config_t vendor_config = { + .flags = { + .use_qspi_interface = 1, + }, + }; + + // Attach the LCD to the SPI bus + ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi((esp_lcd_spi_bus_handle_t)LCD_HOST, &io_config, &io_handle)); + + esp_lcd_panel_handle_t panel_handle = NULL; + const esp_lcd_panel_dev_config_t panel_config = { + .reset_gpio_num = EXAMPLE_PIN_NUM_LCD_RST, + .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, + .bits_per_pixel = LCD_BIT_PER_PIXEL, + .vendor_config = &vendor_config, + }; + ESP_LOGI(TAG, "Install SPD2010 panel driver"); + ESP_ERROR_CHECK(esp_lcd_new_panel_spd2010(io_handle, &panel_config, &panel_handle)); + + + ESP_ERROR_CHECK(esp_lcd_panel_reset(panel_handle)); + ESP_ERROR_CHECK(esp_lcd_panel_init(panel_handle)); + // user can flush pre-defined pattern to the screen before we turn on the screen or backlight + ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_handle, true)); + + // 初始化I2C总线 + touch_mux = xSemaphoreCreateBinary(); + assert(touch_mux); + + ESP_LOGI(TAG, "Initialize I2C bus"); + const i2c_config_t i2c_conf = { + .mode = I2C_MODE_MASTER, + .sda_io_num = EXAMPLE_PIN_NUM_TOUCH_SDA, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = EXAMPLE_PIN_NUM_TOUCH_SCL, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = 400 * 1000, + }; + ESP_ERROR_CHECK(i2c_param_config(TOUCH_HOST, &i2c_conf)); + ESP_ERROR_CHECK(i2c_driver_install(TOUCH_HOST, i2c_conf.mode, 0, 0, 0)); + + // 触屏驱动IO句柄 + esp_lcd_panel_io_handle_t tp_io_handle = NULL; + const esp_lcd_panel_io_i2c_config_t tp_io_config = ESP_LCD_TOUCH_IO_I2C_SPD2010_CONFIG(); + + const esp_lcd_touch_config_t tp_cfg = { + .x_max = EXAMPLE_LCD_H_RES, + .y_max = EXAMPLE_LCD_V_RES, + .rst_gpio_num = EXAMPLE_PIN_NUM_TOUCH_RST, + .int_gpio_num = EXAMPLE_PIN_NUM_TOUCH_INT, + .levels = { + .reset = 0, + .interrupt = 0, + }, + .flags = { + .swap_xy = 0, + .mirror_x = 0, + .mirror_y = 0, + }, + .interrupt_callback = example_touch_isr_cb, + }; + + // Attach the TOUCH to the I2C bus + ESP_ERROR_CHECK(esp_lcd_new_panel_io_i2c((esp_lcd_i2c_bus_handle_t)TOUCH_HOST, &tp_io_config, &tp_io_handle)); + + // 初始化触摸驱动 + ESP_LOGI(TAG, "Initialize touch controller SPD2010"); + ESP_ERROR_CHECK(esp_lcd_touch_new_i2c_spd2010(tp_io_handle, &tp_cfg, &tp)); + + // 打开背光 + ESP_LOGI(TAG, "Turn on LCD backlight"); + gpio_set_level(EXAMPLE_PIN_NUM_BK_LIGHT, EXAMPLE_LCD_BK_LIGHT_ON_LEVEL); + + // 初始化LVGL + ESP_LOGI(TAG, "Initialize LVGL library"); + lv_init(); + // alloc draw buffers used by LVGL + // it's recommended to choose the size of the draw buffer(s) to be at least 1/10 screen sized + lv_color_t *buf1 = heap_caps_malloc(EXAMPLE_LCD_H_RES * 10 * sizeof(lv_color_t), MALLOC_CAP_DMA); + assert(buf1); + lv_color_t *buf2 = heap_caps_malloc(EXAMPLE_LCD_H_RES * 10 * sizeof(lv_color_t), MALLOC_CAP_DMA); + assert(buf2); + // initialize LVGL draw buffers + lv_disp_draw_buf_init(&disp_buf, buf1, buf2, EXAMPLE_LCD_H_RES * 10); + + ESP_LOGI(TAG, "Register display driver to LVGL"); + lv_disp_drv_init(&disp_drv); + disp_drv.hor_res = EXAMPLE_LCD_H_RES; + disp_drv.ver_res = EXAMPLE_LCD_V_RES; + disp_drv.flush_cb = example_lvgl_flush_cb; + disp_drv.rounder_cb = example_lvgl_rounder_cb; + disp_drv.drv_update_cb = example_lvgl_update_cb; + disp_drv.draw_buf = &disp_buf; + disp_drv.user_data = panel_handle; + lv_disp_t *disp = lv_disp_drv_register(&disp_drv); + + ESP_LOGI(TAG, "Install LVGL tick timer"); + // Tick interface for LVGL (using esp_timer to generate 2ms periodic event) + const esp_timer_create_args_t lvgl_tick_timer_args = { + .callback = &example_increase_lvgl_tick, + .name = "lvgl_tick" + }; + esp_timer_handle_t lvgl_tick_timer = NULL; + ESP_ERROR_CHECK(esp_timer_create(&lvgl_tick_timer_args, &lvgl_tick_timer)); + ESP_ERROR_CHECK(esp_timer_start_periodic(lvgl_tick_timer, EXAMPLE_LVGL_TICK_PERIOD_MS * 1000)); + + static lv_indev_drv_t indev_drv; // Input device driver (Touch) + lv_indev_drv_init(&indev_drv); + indev_drv.type = LV_INDEV_TYPE_POINTER; + indev_drv.disp = disp; + indev_drv.read_cb = example_lvgl_touch_cb; + indev_drv.user_data = tp; + + lv_indev_drv_register(&indev_drv); + + + lvgl_mux = xSemaphoreCreateMutex(); + assert(lvgl_mux); + xTaskCreate(example_lvgl_port_task, "LVGL", EXAMPLE_LVGL_TASK_STACK_SIZE, NULL, EXAMPLE_LVGL_TASK_PRIORITY, NULL); + + ESP_LOGI(TAG, "Display LVGL demos"); + // Lock the mutex due to the LVGL APIs are not thread-safe + if (example_lvgl_lock(-1)) { + lv_demo_widgets(); /* A widgets example */ + //lv_demo_music(); /* A modern, smartphone-like music player demo. */ + // lv_demo_stress(); /* A stress test for LVGL. */ + // lv_demo_benchmark(); /* A demo to measure the performance of LVGL or to compare different settings. */ + + // Release the mutex + example_lvgl_unlock(); + } +} + diff --git a/code/08.gui/lvgl_transplant_spd2010/partitions.csv b/code/08.gui/lvgl_transplant_spd2010/partitions.csv new file mode 100644 index 0000000..57bcbf0 --- /dev/null +++ b/code/08.gui/lvgl_transplant_spd2010/partitions.csv @@ -0,0 +1,5 @@ +# Name, Type, SubType, Offset, Size, Flags +# Note: if you have increased the bootloader size, make sure to update the offsets to avoid overlap +nvs, data, nvs, 0x10000, 0x6000, +phy_init, data, phy, , 0x1000, +factory, app, factory, , 0x2c0000,