update firmware v1.2.4 (#16)

This commit is contained in:
Forairaaaaa
2026-04-20 16:27:36 +08:00
committed by GitHub
parent 605b575fcc
commit dd34f9e0ec
94 changed files with 3615 additions and 41513 deletions
+2 -1
View File
@@ -2,7 +2,8 @@
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.16)
set(PROJECT_VER "2.1.0")
set(PROJECT_VER "1.2.4")
add_definitions(-DFIRMWARE_VERSION=\"${PROJECT_VER}\")
# Add this line to disable the specific warning
add_compile_options(-Wno-missing-field-initializers)
+1 -2
View File
@@ -1,4 +1,3 @@
# StackChan Firmware
## Build
@@ -10,7 +9,7 @@ python3 ./fetch_repos.py
### Tool Chains
[ESP-IDF v5.5.1](https://docs.espressif.com/projects/esp-idf/en/v5.5.1/esp32s3/index.html)
[ESP-IDF v5.5.4](https://docs.espressif.com/projects/esp-idf/en/v5.5.4/esp32s3/index.html)
### Build
+219 -96
View File
@@ -1,40 +1,22 @@
dependencies:
78/esp-ml307:
component_hash: d4de9738baaaa5e6655c686a6083e699f3605de54dc83233ff3328cf55a4f543
component_hash: 5231991281a2f48f0e34ec705c2982936264d8b14f6f9373e60b153fd4b62123
dependencies:
- name: 78/uart-uhci
registry_url: https://components.espressif.com
require: private
rules:
- if: target not in [esp32]
version: ~0.2.1
- name: idf
require: private
version: '>=5.3'
version: '>=5.5.2'
source:
registry_url: https://components.espressif.com/
type: service
version: 3.5.3
78/esp-opus:
component_hash: 8182b733f071d7bfe1e837f4c9f8649a63e4c937177f089e65772880c02f2e17
dependencies:
- name: idf
require: private
version: '>=5.0'
source:
registry_url: https://components.espressif.com
type: service
version: 1.0.5
78/esp-opus-encoder:
component_hash: b80e5b6d6dc4bf6b0bf1a3729f52b80500e9e6b1003b3e827b78ba738283a296
dependencies:
- name: 78/esp-opus
registry_url: https://components.espressif.com
require: private
version: ^1.0.5
- name: idf
require: private
version: '>=5.3'
source:
registry_url: https://components.espressif.com/
type: service
version: 2.4.1
version: 3.6.5
78/esp-wifi-connect:
component_hash: bf996fc603af1ff529668c788c7b38a8d94b1d43455af56d116d27ebb04b742a
component_hash: e64ce09a795dd3b4883e1f68be10b0dd11260331f021a5f0b1f3bfd9a25d413b
dependencies:
- name: idf
require: private
@@ -42,7 +24,7 @@ dependencies:
source:
registry_url: https://components.espressif.com/
type: service
version: 3.0.2
version: 3.1.2
78/esp_lcd_nv3023:
component_hash: fa88abfc19a312eb5e6f2ffa187e0a9faf67e01e758bfb979d3f9d92561a494f
dependencies:
@@ -57,8 +39,36 @@ dependencies:
registry_url: https://components.espressif.com/
type: service
version: 1.0.0
78/uart-eth-modem:
component_hash: 7a33284e4ba22f420191be8021cd4fe3e49f5e50eea1db70370b217a18147d8e
dependencies:
- name: 78/uart-uhci
registry_url: https://components.espressif.com
require: private
version: ~0.2.1
- name: espressif/iot_eth
registry_url: https://components.espressif.com
require: private
version: ^0.1.0
- name: idf
require: private
version: '>=5.5.2'
source:
registry_url: https://components.espressif.com/
type: service
version: 0.3.4
78/uart-uhci:
component_hash: 200eb10923cb750dddbee5504a36d7b5eaac611afbf52fb9066dc7130159f696
dependencies:
- name: idf
require: private
version: '>=5.5.2'
source:
registry_url: https://components.espressif.com
type: service
version: 0.2.1
78/xiaozhi-fonts:
component_hash: e5526ea3c290742963ef6ab64023669260b72aefdc37bb218c34c618962ef2a8
component_hash: 19ee829a7439702e18084a313b7b86017d3b8d17a094684575edc76bb6d11023
dependencies:
- name: idf
require: private
@@ -66,7 +76,7 @@ dependencies:
source:
registry_url: https://components.espressif.com/
type: service
version: 1.5.5
version: 1.6.0
espressif/adc_battery_estimation:
component_hash: b915167c87ed5a84b13d680bd011c2ed9a15121f1e247c6903141b9f138f3606
dependencies:
@@ -82,7 +92,7 @@ dependencies:
type: service
version: 0.2.1
espressif/adc_mic:
component_hash: ca6ef69bba4dc0d3e0ce53937635ed2734d38ac947881da81b8526e6851a71a4
component_hash: 3bb576d530564cb8e805fc34309d485de393f634651f3d31579fe3037b581d4f
dependencies:
- name: espressif/cmake_utilities
registry_url: https://components.espressif.com
@@ -98,7 +108,7 @@ dependencies:
source:
registry_url: https://components.espressif.com/
type: service
version: 0.2.1
version: 0.2.2
espressif/bmi270_sensor:
component_hash: fac23a5ecd2effdac0fb0705988d853745b8ffb99a384f87a307b3b25d15d432
dependencies:
@@ -118,7 +128,7 @@ dependencies:
type: service
version: 0.1.1
espressif/button:
component_hash: fccb18c37f1cfe0797b74a53a44d3f400f5fd01f4993b40052dfb7f401915089
component_hash: d0afa32f0e50d60bc0c6fc23f7eea98adc6b02cfe70b590bc52c23c506745287
dependencies:
- name: espressif/cmake_utilities
registry_url: https://components.espressif.com
@@ -130,7 +140,7 @@ dependencies:
source:
registry_url: https://components.espressif.com/
type: service
version: 4.1.5
version: 4.1.6
espressif/cmake_utilities:
component_hash: 351350613ceafba240b761b4ea991e0f231ac7a9f59a9ee901f751bddc0bb18f
dependencies:
@@ -148,7 +158,7 @@ dependencies:
require: private
version: '>=5.0'
source:
registry_url: https://components.espressif.com/
registry_url: https://components.espressif.com
type: service
version: 0.3.1
espressif/esp-dsp:
@@ -158,9 +168,58 @@ dependencies:
require: private
version: '>=4.2'
source:
registry_url: https://components.espressif.com/
registry_url: https://components.espressif.com
type: service
version: 1.7.0
espressif/esp-sr:
component_hash: 46b1f70f8b561714b958d1c455213cca07162755d1b8df53498081199f15136f
dependencies:
- name: espressif/dl_fft
registry_url: https://components.espressif.com
require: private
version: '>=0.2.0'
- name: espressif/esp-dsp
registry_url: https://components.espressif.com
require: private
version: 1.7.0
- name: idf
require: private
version: '>=5.0'
source:
registry_url: https://components.espressif.com/
type: service
version: 2.3.1
espressif/esp32-camera:
component_hash: ac4228c825b891378bc0806869170d4ebc5d45ba8ebc519b4f8886a56ad2d123
dependencies:
- name: espressif/esp_jpeg
registry_url: https://components.espressif.com
require: public
version: ^1.3.1
- name: idf
require: private
version: '>=5.1'
source:
registry_url: https://components.espressif.com/
type: service
version: 2.1.5
espressif/esp_audio_codec:
component_hash: af4663830bc73eca58febcc34a976d003465e78ed57458aa00a14b231e392ca1
dependencies:
- name: idf
require: private
version: '>=4.4'
source:
registry_url: https://components.espressif.com/
type: service
version: 2.4.1
espressif/esp_audio_effects:
component_hash: 8fa2bf7356a3c7fb9a9c7d2185aba474fa033b0506886c70752f67c42cd81b3f
dependencies: []
source:
registry_url: https://components.espressif.com/
type: service
version: 1.2.1
espressif/esp_cam_sensor:
component_hash: 35c1648ea87aac81da7a085d35f61b6d5ad88574bd0c5fdc4ab75efdef4ee6c1
dependencies:
@@ -207,7 +266,7 @@ dependencies:
type: service
version: 1.0.1
espressif/esp_io_expander:
component_hash: abf3ea0d71407d79d15500550aa3ba433848459b0fa94717cf9478822593ee5d
component_hash: 7b7f91270172e46ca4597e3874f48d8412e280e8c295559f5922ec38656e3e5f
dependencies:
- name: idf
require: private
@@ -215,7 +274,7 @@ dependencies:
source:
registry_url: https://components.espressif.com
type: service
version: 1.1.0
version: 1.2.1
espressif/esp_io_expander_tca9554:
component_hash: 8a9e3a7dbef589a54f814ff22e9121da86bce19d0e1ccffa53f5df6bb346a140
dependencies:
@@ -231,19 +290,29 @@ dependencies:
type: service
version: 2.0.0
espressif/esp_io_expander_tca95xx_16bit:
component_hash: c384d55e429775d6a1eef26512fbc33bc41823745a8c2ad6d5927729f33a2c21
component_hash: a9608ba5753ae2a72e79fccd376fc4283343c0306d23505fbf8a46fafdbde2a2
dependencies:
- name: espressif/esp_io_expander
registry_url: https://components.espressif.com
require: public
version: ^1.0.1
version: ^1.2.0
- name: idf
require: private
version: '>=5.2'
source:
registry_url: https://components.espressif.com/
type: service
version: 2.0.1
version: 2.0.2
espressif/esp_jpeg:
component_hash: defb83669293cbf86d0fa86b475ba5517aceed04ed70db435388c151ab37b5d7
dependencies:
- name: idf
require: private
version: '>=5.0'
source:
registry_url: https://components.espressif.com
type: service
version: 1.3.1
espressif/esp_lcd_axs15231b:
component_hash: e614bd75827e95800e39df1ba9474166060ab26c3807d06df9cc312a27021cda
dependencies:
@@ -262,6 +331,20 @@ dependencies:
registry_url: https://components.espressif.com/
type: service
version: 1.0.1~1
espressif/esp_lcd_co5300:
component_hash: 7004162c496b65a5e0ee7c92800c33c12b373ea70d07199318a182cb16c741b7
dependencies:
- name: espressif/cmake_utilities
registry_url: https://components.espressif.com
require: private
version: 0.*
- name: idf
require: private
version: '>=5.4'
source:
registry_url: https://components.espressif.com/
type: service
version: 2.0.3
espressif/esp_lcd_gc9a01:
component_hash: 09ddc8f5c9d718a659ffa30a4040e1ae75077e68492c38aec8c2beaaa7b3a9bc
dependencies:
@@ -457,7 +540,7 @@ dependencies:
type: service
version: 1.0.1
espressif/esp_lvgl_port:
component_hash: 3264cc85d86a7c32b67d26a1353a57c67e7986bb293ebb1731801936b056e632
component_hash: b6360960f47b6776462e7092861b3ea66477ffb762a01baa0aecbb3d74cd50f4
dependencies:
- name: idf
require: private
@@ -469,7 +552,7 @@ dependencies:
source:
registry_url: https://components.espressif.com/
type: service
version: 2.6.3
version: 2.7.2
espressif/esp_mmap_assets:
component_hash: 91d785326b03db15e2f7f1314d8c976d38f21aa5759b570dcbbc89bcf247fd27
dependencies:
@@ -501,7 +584,7 @@ dependencies:
- esp32c6
version: 0.6.1
espressif/esp_sccb_intf:
component_hash: 44dfa738680ccbc3705ae6940f59be603165f4f7e4d05c3eb5f433705fdc92be
component_hash: c071b189e49f40940722aea01a5489f873385cc39cd5b14012341135b85d1a9d
dependencies:
- name: idf
require: private
@@ -509,7 +592,7 @@ dependencies:
source:
registry_url: https://components.espressif.com
type: service
version: 0.0.7
version: 0.0.8
espressif/esp_video:
component_hash: fbad1178f39cb5a81ed808c460c851b911a9858db833e2e667ada988022c0660
dependencies:
@@ -560,18 +643,8 @@ dependencies:
- esp32c6
- esp32c61
version: 1.3.1
espressif/freetype:
component_hash: cd5e2d8458e6e8d73f1120ac474467cabb669d8ea4b25050bf6a348c1e89225e
dependencies:
- name: idf
require: private
version: '>=4.4'
source:
registry_url: https://components.espressif.com
type: service
version: 2.13.3~1
espressif/i2c_bus:
component_hash: 4e990dc11734316186b489b362c61d41f23f79d58bc169795cec215e528cba14
component_hash: 804ec068d163570fd367b279a310ca383484630d2310c586b50def0bcf21de13
dependencies:
- name: espressif/cmake_utilities
registry_url: https://components.espressif.com
@@ -583,7 +656,65 @@ dependencies:
source:
registry_url: https://components.espressif.com
type: service
version: 1.5.0
version: 1.5.1
espressif/iot_eth:
component_hash: ffcea72f079264b6905e428a406cb6d2512dfede10d100c49d3486dd78dc1873
dependencies:
- name: espressif/cmake_utilities
registry_url: https://components.espressif.com
require: private
version: '*'
- name: idf
require: private
version: '>=4.4'
source:
registry_url: https://components.espressif.com
type: service
version: 0.1.0
espressif/iot_usbh_cdc:
component_hash: 6b30e8eeef1a3320a3bc0c27980c62826ed134b681be6f424366f3d78c291814
dependencies:
- name: idf
require: private
version: '>=5.1'
- name: espressif/cmake_utilities
registry_url: https://components.espressif.com
require: private
version: '*'
source:
registry_url: https://components.espressif.com
type: service
targets:
- esp32s2
- esp32s3
- esp32p4
version: 3.0.0
espressif/iot_usbh_rndis:
component_hash: 0d91d9c79980fe0d2b59ecae9341d91852b7eb3356cc0e708f76425a3604ff5b
dependencies:
- name: espressif/cmake_utilities
registry_url: https://components.espressif.com
require: private
version: '*'
- name: espressif/iot_eth
registry_url: https://components.espressif.com
require: public
version: '*'
- name: espressif/iot_usbh_cdc
registry_url: https://components.espressif.com
require: public
version: ^3.0
- name: idf
require: private
version: '>=5.2'
source:
registry_url: https://components.espressif.com/
type: service
targets:
- esp32s2
- esp32s3
- esp32p4
version: 0.3.1
espressif/knob:
component_hash: 138ed090b4c9090a0a678f695b9d1884b368130c729b7333ed35bd7f4e8da80e
dependencies:
@@ -599,7 +730,7 @@ dependencies:
type: service
version: 1.0.2
espressif/led_strip:
component_hash: f0d1b7f93eb3ee57bcfd220656176b0b5616e1947f89ed44364555cf910c4840
component_hash: 28621486f77229aaf81c71f5e15d6fbf36c2949cf11094e07090593e659e7639
dependencies:
- name: idf
require: private
@@ -607,7 +738,7 @@ dependencies:
source:
registry_url: https://components.espressif.com/
type: service
version: 3.0.2
version: 3.0.3
espressif/usb_host_uvc:
component_hash: b0cb9a3a2eaa09dc6e5cc3e47e04d0a73e47c2d3dcfb3afce959224a1fe5fb5e
dependencies:
@@ -631,32 +762,6 @@ dependencies:
- esp32h4
- linux
version: 2.3.1
espressif2022/esp_emote_gfx:
component_hash: 67986ead33c11de895eb7ba9a069ea89949ec911ce7cf0989478cc9da2e54735
dependencies:
- name: espressif/cmake_utilities
registry_url: https://components.espressif.com
require: private
version: 0.*
- name: espressif/esp_new_jpeg
registry_url: https://components.espressif.com
require: public
version: 0.6.*
- name: espressif/freetype
registry_url: https://components.espressif.com
require: private
version: 2.*
- name: idf
require: private
version: '>=5.0'
- name: lvgl/lvgl
registry_url: https://components.espressif.com
require: public
version: '*'
source:
registry_url: https://components.espressif.com/
type: service
version: 2.0.0
espressif2022/image_player:
component_hash: 0e42ed1c9665debd15f2f3e7e56519100e75e446410962226cb5e5402da3fa43
dependencies:
@@ -674,14 +779,14 @@ dependencies:
idf:
source:
type: idf
version: 5.5.1
version: 5.5.4
lvgl/lvgl:
component_hash: b702d642e03e95928046d5c6726558e6444e112420c77efa5fdb6650b0a13c5d
component_hash: 17e68bfd21f0edf4c3ee838e2273da840bf3930e5dbc3bfa6c1190c3aed41f9f
dependencies: []
source:
registry_url: https://components.espressif.com/
type: service
version: 9.3.0
version: 9.4.0
tny-robotics/sh1106-esp-idf:
component_hash: 7be190d7c58cd635adf8b74b3a841f8245f2f82f36d135a64d8e53cfab39124d
dependencies: []
@@ -690,7 +795,7 @@ dependencies:
type: service
version: 1.0.0
txp666/otto-emoji-gif-component:
component_hash: 5a722dd0a40014b31d5998ea5b21f0b53a99d1025626d765d08710b47636ee97
component_hash: 8da812ae44707af319a20e164e8b544199fe401436167c206e684594e0a38c5d
dependencies:
- name: lvgl/lvgl
registry_url: https://components.espressif.com
@@ -699,7 +804,21 @@ dependencies:
source:
registry_url: https://components.espressif.com/
type: service
version: 1.0.4
version: 1.1.1
waveshare/custom_io_expander_ch32v003:
component_hash: fefced27c762ed97a3523c9d90d66050deea7eeb7e9eae6328e4ab1a71125d26
dependencies:
- name: espressif/esp_io_expander
registry_url: https://components.espressif.com
require: public
version: ^1.0.1
- name: idf
require: private
version: '>=5.3'
source:
registry_url: https://components.espressif.com/
type: service
version: 1.0.1
waveshare/esp_lcd_sh8601:
component_hash: 1a2829e9db4e0515bad6ce83368f199dec60519fbba40251d6c8249f5d070ae1
dependencies:
@@ -744,22 +863,25 @@ dependencies:
version: 1.0.2
direct_dependencies:
- 78/esp-ml307
- 78/esp-opus-encoder
- 78/esp-wifi-connect
- 78/esp_lcd_nv3023
- 78/uart-eth-modem
- 78/xiaozhi-fonts
- espressif/adc_battery_estimation
- espressif/adc_mic
- espressif/bmi270_sensor
- espressif/button
- espressif/cmake_utilities
- espressif/dl_fft
- espressif/esp-dsp
- espressif/esp-sr
- espressif/esp32-camera
- espressif/esp_audio_codec
- espressif/esp_audio_effects
- espressif/esp_codec_dev
- espressif/esp_image_effects
- espressif/esp_io_expander_tca9554
- espressif/esp_io_expander_tca95xx_16bit
- espressif/esp_lcd_axs15231b
- espressif/esp_lcd_co5300
- espressif/esp_lcd_gc9a01
- espressif/esp_lcd_ili9341
- espressif/esp_lcd_panel_io_additions
@@ -776,17 +898,18 @@ direct_dependencies:
- espressif/esp_mmap_assets
- espressif/esp_new_jpeg
- espressif/esp_video
- espressif/iot_usbh_rndis
- espressif/knob
- espressif/led_strip
- espressif2022/esp_emote_gfx
- espressif2022/image_player
- idf
- lvgl/lvgl
- tny-robotics/sh1106-esp-idf
- txp666/otto-emoji-gif-component
- waveshare/custom_io_expander_ch32v003
- waveshare/esp_lcd_sh8601
- waveshare/esp_lcd_touch_cst9217
- wvirgil123/sscma_client
manifest_hash: 58298729f89f9edb041dac03ee9a91c4f6f97f277634f6349f91981c9b4b715f
manifest_hash: 350e17991f1a3226438480b027525b7cde67c34ed4ec6c5847cdfcb22e18dc4a
target: esp32s3
version: 2.0.0
+90 -16
View File
@@ -23,6 +23,7 @@ list(APPEND STACK_CHAN_SOURCES main.cpp)
# Define source files
set(SOURCES "audio/audio_codec.cc"
"audio/audio_service.cc"
"audio/demuxer/ogg_demuxer.cc"
"audio/codecs/no_audio_codec.cc"
"audio/codecs/box_audio_codec.cc"
"audio/codecs/es8311_audio_codec.cc"
@@ -38,7 +39,7 @@ set(SOURCES "audio/audio_codec.cc"
"display/lcd_display.cc"
"display/oled_display.cc"
"display/lvgl_display/lvgl_display.cc"
"display/emote_display.cc"
# "display/emote_display.cc"
"display/lvgl_display/emoji_collection.cc"
"display/lvgl_display/lvgl_theme.cc"
"display/lvgl_display/lvgl_font.cc"
@@ -63,15 +64,34 @@ set(SOURCES "audio/audio_codec.cc"
# Transform relative paths to absolute paths from xiaozhi-esp32/main
list(TRANSFORM SOURCES PREPEND "${XIAOZHI_MAIN_DIR}/")
set(INCLUDE_DIRS "." "display" "display/lvgl_display" "display/lvgl_display/jpg" "audio" "protocols")
set(INCLUDE_DIRS "." "display" "display/lvgl_display" "display/lvgl_display/jpg" "audio" "audio/demuxer" "protocols")
# Transform include dirs to absolute paths from xiaozhi-esp32/main
list(TRANSFORM INCLUDE_DIRS PREPEND "${XIAOZHI_MAIN_DIR}/")
# Add board common files
file(GLOB BOARD_COMMON_SOURCES ${XIAOZHI_MAIN_DIR}/boards/common/*.cc)
list(APPEND SOURCES ${BOARD_COMMON_SOURCES} ${STACK_CHAN_SOURCES})
list(APPEND SOURCES
"${XIAOZHI_MAIN_DIR}/boards/common/board.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/wifi_board.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/ml307_board.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/nt26_board.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/dual_network_board.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/adc_battery_monitor.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/afsk_demod.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/axp2101.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/backlight.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/button.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/i2c_device.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/knob.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/power_save_timer.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/press_to_talk_mcp_tool.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/sleep_timer.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/sy6970.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/system_reset.cc"
${STACK_CHAN_SOURCES}
)
list(APPEND INCLUDE_DIRS ${XIAOZHI_MAIN_DIR}/boards/common ${STACK_CHAN_INCLUDE_DIRS})
idf_build_get_property(build_components BUILD_COMPONENTS)
# Function to find component dynamically by pattern
function(find_component_by_pattern PATTERN COMPONENT_VAR PATH_VAR)
@@ -89,6 +109,8 @@ endfunction()
set(BUILTIN_TEXT_FONT font_puhui_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
set(EMOTE_RESOLUTION "320_240")
# Add board files according to BOARD_TYPE
# Set default assets if the board uses partition table V2
if(CONFIG_BOARD_TYPE_M5STACK_STACK_CHAN)
@@ -98,10 +120,17 @@ if(CONFIG_BOARD_TYPE_M5STACK_STACK_CHAN)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
endif()
file(GLOB BOARD_SOURCES
${XIAOZHI_MAIN_DIR}/boards/${BOARD_TYPE}/*.cc
${XIAOZHI_MAIN_DIR}/boards/${BOARD_TYPE}/*.c
)
if(MANUFACTURER)
file(GLOB BOARD_SOURCES
${XIAOZHI_MAIN_DIR}/boards/${MANUFACTURER}/${BOARD_TYPE}/*.cc
${XIAOZHI_MAIN_DIR}/boards/${MANUFACTURER}/${BOARD_TYPE}/*.c
)
else()
file(GLOB BOARD_SOURCES
${XIAOZHI_MAIN_DIR}/boards/${BOARD_TYPE}/*.cc
${XIAOZHI_MAIN_DIR}/boards/${BOARD_TYPE}/*.c
)
endif()
list(APPEND SOURCES ${BOARD_SOURCES})
# Select audio processor according to Kconfig
@@ -119,7 +148,7 @@ endif()
# Auto Select Additional Sources
if (CONFIG_USE_ESP_BLUFI_WIFI_PROVISIONING)
list(APPEND SOURCES "${XIAOZHI_MAIN_DIR}/boards/common/blufi.cpp")
list(APPEND SOURCES "boards/common/blufi.cpp")
endif ()
# Select language directory according to Kconfig
if(CONFIG_LANGUAGE_ZH_CN)
@@ -228,7 +257,7 @@ if(NOT LANG_DIR STREQUAL "en-US")
endforeach()
endif()
# file(GLOB COMMON_SOUNDS ${XIAOZHI_MAIN_DIR}/assets/common/*.ogg)
# file(GLOB COMMON_SOUNDS ${CMAKE_CURRENT_SOURCE_DIR}/assets/common/*.ogg)
file(GLOB COMMON_SOUNDS
${XIAOZHI_MAIN_DIR}/assets/common/*.ogg
assets/sfx/*.ogg
@@ -240,16 +269,53 @@ if(CONFIG_IDF_TARGET_ESP32)
"audio/codecs/es8388_audio_codec.cc"
"audio/codecs/es8389_audio_codec.cc"
"led/gpio_led.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/esp32_camera.cc"
"display/lvgl_display/jpg/image_to_jpeg.cpp"
"display/lvgl_display/jpg/jpeg_to_image.c"
"boards/common/nt26_board.cc"
"boards/common/ml307_board.cc"
"boards/common/dual_network_board.cc"
)
endif()
# Include EspVideo if target is ESP32S3 or ESP32P4
if(CONFIG_IDF_TARGET_ESP32S3 OR CONFIG_IDF_TARGET_ESP32P4)
list(APPEND SOURCES "${XIAOZHI_MAIN_DIR}/boards/common/esp_video.cc"
"${XIAOZHI_MAIN_DIR}/boards/common/rndis_board.cc"
)
endif()
# Include Esp32Camera if target is ESP32S3
if(CONFIG_IDF_TARGET_ESP32S3)
list(APPEND SOURCES "${XIAOZHI_MAIN_DIR}/boards/common/esp32_camera.cc")
endif()
idf_component_register(SRCS ${SOURCES}
EMBED_FILES ${LANG_SOUNDS} ${COMMON_SOUNDS}
INCLUDE_DIRS ${INCLUDE_DIRS}
WHOLE_ARCHIVE
PRIV_REQUIRES
esp_pm
esp_psram
esp_netif
esp_driver_gpio
esp_driver_uart
esp_driver_spi
esp_driver_i2c
esp_driver_i2s
esp_driver_jpeg
esp_driver_ppa
esp_app_format
app_update
spi_flash
console
efuse
bt
fatfs
ArduinoJson
esp-now
mooncake
mooncake_log
smooth_ui_toolkit
)
# Use target_compile_definitions to define BOARD_TYPE, BOARD_NAME
@@ -265,12 +331,12 @@ target_compile_definitions(${COMPONENT_LIB}
# Add generation rules
add_custom_command(
OUTPUT ${LANG_HEADER}
COMMAND python ${PROJECT_DIR}/xiaozhi-esp32/scripts/gen_lang.py
COMMAND python ${XIAOZHI_MAIN_DIR}/../scripts/gen_lang.py
--language "${LANG_DIR}"
--output "${LANG_HEADER}"
DEPENDS
${LANG_JSON}
${PROJECT_DIR}/xiaozhi-esp32/scripts/gen_lang.py
${XIAOZHI_MAIN_DIR}/../scripts/gen_lang.py
COMMENT "Generating ${LANG_DIR} language config"
)
@@ -328,7 +394,7 @@ endforeach()
endif()
set(DEFAULT_ASSETS_EXTRA_FILES "${CMAKE_CURRENT_SOURCE_DIR}/assets/assets_bin")
set(DEFAULT_ASSETS_EXTRA_FILES "${CMAKE_CURRENT_SOURCE_DIR}/assets/assets_bin")
# Function to build default assets based on configuration
function(build_default_assets_bin)
@@ -362,10 +428,10 @@ function(build_default_assets_bin)
# Create custom command to build assets
add_custom_command(
OUTPUT ${GENERATED_ASSETS_BIN}
COMMAND python ${PROJECT_DIR}/xiaozhi-esp32/scripts/build_default_assets.py ${BUILD_ARGS}
COMMAND python ${XIAOZHI_MAIN_DIR}/../scripts/build_default_assets.py ${BUILD_ARGS}
DEPENDS
${SDKCONFIG}
${PROJECT_DIR}/xiaozhi-esp32/scripts/build_default_assets.py
${XIAOZHI_MAIN_DIR}/../scripts/build_default_assets.py
COMMENT "Building default assets.bin based on configuration"
VERBATIM
)
@@ -452,6 +518,14 @@ if ("${size}" AND "${offset}")
get_assets_local_file("${CONFIG_CUSTOM_ASSETS_FILE}" ASSETS_LOCAL_FILE)
esptool_py_flash_to_partition(flash "assets" "${ASSETS_LOCAL_FILE}")
message(STATUS "Custom assets flash configured: ${ASSETS_LOCAL_FILE} -> assets partition")
elseif(CONFIG_FLASH_EXPRESSION_ASSETS)
set(ASSETS_NAME "expression_assets")
set(ASSETS_PARTITION "assets")
set(ASSETS_FILE "${CMAKE_BINARY_DIR}/${ASSETS_NAME}.bin")
build_speaker_assets_bin("${ASSETS_PARTITION}" ${EMOTE_RESOLUTION} ${ASSETS_FILE} ${CONFIG_MMAP_FILE_NAME_LENGTH})
message(STATUS "Generated emote assets: ${ASSETS_FILE} -> ${ASSETS_PARTITION} partition")
esptool_py_flash_to_partition(flash "${ASSETS_PARTITION}" "${ASSETS_FILE}")
elseif(CONFIG_FLASH_NONE_ASSETS)
message(STATUS "Assets flashing disabled (FLASH_NONE_ASSETS)")
endif()
+138 -43
View File
@@ -8,7 +8,8 @@ config OTA_URL
choice
prompt "Flash Assets"
default FLASH_DEFAULT_ASSETS
default FLASH_DEFAULT_ASSETS if !USE_EMOTE_MESSAGE_STYLE
default FLASH_EXPRESSION_ASSETS if USE_EMOTE_MESSAGE_STYLE
help
Select the assets to flash.
@@ -16,8 +17,12 @@ choice
bool "Do not flash assets"
config FLASH_DEFAULT_ASSETS
bool "Flash Default Assets"
depends on !USE_EMOTE_MESSAGE_STYLE
config FLASH_CUSTOM_ASSETS
bool "Flash Custom Assets"
config FLASH_EXPRESSION_ASSETS
bool "Flash Emote Assets"
depends on USE_EMOTE_MESSAGE_STYLE
endchoice
config CUSTOM_ASSETS_FILE
@@ -129,6 +134,9 @@ choice BOARD_TYPE
config BOARD_TYPE_BREAD_COMPACT_ML307
bool "Bread Compact ML307/EC801E (面包板 4G)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_BREAD_COMPACT_NT26
bool "Bread Compact NT26 (面包板 4G)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_BREAD_COMPACT_ESP32
bool "Bread Compact ESP32 DevKit (面包板)"
depends on IDF_TARGET_ESP32
@@ -147,9 +155,15 @@ choice BOARD_TYPE
config BOARD_TYPE_ESP_KORVO2_V3
bool "Espressif Korvo2 V3"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ESP_KORVO2_V3_RNDIS
bool "Espressif Korvo2 V3 RNDIS"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ESP_SPARKBOT
bool "Espressif SparkBot"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ESP_SENSAIRSHUTTLE
bool "Espressif ESP-SensairShuttle"
depends on IDF_TARGET_ESP32C5
config BOARD_TYPE_ESP_SPOT_S3
bool "Espressif Spot-S3"
depends on IDF_TARGET_ESP32S3
@@ -201,6 +215,15 @@ choice BOARD_TYPE
config BOARD_TYPE_LICHUANG_DEV_C3
bool "立创·实战派 ESP32-C3"
depends on IDF_TARGET_ESP32C3
config BOARD_TYPE_EDA_TV_PRO
bool "EDA课程案例 EDA-TV-Pro"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_EDA_ROBOT_PRO
bool "EDA课程案例 EDA-Robot-Pro"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_EDA_SUPER_BEAR
bool "EDA课程案例 EDA-Super-Bear"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_DF_K10
bool "DFRobot 行空板 k10"
depends on IDF_TARGET_ESP32S3
@@ -240,77 +263,110 @@ choice BOARD_TYPE
config BOARD_TYPE_M5STACK_ATOM_ECHOS3R
bool "M5Stack AtomEchoS3R"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_M5STACK_CARDPUTER_ADV
bool "M5Stack Cardputer Adv"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_M5STACK_ATOM_MATRIX_ECHO_BASE
bool "M5Stack AtomMatrix + Echo Base"
depends on IDF_TARGET_ESP32
config BOARD_TYPE_WAVESHARE_S3_AUDIO_BOARD
config BOARD_TYPE_WAVESHARE_ESP32_TOUCH_LCD_3_5
bool "Waveshare ESP32-Touch-LCD-3.5"
depends on IDF_TARGET_ESP32
config BOARD_TYPE_WAVESHARE_ESP32_S3_AUDIO_BOARD
bool "Waveshare ESP32-S3-Audio-Board"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_AMOLED_1_8
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_1_8
bool "Waveshare ESP32-S3-Touch-AMOLED-1.8"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_AMOLED_2_06
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_2_06
bool "Waveshare ESP32-S3-Touch-AMOLED-2.06"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_C6_TOUCH_AMOLED_2_06
config BOARD_TYPE_WAVESHARE_ESP32_C6_TOUCH_AMOLED_2_06
bool "Waveshare ESP32-C6-Touch-AMOLED-2.06"
depends on IDF_TARGET_ESP32C6
config BOARD_TYPE_WAVESHARE_S3_TOUCH_AMOLED_1_75
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_1_75
bool "Waveshare ESP32-S3-Touch-AMOLED-1.75"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_1_83
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_1_75C
bool "Waveshare ESP32-S3-Touch-AMOLED-1.75C"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_1_83
bool "Waveshare ESP32-S3-Touch-LCD-1.83"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_4B
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_4B
bool "Waveshare ESP32-S3-Touch-LCD-4B"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_1_85C
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_4_3C
bool "Waveshare ESP32-S3-Touch-LCD-4.3C"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_1_85C
bool "Waveshare ESP32-S3-Touch-LCD-1.85C"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_1_85
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_1_85
bool "Waveshare ESP32-S3-Touch-LCD-1.85"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_1_46
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_1_46
bool "Waveshare ESP32-S3-Touch-LCD-1.46"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_C6_LCD_1_69
config BOARD_TYPE_WAVESHARE_ESP32_C6_LCD_1_69
bool "Waveshare ESP32-C6-LCD-1.69"
depends on IDF_TARGET_ESP32C6
config BOARD_TYPE_WAVESHARE_C6_TOUCH_LCD_1_83
config BOARD_TYPE_WAVESHARE_ESP32_C6_TOUCH_LCD_1_83
bool "Waveshare ESP32-C6-Touch-LCD-1.83"
depends on IDF_TARGET_ESP32C6
config BOARD_TYPE_WAVESHARE_C6_TOUCH_AMOLED_1_43
config BOARD_TYPE_WAVESHARE_ESP32_C6_TOUCH_AMOLED_1_43
bool "Waveshare ESP32-C6-Touch-AMOLOED-1.43"
depends on IDF_TARGET_ESP32C6
config BOARD_TYPE_WAVESHARE_C6_TOUCH_AMOLED_1_32
config BOARD_TYPE_WAVESHARE_ESP32_C6_TOUCH_AMOLED_1_32
bool "Waveshare ESP32-C6-Touch-AMOLOED-1.32"
depends on IDF_TARGET_ESP32C6
config BOARD_TYPE_WAVESHARE_S3_TOUCH_AMOLED_1_32
config BOARD_TYPE_WAVESHARE_ESP32_C6_TOUCH_AMOLED_1_8
bool "Waveshare ESP32-C6-Touch-AMOLED-1.8"
depends on IDF_TARGET_ESP32C6
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_1_32
bool "Waveshare ESP32-S3-Touch-AMOLOED-1.32"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_3_49
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_3_49
bool "Waveshare ESP32-S3-Touch-LCD-3.49"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_3_5
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_3_5
bool "Waveshare ESP32-S3-Touch-LCD-3.5"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_ePaper_1_54
bool "Waveshare ESP32-S3-ePaper-1.54"
config BOARD_TYPE_WAVESHARE_ESP32_S3_ePaper_1_54_v1
bool "Waveshare ESP32-S3-ePaper-1.54_v1"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_3_5B
config BOARD_TYPE_WAVESHARE_ESP32_S3_ePaper_1_54_v2
bool "Waveshare ESP32-S3-ePaper-1.54_v2"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_ESP32_S3_RLCD_4_2
bool "Waveshare ESP32-S3-RLCD-4.2"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_3_5B
bool "Waveshare ESP32-S3-Touch-LCD-3.5B"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WAVESHARE_P4_NANO
config BOARD_TYPE_WAVESHARE_ESP32_P4_NANO
bool "Waveshare ESP32-P4-NANO"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_WAVESHARE_P4_WIFI6_TOUCH_LCD_4B
config BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_4B
bool "Waveshare ESP32-P4-WIFI6-Touch-LCD-4B"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_WAVESHARE_P4_WIFI6_TOUCH_LCD_7B
config BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_7B
bool "Waveshare ESP32-P4-WIFI6-Touch-LCD-7B"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_WAVESHARE_P4_WIFI6_TOUCH_LCD_XC
bool "Waveshare ESP32-P4-WIFI6-Touch-LCD-3.4C or ESP32-P4-WIFI6-Touch-LCD-4C"
config BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_3_4C
bool "Waveshare ESP32-P4-WIFI6-Touch-LCD-3.4C"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_4C
bool "Waveshare ESP32-P4-WIFI6-Touch-LCD-4C"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_7
bool "Waveshare ESP32-P4-WIFI6-Touch-LCD-7"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_8
bool "Waveshare ESP32-P4-WIFI6-Touch-LCD-8"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_10_1
bool "Waveshare ESP32-P4-WIFI6-Touch-LCD-10.1"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_TUDOUZI
bool "土豆子"
@@ -390,6 +446,9 @@ choice BOARD_TYPE
config BOARD_TYPE_XINGZHI_METAL_1_54_WIFI
bool "无名科技星智1.54 METAL(wifi)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_XINGZHI_ABS_2_0
bool "无名科技星智ABS 2.0"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_SEEED_STUDIO_SENSECAP_WATCHER
bool "Seeed Studio SenseCAP Watcher"
depends on IDF_TARGET_ESP32S3
@@ -414,6 +473,12 @@ choice BOARD_TYPE
config BOARD_TYPE_ZHENGCHEN_1_54TFT_ML307
bool "征辰科技1.54(ML307)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ZHENGCHEN_CAM
bool "征辰科技AI Camera"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ZHENGCHEN_CAM_ML307
bool "征辰科技AI Camera(ML307)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_MINSI_K08_DUAL
bool "敏思科技K08(DUAL)"
depends on IDF_TARGET_ESP32S3
@@ -486,7 +551,7 @@ choice ESP_S3_LCD_EV_Board_Version_TYPE
endchoice
choice DISPLAY_OLED_TYPE
depends on BOARD_TYPE_BREAD_COMPACT_WIFI || BOARD_TYPE_BREAD_COMPACT_ML307 || BOARD_TYPE_BREAD_COMPACT_ESP32 || BOARD_TYPE_HU_087
depends on BOARD_TYPE_BREAD_COMPACT_WIFI || BOARD_TYPE_BREAD_COMPACT_ML307 || BOARD_TYPE_BREAD_COMPACT_NT26 || BOARD_TYPE_BREAD_COMPACT_ESP32 || BOARD_TYPE_HU_087
prompt "OLED Type"
default OLED_SSD1306_128X32
help
@@ -500,7 +565,7 @@ choice DISPLAY_OLED_TYPE
endchoice
choice DISPLAY_LCD_TYPE
depends on BOARD_TYPE_BREAD_COMPACT_WIFI_LCD || BOARD_TYPE_BREAD_COMPACT_ESP32_LCD || BOARD_TYPE_CGC || BOARD_TYPE_WAVESHARE_P4_NANO || BOARD_TYPE_WAVESHARE_P4_WIFI6_TOUCH_LCD_XC || BOARD_TYPE_BREAD_COMPACT_WIFI_CAM
depends on BOARD_TYPE_BREAD_COMPACT_WIFI_LCD || BOARD_TYPE_BREAD_COMPACT_ESP32_LCD || BOARD_TYPE_CGC || BOARD_TYPE_BREAD_COMPACT_WIFI_CAM
prompt "LCD Type"
default LCD_ST7789_240X320
help
@@ -535,20 +600,12 @@ choice DISPLAY_LCD_TYPE
bool "ILI9341 240*320, Non-IPS"
config LCD_GC9A01_240X240
bool "GC9A01 240*240 Circle"
config LCD_TYPE_800_1280_10_1_INCH
bool "Waveshare 101M-8001280-IPS-CT-K Display"
config LCD_TYPE_800_1280_10_1_INCH_A
bool "Waveshare 10.1-DSI-TOUCH-A Display"
config LCD_TYPE_800_800_3_4_INCH
bool "Waveshare ESP32-P4-WIFI6-Touch-LCD-3.4C with 800*800 3.4inch round display"
config LCD_TYPE_720_720_4_INCH
bool "Waveshare ESP32-P4-WIFI6-Touch-LCD-4C with 720*720 4inch round display"
config LCD_CUSTOM
bool "Custom LCD (自定义屏幕参数)"
endchoice
choice DISPLAY_ESP32S3_KORVO2_V3
depends on BOARD_TYPE_ESP_KORVO2_V3
depends on BOARD_TYPE_ESP_KORVO2_V3 || BOARD_TYPE_ESP_KORVO2_V3_RNDIS
prompt "ESP32S3_KORVO2_V3 LCD Type"
default ESP32S3_KORVO2_V3_LCD_ST7789
help
@@ -560,7 +617,7 @@ choice DISPLAY_ESP32S3_KORVO2_V3
endchoice
choice DISPLAY_ESP32S3_AUDIO_BOARD
depends on BOARD_TYPE_WAVESHARE_S3_AUDIO_BOARD
depends on BOARD_TYPE_WAVESHARE_ESP32_S3_AUDIO_BOARD
prompt "ESP32S3_AUDIO_BOARD LCD Type"
default AUDIO_BOARD_LCD_JD9853
help
@@ -571,6 +628,19 @@ choice DISPLAY_ESP32S3_AUDIO_BOARD
bool "ST7789 240*320"
endchoice
choice DISPLAY_ESP32S3_TOUCH_LCD_1_85C
depends on BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_1_85C
prompt "ESP32S3_TOUCH_LCD_1_85C version"
default VERSION_2_0
help
hardware version
config VERSION_1_0
bool "version 1.0"
config VERSION_2_0
bool "version 2.0"
endchoice
choice DISPLAY_STYLE
prompt "Select display style"
default USE_DEFAULT_MESSAGE_STYLE
@@ -585,9 +655,22 @@ choice DISPLAY_STYLE
config USE_EMOTE_MESSAGE_STYLE
bool "Emote animation style"
depends on BOARD_TYPE_ESP_BOX_3 || BOARD_TYPE_ECHOEAR || BOARD_TYPE_LICHUANG_DEV_S3
depends on BOARD_TYPE_ESP_BOX || BOARD_TYPE_ESP_BOX_3 \
|| BOARD_TYPE_ECHOEAR || BOARD_TYPE_LICHUANG_DEV_S3 \
|| BOARD_TYPE_ESP_SENSAIRSHUTTLE
endchoice
config USE_MULTILINE_CHAT_MESSAGE
bool "Use multiline chat message display (default mode only)"
depends on USE_DEFAULT_MESSAGE_STYLE
default n
help
When enabled, the chat message area in the default display mode shows
multiple wrapped lines that grow upward from the bottom of the screen,
with auto-adaptive height.
When disabled (default), a single-line horizontally scrolling label
is shown at the bottom of the screen.
choice WAKE_WORD_TYPE
prompt "Wake Word Implementation Type"
default USE_AFE_WAKE_WORD if (IDF_TARGET_ESP32S3 || IDF_TARGET_ESP32P4) && SPIRAM
@@ -649,6 +732,16 @@ config SEND_WAKE_WORD_DATA
help
Send wake word data to the server as the first message of the conversation and wait for response
config WAKE_WORD_DETECTION_IN_LISTENING
bool "Enable Wake Word Detection in Listening Mode"
default n
depends on USE_AFE_WAKE_WORD || USE_CUSTOM_WAKE_WORD
help
Enable wake word detection while in listening mode.
When enabled, the device can detect wake word during listening,
which allows interrupting the current conversation.
When disabled (default), wake word detection is turned off during listening.
config USE_AUDIO_PROCESSOR
bool "Enable Audio Noise Reduction"
default y
@@ -660,10 +753,12 @@ config USE_DEVICE_AEC
bool "Enable Device-Side AEC"
default n
depends on USE_AUDIO_PROCESSOR && (BOARD_TYPE_ESP_BOX_3 || BOARD_TYPE_ESP_BOX || BOARD_TYPE_ESP_BOX_LITE \
|| BOARD_TYPE_LICHUANG_DEV_S3 || BOARD_TYPE_ESP_KORVO2_V3 || BOARD_TYPE_WAVESHARE_S3_TOUCH_AMOLED_1_75 || BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_1_83\
|| BOARD_TYPE_WAVESHARE_S3_TOUCH_AMOLED_2_06 || BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_4B || BOARD_TYPE_WAVESHARE_P4_WIFI6_TOUCH_LCD_4B || BOARD_TYPE_WAVESHARE_P4_WIFI6_TOUCH_LCD_7B \
|| BOARD_TYPE_WAVESHARE_P4_WIFI6_TOUCH_LCD_XC || BOARD_TYPE_ESP_S3_LCD_EV_Board_2 || BOARD_TYPE_YUNLIAO_S3 \
|| BOARD_TYPE_ECHOEAR || BOARD_TYPE_WAVESHARE_S3_TOUCH_LCD_3_49)
|| BOARD_TYPE_LICHUANG_DEV_S3 || BOARD_TYPE_ESP_KORVO2_V3 || BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_1_75|| BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_1_75C || BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_1_83\
|| BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_2_06 || BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_4B || BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_4B || BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_7B \
|| BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_3_4C || BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_4C || BOARD_TYPE_ESP_S3_LCD_EV_Board_2 || BOARD_TYPE_YUNLIAO_S3 \
|| BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_7 || BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_8 || BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_10_1 \
|| BOARD_TYPE_ECHOEAR || BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_3_49 || BOARD_TYPE_WAVESHARE_ESP32_S3_RLCD_4_2 || BOARD_TYPE_ZHENGCHEN_CAM || BOARD_TYPE_ZHENGCHEN_CAM_ML307 \
|| BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_4_3C)
help
To work properly, device-side AEC requires a clean output reference path from the speaker signal and physical acoustic isolation between the microphone and speaker.
@@ -20,7 +20,8 @@ AppAiAgent::AppAiAgent()
// Configure App name
setAppInfo().name = "AI.AGENT";
// Configure App icon
setAppInfo().icon = (void*)&icon_ai_agent;
static auto icon = assets::get_image("icon_ai_agent.bin");
setAppInfo().icon = (void*)&icon;
// Configure App theme color
static uint32_t theme_color = 0x33CC99;
setAppInfo().userData = (void*)&theme_color;
@@ -0,0 +1,125 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#include "app_app_center.h"
#include <hal/hal.h>
#include <mooncake.h>
#include <mooncake_log.h>
#include <assets/assets.h>
#include <apps/common/common.h>
#include <memory>
using namespace mooncake;
using namespace smooth_ui_toolkit::lvgl_cpp;
AppAppCenter::AppAppCenter()
{
// 配置 App 名
setAppInfo().name = "APP.CENTER";
// 配置 App 图标
static auto icon = assets::get_image("icon_app_center.bin");
setAppInfo().icon = (void*)&icon;
// 配置 App 主题颜色
static uint32_t theme_color = 0xF4A354;
setAppInfo().userData = (void*)&theme_color;
}
void AppAppCenter::onCreate()
{
mclog::tagInfo(getAppInfo().name, "on create");
}
void AppAppCenter::onOpen()
{
mclog::tagInfo(getAppInfo().name, "on open");
// Create loading page
std::unique_ptr<view::LoadingPage> loading_page;
{
LvglLockGuard lock;
loading_page = std::make_unique<view::LoadingPage>(0xF4A354, 0x332609);
}
// Start network
GetHAL().startNetwork([&](std::string_view msg) {
LvglLockGuard lock;
loading_page->setMessage(msg);
});
// Fetch app list
{
LvglLockGuard lock;
loading_page->setMessage("Fetching app list...");
}
_app_list = GetHAL().fetchAppList();
LvglLockGuard lock;
// Destroy loading page
loading_page.reset();
_app_list_page = std::make_unique<view::AppListPage>(_app_list);
view::create_home_indicator([&]() { close(); }, 0xFFDF9A, 0x47330A);
view::create_status_bar(0xFFDF9A, 0x47330A);
}
void AppAppCenter::onRunning()
{
if (_launch_requested) {
GetHAL().launchApp(_app_list[_selected_index].firmwareUrl, [&](int percent) {
LvglLockGuard lock;
if (_app_install_page) {
_app_install_page->setProgress(percent);
}
});
}
LvglLockGuard lock;
if (_app_list_page) {
_selected_index = _app_list_page->isSelected();
if (_selected_index >= 0) {
mclog::tagInfo(getAppInfo().name, "selected index: {}", _selected_index);
_app_list_page.reset();
_app_detail_page = std::make_unique<view::AppDetailPage>(_app_list[_selected_index]);
}
}
if (_app_detail_page) {
if (_app_detail_page->checkBack()) {
mclog::tagInfo(getAppInfo().name, "back to app list");
_app_detail_page.reset();
_app_list_page = std::make_unique<view::AppListPage>(_app_list);
} else if (_app_detail_page->checkLaunch()) {
mclog::tagInfo(getAppInfo().name, "launch app");
_app_detail_page.reset();
_app_install_page = std::make_unique<view::AppInstallPage>(_app_list[_selected_index]);
_launch_requested = true;
}
}
view::update_home_indicator();
view::update_status_bar();
}
void AppAppCenter::onClose()
{
mclog::tagInfo(getAppInfo().name, "on close");
LvglLockGuard lock;
_app_list.clear();
_app_list_page.reset();
_app_detail_page.reset();
_app_install_page.reset();
_selected_index = -1;
_launch_requested = false;
view::destroy_home_indicator();
view::destroy_status_bar();
GetHAL().requestWarmReboot(3);
}
@@ -0,0 +1,31 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#pragma once
#include "view/view.h"
#include <mooncake.h>
/**
* @brief 派生 App
*
*/
class AppAppCenter : public mooncake::AppAbility {
public:
AppAppCenter();
// 重写生命周期回调
void onCreate() override;
void onOpen() override;
void onRunning() override;
void onClose() override;
private:
std::vector<app_center::AppInfo_t> _app_list;
std::unique_ptr<view::AppListPage> _app_list_page;
std::unique_ptr<view::AppDetailPage> _app_detail_page;
std::unique_ptr<view::AppInstallPage> _app_install_page;
int _selected_index = -1;
bool _launch_requested = false;
};
@@ -0,0 +1,278 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <hal/hal.h>
#include <smooth_lvgl.hpp>
#include <uitk/short_namespace.hpp>
#include <assets/assets.h>
#include <mooncake_log.h>
#include <functional>
#include <vector>
#include <string>
#include <memory>
namespace view {
/**
* @brief
*
*/
class AppListPage {
public:
AppListPage(const app_center::AppInfoList_t& app_list)
{
_panel = std::make_unique<uitk::lvgl_cpp::Container>(lv_screen_active());
_panel->setSize(320, 240);
_panel->setAlign(LV_ALIGN_CENTER);
_panel->setBgColor(lv_color_hex(0xFFFAD6));
_panel->setFlexFlow(LV_FLEX_FLOW_COLUMN);
_panel->setFlexAlign(LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
_panel->setPadding(52, 72, 0, 0);
_panel->setPadRow(18);
_panel->setRadius(0);
_panel->setBorderWidth(0);
_panel->setScrollbarMode(LV_SCROLLBAR_MODE_ACTIVE);
_bg_image = assets::get_image("app_center_bg.png");
if (_bg_image.data_size != 0) {
lv_obj_set_style_bg_image_src(_panel->get(), &_bg_image, LV_PART_MAIN);
}
_title_panel = std::make_unique<uitk::lvgl_cpp::Container>(lv_screen_active());
_title_panel->setSize(320, 28);
_title_panel->align(LV_ALIGN_TOP_MID, 0, 0);
_title_panel->setBgColor(lv_color_hex(0xF4A354));
_title_panel->setPadding(0, 0, 0, 0);
_title_panel->setRadius(0);
_title_panel->setBorderWidth(0);
_title_panel->setScrollbarMode(LV_SCROLLBAR_MODE_ACTIVE);
_title = std::make_unique<uitk::lvgl_cpp::Label>(*_title_panel);
_title->setText("App Center");
_title->setTextFont(&lv_font_montserrat_16);
_title->setTextColor(lv_color_hex(0xFFF8C7));
_title->align(LV_ALIGN_CENTER, 0, 0);
int index = 0;
for (const auto& app : app_list) {
auto btn = std::make_unique<uitk::lvgl_cpp::Button>(*_panel);
btn->setSize(282, 52);
btn->setRadius(18);
btn->setBorderWidth(0);
btn->setShadowWidth(0);
btn->setBgColor(lv_color_hex(0xFFDF9A));
btn->label().setText(app.name);
btn->label().setTextFont(&lv_font_montserrat_20);
btn->label().setTextColor(lv_color_hex(0x47330A));
btn->label().setLongMode(LV_LABEL_LONG_SCROLL_CIRCULAR);
btn->label().setWidth(220);
btn->label().setTextAlign(LV_TEXT_ALIGN_CENTER);
btn->label().setAlign(LV_ALIGN_CENTER);
btn->onClick().connect([this, index]() { _clicked_index = index; });
_buttons.push_back(std::move(btn));
index++;
}
}
int isSelected()
{
int temp = _clicked_index;
_clicked_index = -1;
return temp;
}
private:
std::unique_ptr<uitk::lvgl_cpp::Container> _panel;
std::unique_ptr<uitk::lvgl_cpp::Container> _title_panel;
std::unique_ptr<uitk::lvgl_cpp::Label> _title;
std::vector<std::unique_ptr<uitk::lvgl_cpp::Button>> _buttons;
lv_image_dsc_t _bg_image;
int _clicked_index = -1;
};
/**
* @brief
*
*/
class AppDetailPage {
public:
AppDetailPage(const app_center::AppInfo_t& app_info)
{
_panel = std::make_unique<uitk::lvgl_cpp::Container>(lv_screen_active());
_panel->setBgColor(lv_color_hex(0xFFFAD6));
_panel->align(LV_ALIGN_CENTER, 0, 0);
_panel->setBorderWidth(0);
_panel->setSize(320, 240);
_panel->setRadius(0);
_panel->setFlexFlow(LV_FLEX_FLOW_COLUMN);
_panel->setFlexAlign(LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
_panel->setPadding(48, 72, 0, 0);
_panel->setPadRow(18);
_panel->setScrollbarMode(LV_SCROLLBAR_MODE_ACTIVE);
_bg_image = assets::get_image("app_center_bg.png");
if (_bg_image.data_size != 0) {
lv_obj_set_style_bg_image_src(_panel->get(), &_bg_image, LV_PART_MAIN);
}
_title = std::make_unique<uitk::lvgl_cpp::Label>(*_panel);
_title->setText(app_info.name);
_title->setTextFont(&lv_font_montserrat_20);
_title->setTextColor(lv_color_hex(0x47330A));
_title->setTextAlign(LV_TEXT_ALIGN_CENTER);
_title->setLongMode(LV_LABEL_LONG_SCROLL_CIRCULAR);
_title->setWidth(220);
_title->setHeight(28);
_desc_label = std::make_unique<uitk::lvgl_cpp::Label>(*_panel);
_desc_label->setText(app_info.description);
_desc_label->setTextFont(&lv_font_montserrat_20);
_desc_label->setTextColor(lv_color_hex(0x47330A));
_desc_label->setTextAlign(LV_TEXT_ALIGN_LEFT);
_desc_label->setWidth(260);
_desc_label->setLongMode(LV_LABEL_LONG_WRAP);
_btn_container = std::make_unique<uitk::lvgl_cpp::Container>(*_panel);
_btn_container->setSize(LV_PCT(100), 80);
_btn_container->setBgOpa(LV_OPA_TRANSP);
_btn_container->setBorderWidth(0);
_btn_container->setPadding(0, 0, 0, 0);
_btn_container->setPadColumn(28);
_btn_container->setFlexFlow(LV_FLEX_FLOW_ROW);
_btn_container->setFlexAlign(LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER);
_btn_back = std::make_unique<uitk::lvgl_cpp::Button>(*_btn_container);
_btn_back->setSize(112, 48);
_btn_back->setRadius(18);
_btn_back->setBgColor(lv_color_hex(0xFFDF9A));
_btn_back->setBorderWidth(0);
_btn_back->setShadowWidth(0);
_btn_back->label().setText("Back");
_btn_back->label().setTextFont(&lv_font_montserrat_20);
_btn_back->label().setTextColor(lv_color_hex(0x47330A));
_btn_back->onClick().connect([this]() { _is_back = true; });
_btn_launch = std::make_unique<uitk::lvgl_cpp::Button>(*_btn_container);
_btn_launch->setSize(112, 48);
_btn_launch->setRadius(18);
_btn_launch->setBgColor(lv_color_hex(0xFFAC6D));
_btn_launch->setBorderWidth(0);
_btn_launch->setShadowWidth(0);
_btn_launch->label().setText("Launch");
_btn_launch->label().setTextFont(&lv_font_montserrat_20);
_btn_launch->label().setTextColor(lv_color_hex(0x47330A));
_btn_launch->onClick().connect([this]() { _is_launch = true; });
}
bool checkBack()
{
if (_is_back) {
_is_back = false;
return true;
}
return false;
}
bool checkLaunch()
{
if (_is_launch) {
_is_launch = false;
return true;
}
return false;
}
private:
std::unique_ptr<uitk::lvgl_cpp::Container> _panel;
std::unique_ptr<uitk::lvgl_cpp::Label> _title;
std::unique_ptr<uitk::lvgl_cpp::Label> _desc_label;
std::unique_ptr<uitk::lvgl_cpp::Container> _btn_container;
std::unique_ptr<uitk::lvgl_cpp::Button> _btn_back;
std::unique_ptr<uitk::lvgl_cpp::Button> _btn_launch;
lv_image_dsc_t _bg_image;
bool _is_back = false;
bool _is_launch = false;
};
/**
* @brief
*
*/
class AppInstallPage {
public:
AppInstallPage(const app_center::AppInfo_t& app_info)
{
_panel = std::make_unique<uitk::lvgl_cpp::Container>(lv_screen_active());
_panel->setBgColor(lv_color_hex(0xFFFAD6));
_panel->align(LV_ALIGN_CENTER, 0, 0);
_panel->setBorderWidth(0);
_panel->setSize(320, 240);
_panel->setRadius(0);
_panel->setPadding(0, 0, 0, 0);
_bg_image = assets::get_image("app_center_bg.png");
if (_bg_image.data_size != 0) {
lv_obj_set_style_bg_image_src(_panel->get(), &_bg_image, LV_PART_MAIN);
}
_title = std::make_unique<uitk::lvgl_cpp::Label>(*_panel);
_title->setText(app_info.name);
_title->setTextFont(&lv_font_montserrat_20);
_title->setTextColor(lv_color_hex(0x47330A));
_title->setTextAlign(LV_TEXT_ALIGN_CENTER);
_title->align(LV_ALIGN_TOP_MID, 0, 15);
_title->setLongMode(LV_LABEL_LONG_SCROLL_CIRCULAR);
_title->setWidth(220);
_title->setHeight(28);
_tips = std::make_unique<uitk::lvgl_cpp::Label>(*_panel);
_tips->setText("Downloading...");
_tips->setTextFont(&lv_font_montserrat_16);
_tips->setTextColor(lv_color_hex(0xA36135));
_tips->setTextAlign(LV_TEXT_ALIGN_CENTER);
_tips->setLongMode(LV_LABEL_LONG_SCROLL_CIRCULAR);
_tips->align(LV_ALIGN_CENTER, 0, -40);
_progress_bar = std::make_unique<uitk::lvgl_cpp::Bar>(*_panel);
_progress_bar->setSize(260, 92);
_progress_bar->setRadius(18);
_progress_bar->setRadius(0, LV_PART_INDICATOR);
_progress_bar->align(LV_ALIGN_CENTER, 0, 23);
_progress_bar->setBgColor(lv_color_hex(0xFFDF9A));
_progress_bar->setBgColor(lv_color_hex(0xFF9E5D), LV_PART_INDICATOR);
_progress_bar->setBgOpa(LV_OPA_COVER);
_progress_bar->setRange(0, 100);
_progress_bar->setValue(0);
_progress = std::make_unique<uitk::lvgl_cpp::Label>(*_panel);
_progress->setTextFont(&lv_font_montserrat_24);
_progress->setTextColor(lv_color_hex(0x47330A));
_progress->align(LV_ALIGN_CENTER, 0, 23);
_progress->setText("");
}
void setProgress(int percent)
{
_progress->setText(fmt::format("{}%", percent));
_progress_bar->setValue(percent);
}
private:
std::unique_ptr<uitk::lvgl_cpp::Container> _panel;
std::unique_ptr<uitk::lvgl_cpp::Label> _title;
std::unique_ptr<uitk::lvgl_cpp::Label> _tips;
std::unique_ptr<uitk::lvgl_cpp::Label> _progress;
std::unique_ptr<uitk::lvgl_cpp::Bar> _progress_bar;
lv_image_dsc_t _bg_image;
};
} // namespace view
+2 -1
View File
@@ -47,7 +47,8 @@ AppAvatar::AppAvatar()
// 配置 App 名
setAppInfo().name = "AVATAR";
// 配置 App 图标
setAppInfo().icon = (void*)&icon_sentinel;
static auto icon = assets::get_image("icon_sentinel.bin");
setAppInfo().icon = (void*)&icon;
// 配置 App 主题颜色
static uint32_t theme_color = 0xFF6699;
setAppInfo().userData = (void*)&theme_color;
+155
View File
@@ -0,0 +1,155 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#include "app_dance.h"
#include <hal/hal.h>
#include <mooncake.h>
#include <mooncake_log.h>
#include <stackchan/stackchan.h>
#include <apps/common/common.h>
#include <assets/assets.h>
using namespace mooncake;
using namespace stackchan;
AppDance::AppDance()
{
// 配置 App 名
setAppInfo().name = "DANCE";
// 配置 App 图标
static auto icon = assets::get_image("icon_dance.bin");
setAppInfo().icon = (void*)&icon;
// 配置 App 主题颜色
static uint32_t theme_color = 0xB77BFF;
setAppInfo().userData = (void*)&theme_color;
}
// App 被安装时会被调用
void AppDance::onCreate()
{
mclog::tagInfo(getAppInfo().name, "on create");
}
void AppDance::onOpen()
{
mclog::tagInfo(getAppInfo().name, "on open");
// Create loading page
std::unique_ptr<view::LoadingPage> loading_page;
{
LvglLockGuard lock;
loading_page = std::make_unique<view::LoadingPage>(0xB77BFF, 0x422268);
loading_page->setMessage("Starting\n BLE server...");
}
// Start BLE service
GetHAL().startBleServer();
LvglLockGuard lock;
// Destroy loading page
loading_page.reset();
// Create default avatar
auto avatar = std::make_unique<avatar::DefaultAvatar>();
avatar->init(lv_screen_active());
GetStackChan().attachAvatar(std::move(avatar));
/* ------------------------------- BLE events ------------------------------- */
GetHAL().onBleAvatarData.connect([&](const char* data) {
std::lock_guard<std::mutex> lock(_mutex);
if (_ble_avatar_data.update_flag) {
return;
}
_ble_avatar_data.update_flag = true;
_ble_avatar_data.data_ptr = (char*)data;
});
GetHAL().onBleMotionData.connect([&](const char* data) {
std::lock_guard<std::mutex> lock(_mutex);
if (_ble_motion_data.update_flag) {
return;
}
_ble_motion_data.update_flag = true;
_ble_motion_data.data_ptr = (char*)data;
});
GetHAL().onBleRgbData.connect([&](const char* data) {
std::lock_guard<std::mutex> lock(_mutex);
if (_ble_rgb_data.update_flag) {
return;
}
_ble_rgb_data.update_flag = true;
_ble_rgb_data.data_ptr = (char*)data;
});
/* ----------------------------- Common widgets ----------------------------- */
view::create_home_indicator([&]() { close(); }, 0xB77BFF, 0x422268);
view::create_status_bar(0xB77BFF, 0x422268);
}
void AppDance::onRunning()
{
std::lock_guard<std::mutex> lock(_mutex);
LvglLockGuard lvgl_lock;
if (_ble_avatar_data.update_flag) {
GetStackChan().updateAvatarFromJson(_ble_avatar_data.data_ptr);
_ble_avatar_data.update_flag = false;
_ble_avatar_data.data_ptr = nullptr;
}
if (_ble_motion_data.update_flag) {
check_auto_angle_sync_mode();
GetStackChan().updateMotionFromJson(_ble_motion_data.data_ptr);
_ble_motion_data.update_flag = false;
_ble_motion_data.data_ptr = nullptr;
}
if (_ble_rgb_data.update_flag) {
GetStackChan().updateNeonLightFromJson(_ble_rgb_data.data_ptr);
_ble_rgb_data.update_flag = false;
_ble_rgb_data.data_ptr = nullptr;
}
GetStackChan().update();
view::update_home_indicator();
view::update_status_bar();
}
void AppDance::onClose()
{
mclog::tagInfo(getAppInfo().name, "on close");
{
LvglLockGuard lock;
GetStackChan().resetAvatar();
GetHAL().onBleAvatarData.clear();
GetHAL().onBleMotionData.clear();
view::destroy_home_indicator();
view::destroy_status_bar();
}
GetHAL().requestWarmReboot(5);
}
void AppDance::check_auto_angle_sync_mode()
{
auto& motion = GetStackChan().motion();
// If far from last command, enable auto angle sync
if (GetHAL().millis() - _last_motion_cmd_tick > 2000) {
motion.setAutoAngleSyncEnabled(true);
} else {
motion.setAutoAngleSyncEnabled(false);
}
_last_motion_cmd_tick = GetHAL().millis();
}
+38
View File
@@ -0,0 +1,38 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <mooncake.h>
#include <memory>
#include <mutex>
/**
* @brief
*
*/
class AppDance : public mooncake::AppAbility {
public:
AppDance();
void onCreate() override;
void onOpen() override;
void onRunning() override;
void onClose() override;
private:
std::mutex _mutex;
struct BleHandlerData_t {
bool update_flag = false;
char* data_ptr = nullptr;
};
BleHandlerData_t _ble_avatar_data;
BleHandlerData_t _ble_motion_data;
BleHandlerData_t _ble_rgb_data;
uint32_t _last_motion_cmd_tick = 0;
void check_auto_angle_sync_mode();
};
@@ -26,7 +26,8 @@ AppEspnowControl::AppEspnowControl()
// 配置 App 名
setAppInfo().name = "ESPNOW.REMOTE";
// 配置 App 图标
setAppInfo().icon = (void*)&icon_controller;
static auto icon = assets::get_image("icon_controller.bin");
setAppInfo().icon = (void*)&icon;
// 配置 App 主题颜色
static uint32_t theme_color = 0x7ACE74;
setAppInfo().userData = (void*)&theme_color;
@@ -80,7 +80,7 @@ private:
* @param options
* @return int Selected option index
*/
static inline int create_page_selector_and_wait(std::string_view label, const std::vector<std::string> options)
static inline int create_page_selector_and_wait(std::string_view label, const std::vector<std::string>& options)
{
GetHAL().lvglLock();
auto page_selector = std::make_unique<view::PageSelector>(label, options);
@@ -0,0 +1,101 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#include "app_ezdata.h"
#include <hal/hal.h>
#include <mooncake.h>
#include <mooncake_log.h>
#include <assets/assets.h>
#include <stackchan/stackchan.h>
using namespace mooncake;
using namespace stackchan;
AppEzdata::AppEzdata()
{
// 配置 App 名
setAppInfo().name = "EZDATA";
// 配置 App 图标
static auto icon = assets::get_image("icon_ezdata.bin");
setAppInfo().icon = (void*)&icon;
// 配置 App 主题颜色
static uint32_t theme_color = 0x60A5FA;
setAppInfo().userData = (void*)&theme_color;
}
void AppEzdata::onCreate()
{
mclog::tagInfo(getAppInfo().name, "on create");
}
void AppEzdata::onOpen()
{
mclog::tagInfo(getAppInfo().name, "on open");
{
LvglLockGuard lock;
// Create default avatar
auto avatar = std::make_unique<avatar::DefaultAvatar>();
avatar->init(lv_screen_active());
GetStackChan().attachAvatar(std::move(avatar));
// Create loading page
_loading_page = std::make_unique<view::LoadingPage>(0x60A5FA, 0x072448);
}
// Start ezdata service
GetHAL().startEzDataService([&](std::string_view msg) {
LvglLockGuard lock;
_loading_page->setMessage(msg);
});
LvglLockGuard lock;
/* --------------------------------- Events --------------------------------- */
GetHAL().onEzdataPairCode.connect([this](std::string_view code) {
LvglLockGuard lock;
// Destroy loading page
_loading_page.reset();
// Client connected
if (code.empty()) {
_ezdata_guide_page.reset();
return;
}
_ezdata_guide_page = std::make_unique<view::EzdataGuidePage>(code);
});
// _ezdata_guide_page = std::make_unique<view::EzdataGuidePage>("941004");
/* ----------------------------- Common widgets ----------------------------- */
view::create_home_indicator([&]() { close(); }, 0x93C3FE, 0x072448);
view::create_status_bar(0x93C3FE, 0x072448);
}
void AppEzdata::onRunning()
{
LvglLockGuard lock;
GetStackChan().update();
view::update_home_indicator();
view::update_status_bar();
}
void AppEzdata::onClose()
{
mclog::tagInfo(getAppInfo().name, "on close");
LvglLockGuard lock;
GetStackChan().resetAvatar();
view::destroy_home_indicator();
view::destroy_status_bar();
GetHAL().requestWarmReboot(4);
}
@@ -0,0 +1,27 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#pragma once
#include "view/view.h"
#include <mooncake.h>
#include <apps/common/common.h>
/**
* @brief 派生 App
*
*/
class AppEzdata : public mooncake::AppAbility {
public:
AppEzdata();
void onCreate() override;
void onOpen() override;
void onRunning() override;
void onClose() override;
private:
std::unique_ptr<view::LoadingPage> _loading_page;
std::unique_ptr<view::EzdataGuidePage> _ezdata_guide_page;
};
+84
View File
@@ -0,0 +1,84 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#pragma once
#include <hal/hal.h>
#include <smooth_lvgl.hpp>
#include <uitk/short_namespace.hpp>
#include <string_view>
#include <vector>
#include <string>
#include <memory>
namespace view {
/**
* @brief
*
*/
class EzdataGuidePage {
public:
EzdataGuidePage(std::string_view pairCode)
{
_panel = std::make_unique<uitk::lvgl_cpp::Container>(lv_screen_active());
_panel->setBgColor(lv_color_hex(0x60A5FA));
_panel->align(LV_ALIGN_CENTER, 0, 0);
_panel->setBorderWidth(0);
_panel->setSize(320, 240);
_panel->setRadius(0);
_panel->setPadding(0, 0, 0, 0);
_panel_url = std::make_unique<uitk::lvgl_cpp::Container>(*_panel);
_panel_url->setScrollbarMode(LV_SCROLLBAR_MODE_OFF);
_panel_url->setBgColor(lv_color_hex(0xFFFFFF));
_panel_url->align(LV_ALIGN_TOP_MID, 0, 42);
_panel_url->setBorderWidth(0);
_panel_url->setSize(296, 51);
_panel_url->setRadius(18);
_panel_pair_code = std::make_unique<uitk::lvgl_cpp::Container>(*_panel);
_panel_pair_code->setScrollbarMode(LV_SCROLLBAR_MODE_OFF);
_panel_pair_code->setBgColor(lv_color_hex(0xFFFFFF));
_panel_pair_code->align(LV_ALIGN_TOP_MID, 0, 138);
_panel_pair_code->setBorderWidth(0);
_panel_pair_code->setSize(296, 86);
_panel_pair_code->setRadius(18);
_title_url = std::make_unique<uitk::lvgl_cpp::Label>(*_panel);
_title_url->setText("Ezdata Web client:");
_title_url->setTextFont(&lv_font_montserrat_16);
_title_url->setTextColor(lv_color_hex(0x0E2648));
_title_url->align(LV_ALIGN_TOP_LEFT, 27, 16);
_msg_url = std::make_unique<uitk::lvgl_cpp::Label>(*_panel_url);
_msg_url->setText("https://my.m5stack.com/ezdata2");
_msg_url->setTextFont(&lv_font_montserrat_16);
_msg_url->setTextColor(lv_color_hex(0x0E2648));
_msg_url->align(LV_ALIGN_CENTER, 0, 0);
_title_pair_code = std::make_unique<uitk::lvgl_cpp::Label>(*_panel);
_title_pair_code->setText("Pair Code:");
_title_pair_code->setTextFont(&lv_font_montserrat_16);
_title_pair_code->setTextColor(lv_color_hex(0x0E2648));
_title_pair_code->align(LV_ALIGN_TOP_LEFT, 27, 113);
_msg_pair_code = std::make_unique<uitk::lvgl_cpp::Label>(*_panel_pair_code);
_msg_pair_code->setText(pairCode);
_msg_pair_code->setTextFont(&lv_font_montserrat_24);
_msg_pair_code->setTextColor(lv_color_hex(0x0E2648));
_msg_pair_code->align(LV_ALIGN_CENTER, 0, 0);
}
private:
std::unique_ptr<uitk::lvgl_cpp::Container> _panel;
std::unique_ptr<uitk::lvgl_cpp::Container> _panel_url;
std::unique_ptr<uitk::lvgl_cpp::Container> _panel_pair_code;
std::unique_ptr<uitk::lvgl_cpp::Label> _title_url;
std::unique_ptr<uitk::lvgl_cpp::Label> _msg_url;
std::unique_ptr<uitk::lvgl_cpp::Label> _title_pair_code;
std::unique_ptr<uitk::lvgl_cpp::Label> _msg_pair_code;
};
} // namespace view
@@ -394,6 +394,7 @@ void LauncherView::init(std::vector<mooncake::AppProps_t> appPorps)
_lr_indicator_panels.back()->onClick().connect([scroll_to_nearby_icon]() { scroll_to_nearby_icon(-1); });
_lr_indicators_images.push_back(std::make_unique<Image>(_lr_indicator_panels.back()->get()));
static auto icon_indicator_left = assets::get_image("icon_indicator_left.bin");
_lr_indicators_images.back()->setSrc(&icon_indicator_left);
_lr_indicators_images.back()->align(LV_ALIGN_CENTER, 0, 0);
@@ -409,6 +410,7 @@ void LauncherView::init(std::vector<mooncake::AppProps_t> appPorps)
_lr_indicator_panels.back()->onClick().connect([scroll_to_nearby_icon]() { scroll_to_nearby_icon(1); });
_lr_indicators_images.push_back(std::make_unique<Image>(_lr_indicator_panels.back()->get()));
static auto icon_indicator_right = assets::get_image("icon_indicator_right.bin");
_lr_indicators_images.back()->setSrc(&icon_indicator_right);
_lr_indicators_images.back()->align(LV_ALIGN_CENTER, 0, 0);
+79 -57
View File
@@ -20,7 +20,8 @@ AppSetup::AppSetup()
// 配置 App 名
setAppInfo().name = "SETUP";
// 配置 App 图标
setAppInfo().icon = (void*)&icon_setup;
static auto icon = assets::get_image("icon_setup.bin");
setAppInfo().icon = (void*)&icon;
// 配置 App 主题颜色
static uint32_t theme_color = 0xB3B3B3;
setAppInfo().userData = (void*)&theme_color;
@@ -41,61 +42,82 @@ void AppSetup::onOpen()
_need_warm_reset = false;
_magic_count = 0;
_menu_sections = {{
"Connectivity",
{{"Set Up Wi-Fi",
[&]() {
_destroy_menu = true;
_need_warm_reset = true;
_worker = std::make_unique<WifiSetupWorker>();
}}},
},
{
"Servo",
{{"Calibration",
[&]() {
_destroy_menu = true;
_worker = std::make_unique<ZeroCalibrationWorker>();
}},
{"LED Strips Test",
[&]() {
_destroy_menu = true;
_worker = std::make_unique<RgbTestWorker>();
}}},
},
{
"Display",
{{"Brightness",
[&]() {
_destroy_menu = true;
_worker = std::make_unique<BrightnessSetupWorker>();
}}},
},
{
"System",
{{"Timezone",
[&]() {
_destroy_menu = true;
_worker = std::make_unique<TimezoneWorker>();
}}},
},
{
"About",
{{fmt::format("FW Version: {}", common::FirmwareVersion),
[&]() {
_magic_count++;
if (_magic_count >= 10) {
_magic_count = 0;
_destroy_menu = true;
_worker = std::make_unique<FwVersionWorker>();
}
}},
{"Factory Reset",
[&]() {
_destroy_menu = true;
_worker = std::make_unique<FactoryResetWorker>();
}}},
}};
_menu_sections = {
{
"Wi-Fi",
{{"Change Wi-Fi",
[&]() {
_destroy_menu = true;
_need_warm_reset = true;
_worker = std::make_unique<WifiSetupWorker>();
}}},
},
{
"Device",
{{"Brightness",
[&]() {
_destroy_menu = true;
_worker = std::make_unique<BrightnessSetupWorker>();
}},
{"Volume",
[&]() {
_destroy_menu = true;
_worker = std::make_unique<VolumeSetupWorker>();
}},
{"Timezone",
[&]() {
_destroy_menu = true;
_worker = std::make_unique<TimezoneWorker>();
}}},
},
{
"Hardware Test",
{{"Servo",
[&]() {
_destroy_menu = true;
_worker = std::make_unique<ZeroCalibrationWorker>();
}},
{"RGB Strip",
[&]() {
_destroy_menu = true;
_worker = std::make_unique<RgbTestWorker>();
}}},
},
{
"Account",
{{"Unbind & Reset",
[&]() {
_destroy_menu = true;
_need_warm_reset = true;
_worker = std::make_unique<AccountWorker>();
}}},
},
{
"Firmware",
{
{fmt::format("Version: {}", common::FirmwareVersion),
[&]() {
_magic_count++;
if (_magic_count >= 10) {
_magic_count = 0;
_destroy_menu = true;
_worker = std::make_unique<FwVersionWorker>();
}
}},
{"Check for Updates",
[&]() {
_destroy_menu = true;
_need_warm_reset = true;
_worker = std::make_unique<SystemUpdateWorker>();
}},
// {"Factory Reset",
// [&]() {
// _destroy_menu = true;
// _worker = std::make_unique<FactoryResetWorker>();
// }}
},
},
};
LvglLockGuard lock;
@@ -146,6 +168,6 @@ void AppSetup::onClose()
view::destroy_status_bar();
if (_need_warm_reset) {
GetHAL().requestWarmReboot(3);
GetHAL().requestWarmReboot(6);
}
}
@@ -13,6 +13,7 @@
#include <hal/hal.h>
#include <functional>
#include <vector>
#include <apps/common/loading_page/loading_page.h>
using namespace uitk;
using namespace uitk::lvgl_cpp;
@@ -294,3 +295,35 @@ void FwVersionWorker::update()
_egg->update();
}
}
SystemUpdateWorker::SystemUpdateWorker()
{
auto loading_page = std::make_unique<view::LoadingPage>(0xF6F6F6, 0x26206A);
GetHAL().lvglUnlock();
// Start network
GetHAL().startNetwork([&](std::string_view msg) {
LvglLockGuard lock;
loading_page->setMessage(msg);
});
// Update Firmware
bool result = GetHAL().updateFirmware([&](std::string_view msg) {
LvglLockGuard lock;
loading_page->setMessage(msg);
});
// Hold the result for a while
GetHAL().delay(3000);
GetHAL().lvglLock();
_is_done = true;
}
SystemUpdateWorker::~SystemUpdateWorker()
{
}
void SystemUpdateWorker::update()
{
}
@@ -0,0 +1,153 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#include "workers.h"
#include <hal/hal.h>
#include <mooncake_log.h>
#include <apps/common/loading_page/loading_page.h>
using namespace uitk::lvgl_cpp;
using namespace setup_workers;
static std::string _tag = "Setup-Account";
AccountWorker::PanelInfo::PanelInfo(lv_obj_t* parent, int posY, std::string_view title, std::string_view info)
{
_panel = std::make_unique<Container>(parent);
_panel->setBgColor(lv_color_hex(0xB8D3FD));
_panel->align(LV_ALIGN_TOP_MID, 0, posY);
_panel->setBorderWidth(0);
_panel->setSize(296, 108);
_panel->setPadding(0, 0, 0, 0);
_panel->setRadius(18);
_panel->removeFlag(LV_OBJ_FLAG_SCROLLABLE);
_label_title = std::make_unique<Label>(_panel->get());
_label_title->setTextFont(&lv_font_montserrat_20);
_label_title->setTextColor(lv_color_hex(0x445B80));
_label_title->align(LV_ALIGN_TOP_MID, 0, 13);
_label_title->setText(title);
_label_info = std::make_unique<Label>(_panel->get());
_label_info->setTextFont(&lv_font_montserrat_20);
_label_info->setTextColor(lv_color_hex(0x07162C));
_label_info->align(LV_ALIGN_CENTER, 0, 14);
_label_info->setWidth(270);
_label_info->setTextAlign(LV_TEXT_ALIGN_CENTER);
_label_info->setText(info);
}
AccountWorker::PageAccount::PageAccount(std::string_view username, std::string_view deviceName)
{
_panel = std::make_unique<Container>(lv_screen_active());
_panel->setBgColor(lv_color_hex(0xF6F6F6));
_panel->align(LV_ALIGN_CENTER, 0, 0);
_panel->setBorderWidth(0);
_panel->setSize(320, 240);
_panel->setPadding(0, 20, 0, 0);
_panel->setRadius(0);
// Title
_label_title = std::make_unique<Label>(_panel->get());
_label_title->setTextFont(&lv_font_montserrat_20);
_label_title->setTextColor(lv_color_hex(0x7E7B9C));
_label_title->align(LV_ALIGN_TOP_MID, 0, 12);
_label_title->setText("ACCOUNT");
_panel_username = std::make_unique<PanelInfo>(_panel->get(), 50, "M5Stack Account:", username);
_panel_device_name = std::make_unique<PanelInfo>(_panel->get(), 174, "Device Name:", deviceName);
// Button
_btn_unbind = std::make_unique<Button>(_panel->get());
apply_button_common_style(*_btn_unbind);
_btn_unbind->align(LV_ALIGN_TOP_MID, 0, 303);
_btn_unbind->setSize(290, 48);
_btn_unbind->setBgColor(lv_color_hex(0xFF8080));
_btn_unbind->label().setText("Unbind and factory reset");
_btn_unbind->label().setTextFont(&lv_font_montserrat_20);
_btn_unbind->label().setTextColor(lv_color_hex(0x731F1F));
_btn_unbind->onClick().connect([this]() { _is_unbind_clicked = true; });
_btn_quit = std::make_unique<Button>(_panel->get());
apply_button_common_style(*_btn_quit);
_btn_quit->align(LV_ALIGN_TOP_MID, 0, 371);
_btn_quit->setSize(290, 48);
_btn_quit->label().setText("Back");
_btn_quit->label().setTextFont(&lv_font_montserrat_20);
_btn_quit->onClick().connect([this]() { _is_quit_clicked = true; });
}
AccountWorker::AccountWorker()
{
// Update account info
{
auto loading_page = std::make_unique<view::LoadingPage>(0xF6F6F6, 0x26206A);
GetHAL().lvglUnlock();
// Start network
GetHAL().startNetwork([&](std::string_view msg) {
LvglLockGuard lock;
loading_page->setMessage(msg);
});
// Update info
bool result = GetHAL().updateAccountInfo([&](std::string_view msg) {
LvglLockGuard lock;
loading_page->setMessage(msg);
});
if (!result) {
GetHAL().delay(5000);
}
GetHAL().lvglLock();
}
auto info = GetHAL().getUserAccountInfo();
_page_account = std::make_unique<PageAccount>(info.username, info.deviceName);
}
AccountWorker::~AccountWorker()
{
}
void AccountWorker::update()
{
if (_page_account) {
if (_page_account->isUnbindClicked()) {
mclog::tagInfo(_tag, "unbind clicked");
_page_account.reset();
// Unbind account
{
auto loading_page = std::make_unique<view::LoadingPage>(0xF6F6F6, 0x26206A);
GetHAL().lvglUnlock();
bool result = GetHAL().unbindAccount([&](std::string_view msg) {
LvglLockGuard lock;
loading_page->setMessage(msg);
});
if (!result) {
GetHAL().delay(5000);
}
GetHAL().lvglLock();
}
// Factory reset
_worker_reset = std::make_unique<FactoryResetWorker>();
} else if (_page_account->isQuitClicked()) {
mclog::tagInfo(_tag, "quit clicked");
_is_done = true;
}
} else if (_worker_reset) {
_worker_reset->update();
if (_worker_reset->isDone()) {
_worker_reset.reset();
_is_done = true;
}
}
}
@@ -31,11 +31,6 @@ WifiSetupWorker::WifiSetupWorker()
avatar->rightEye().setVisible(false);
avatar->mouth().setVisible(false);
GetStackChan().attachAvatar(std::move(avatar));
_app_config_signal_id =
GetHAL().onAppConfigEvent.connect([this](AppConfigEvent event) { _last_app_config_event = event; });
GetHAL().startAppConfigServer();
}
WifiSetupWorker::~WifiSetupWorker()
@@ -69,30 +64,65 @@ void WifiSetupWorker::update_state()
data.title = std::make_unique<Label>(lv_screen_active());
data.title->setTextFont(&lv_font_montserrat_20);
data.title->setTextColor(lv_color_hex(0x7E7B9C));
data.title->align(LV_ALIGN_TOP_MID, 0, 13);
data.title->align(LV_ALIGN_TOP_MID, 0, 0);
data.title->setText("APP SETUP");
data.info = std::make_unique<Label>(lv_screen_active());
data.info->setTextFont(&lv_font_montserrat_14);
data.info->setTextColor(lv_color_hex(0x26206A));
data.info->align(LV_ALIGN_TOP_MID, 0, 27);
data.info->setTextAlign(LV_TEXT_ALIGN_CENTER);
data.info->setText("Install \"StackChan World\" app\nand login to your M5Stack account");
std::string qrcode_text = "https://apps.apple.com/us/app/stackchan-world/id6756086326";
data.qrcode = std::make_unique<Qrcode>(lv_screen_active());
data.qrcode->setSize(150);
data.qrcode->setDarkColor(lv_color_hex(0x221C5B));
data.qrcode->setLightColor(lv_color_hex(0xEDF4FF));
data.qrcode->update(qrcode_text);
data.qrcode->align(LV_ALIGN_CENTER, -72, 12);
data.qrcode_ios = std::make_unique<Qrcode>(lv_screen_active());
data.qrcode_ios->setSize(80);
data.qrcode_ios->setDarkColor(lv_color_hex(0x221C5B));
data.qrcode_ios->setLightColor(lv_color_hex(0xEDF4FF));
data.qrcode_ios->update(qrcode_text);
data.qrcode_ios->align(LV_ALIGN_CENTER, -65, -12);
qrcode_text = "https://play.google.com/store/apps/details?id=com.m5stack.stackchan";
data.qrcode_android = std::make_unique<Qrcode>(lv_screen_active());
data.qrcode_android->setSize(80);
data.qrcode_android->setDarkColor(lv_color_hex(0x221C5B));
data.qrcode_android->setLightColor(lv_color_hex(0xEDF4FF));
data.qrcode_android->update(qrcode_text);
data.qrcode_android->align(LV_ALIGN_CENTER, 65, -12);
data.label_ios = std::make_unique<Label>(lv_screen_active());
data.label_ios->setTextFont(&lv_font_montserrat_14);
data.label_ios->setTextColor(lv_color_hex(0x26206A));
data.label_ios->align(LV_ALIGN_CENTER, -65, 47);
data.label_ios->setText("App Store\n(iOS)");
data.label_ios->setTextAlign(LV_TEXT_ALIGN_CENTER);
data.label_android = std::make_unique<Label>(lv_screen_active());
data.label_android->setTextFont(&lv_font_montserrat_14);
data.label_android->setTextColor(lv_color_hex(0x26206A));
data.label_android->align(LV_ALIGN_CENTER, 65, 47);
data.label_android->setText("Play Store\n(Android)");
data.label_android->setTextAlign(LV_TEXT_ALIGN_CENTER);
data.btn_next = std::make_unique<Button>(lv_screen_active());
apply_button_common_style(*data.btn_next);
data.btn_next->align(LV_ALIGN_CENTER, 79, 73);
data.btn_next->setSize(112, 48);
data.btn_next->align(LV_ALIGN_CENTER, 72, 91);
data.btn_next->setSize(112, 42);
data.btn_next->label().setText("Next");
data.btn_next->onClick().connect([this]() { _state_app_download_data.next_clicked = true; });
data.info = std::make_unique<Label>(lv_screen_active());
data.info->setTextFont(&lv_font_montserrat_20);
data.info->setTextColor(lv_color_hex(0x26206A));
data.info->align(LV_ALIGN_TOP_LEFT, 183, 56);
data.info->setTextAlign(LV_TEXT_ALIGN_LEFT);
data.info->setText("Download\n\"StackChan\"\napp to start\nthe setup");
data.btn_quit = std::make_unique<Button>(lv_screen_active());
apply_button_common_style(*data.btn_quit);
data.btn_quit->align(LV_ALIGN_CENTER, -72, 91);
data.btn_quit->setSize(112, 42);
data.btn_quit->setBgColor(lv_color_hex(0xD4D9E0));
data.btn_quit->label().setText("Back");
data.btn_quit->label().setTextColor(lv_color_hex(0x525064));
data.btn_quit->onClick().connect([this]() { _state_app_download_data.quit_clicked = true; });
}
if (_state_app_download_data.quit_clicked) {
_is_done = true;
}
if (_state_app_download_data.next_clicked) {
@@ -113,6 +143,12 @@ void WifiSetupWorker::update_state()
if (_is_first_in) {
_is_first_in = false;
// Start app config server
_app_config_signal_id =
GetHAL().onAppConfigEvent.connect([this](AppConfigEvent event) { _last_app_config_event = event; });
GetHAL().startAppConfigServer();
auto& data = _state_wait_app_connection_data;
data.panel = std::make_unique<Container>(lv_screen_active());
+269 -3
View File
@@ -9,6 +9,7 @@
#include <mooncake_log.h>
#include <assets/assets.h>
#include <hal/hal.h>
#include <array>
using namespace smooth_ui_toolkit::lvgl_cpp;
using namespace setup_workers;
@@ -36,8 +37,9 @@ public:
_title->align(LV_ALIGN_TOP_MID, 0, 13);
_title->setText("HOME POSITION:");
_img = std::make_unique<Image>(lv_screen_active());
_img->setSrc(&setup_stackchan_front_view);
_img = std::make_unique<Image>(lv_screen_active());
_img_setup_stackchan_front_view = assets::get_image("setup_stackchan_front_view.bin");
_img->setSrc(&_img_setup_stackchan_front_view);
_img->align(LV_ALIGN_CENTER, -74, 15);
_btn_next = std::make_unique<Button>(lv_screen_active());
@@ -62,6 +64,7 @@ private:
std::unique_ptr<uitk::lvgl_cpp::Image> _img;
std::unique_ptr<uitk::lvgl_cpp::Button> _btn_next;
std::unique_ptr<uitk::lvgl_cpp::Label> _info;
lv_image_dsc_t _img_setup_stackchan_front_view;
};
/**
@@ -190,6 +193,269 @@ void ZeroCalibrationWorker::update()
}
}
class PageServoTips : public WorkerBase {
public:
PageServoTips()
{
_panel = std::make_unique<Container>(lv_screen_active());
_panel->setBgColor(lv_color_hex(0xEDF4FF));
_panel->align(LV_ALIGN_CENTER, 0, 0);
_panel->setBorderWidth(0);
_panel->setSize(320, 240);
_panel->setRadius(0);
_title = std::make_unique<Label>(lv_screen_active());
_title->setTextFont(&lv_font_montserrat_20);
_title->setTextColor(lv_color_hex(0x7E7B9C));
_title->align(LV_ALIGN_TOP_MID, 0, 13);
_title->setText("SERVO TEST");
_info = std::make_unique<Label>(lv_screen_active());
_info->setWidth(280);
_info->setTextFont(&lv_font_montserrat_16);
_info->setTextColor(lv_color_hex(0x26206A));
_info->align(LV_ALIGN_CENTER, 0, -18);
_info->setTextAlign(LV_TEXT_ALIGN_CENTER);
_info->setText(
"Put me on a flat stable surface\nand remove your hands.\n\nPower me via the bottom USB-C \nif needed. ");
_btn_skip = std::make_unique<Button>(lv_screen_active());
apply_button_common_style(*_btn_skip);
_btn_skip->align(LV_ALIGN_CENTER, -72, 72);
_btn_skip->setSize(112, 48);
_btn_skip->setBgColor(lv_color_hex(0xD4D9E0));
_btn_skip->label().setText("Skip");
_btn_skip->label().setTextFont(&lv_font_montserrat_20);
_btn_skip->label().setTextColor(lv_color_hex(0x525064));
_btn_skip->onClick().connect([this]() { _is_skip_clicked = true; });
_btn_start = std::make_unique<Button>(lv_screen_active());
apply_button_common_style(*_btn_start);
_btn_start->align(LV_ALIGN_CENTER, 72, 72);
_btn_start->setSize(112, 48);
_btn_start->label().setText("Start");
_btn_start->label().setTextFont(&lv_font_montserrat_20);
_btn_start->onClick().connect([this]() { _is_start_clicked = true; });
}
bool isSkipClicked() const
{
return _is_skip_clicked;
}
bool isStartClicked() const
{
return _is_start_clicked;
}
private:
std::unique_ptr<uitk::lvgl_cpp::Container> _panel;
std::unique_ptr<uitk::lvgl_cpp::Label> _title;
std::unique_ptr<uitk::lvgl_cpp::Label> _info;
std::unique_ptr<uitk::lvgl_cpp::Button> _btn_skip;
std::unique_ptr<uitk::lvgl_cpp::Button> _btn_start;
bool _is_skip_clicked = false;
bool _is_start_clicked = false;
};
class PageServoTest : public WorkerBase {
public:
PageServoTest()
{
_panel = std::make_unique<Container>(lv_screen_active());
_panel->setBgColor(lv_color_hex(0xEDF4FF));
_panel->align(LV_ALIGN_CENTER, 0, 0);
_panel->setBorderWidth(0);
_panel->setSize(320, 240);
_panel->setRadius(0);
_title = std::make_unique<Label>(lv_screen_active());
_title->setTextFont(&lv_font_montserrat_20);
_title->setTextColor(lv_color_hex(0x7E7B9C));
_title->align(LV_ALIGN_TOP_MID, 0, 13);
_title->setText("SERVO TEST");
_info = std::make_unique<Label>(lv_screen_active());
_info->setWidth(280);
_info->setTextFont(&lv_font_montserrat_20);
_info->setTextColor(lv_color_hex(0x26206A));
_info->align(LV_ALIGN_CENTER, 0, -12);
_info->setTextAlign(LV_TEXT_ALIGN_CENTER);
_info->setText("Preparing...");
auto& motion = GetStackChan().motion();
motion.setAutoAngleSyncEnabled(true);
}
void update() override
{
if (_current_step >= _steps.size()) {
_is_done = true;
return;
}
const auto now = GetHAL().millis();
if (!_step_started) {
run_step(_steps[_current_step]);
_step_started = true;
_step_start_tick = now;
return;
}
if (now - _step_start_tick >= _step_delay_ms) {
_current_step++;
_step_started = false;
}
}
private:
enum class Step {
GoHome1,
Left90,
GoHome2,
Right90,
GoHome3,
Up90,
GoHome4,
};
void run_step(Step step)
{
auto& motion = GetStackChan().motion();
switch (step) {
case Step::GoHome1:
case Step::GoHome2:
case Step::GoHome3:
case Step::GoHome4:
_info->setText("Returning to\nthe home position...");
motion.goHome(_move_speed);
break;
case Step::Left90:
_info->setText("Moving left...");
motion.moveWithSpeed(900, 0, _move_speed);
break;
case Step::Right90:
_info->setText("Moving right...");
motion.moveWithSpeed(-900, 0, _move_speed);
break;
case Step::Up90:
_info->setText("Moving up...");
motion.moveWithSpeed(0, 900, _move_speed);
break;
}
}
std::unique_ptr<uitk::lvgl_cpp::Container> _panel;
std::unique_ptr<uitk::lvgl_cpp::Label> _title;
std::unique_ptr<uitk::lvgl_cpp::Label> _info;
static constexpr uint32_t _step_delay_ms = 1800;
static constexpr int _move_speed = 500;
const std::array<Step, 7> _steps = {
Step::GoHome1, Step::Left90, Step::GoHome2, Step::Right90, Step::GoHome3, Step::Up90, Step::GoHome4,
};
size_t _current_step = 0;
uint32_t _step_start_tick = 0;
bool _step_started = false;
};
class PageServoDone : public WorkerBase {
public:
PageServoDone()
{
_panel = std::make_unique<Container>(lv_screen_active());
_panel->setBgColor(lv_color_hex(0xEDF4FF));
_panel->align(LV_ALIGN_CENTER, 0, 0);
_panel->setBorderWidth(0);
_panel->setSize(320, 240);
_panel->setRadius(0);
_title = std::make_unique<Label>(lv_screen_active());
_title->setTextFont(&lv_font_montserrat_20);
_title->setTextColor(lv_color_hex(0x7E7B9C));
_title->align(LV_ALIGN_TOP_MID, 0, 13);
_title->setText("SERVO TEST");
_info = std::make_unique<Label>(lv_screen_active());
_info->setWidth(280);
_info->setTextFont(&lv_font_montserrat_20);
_info->setTextColor(lv_color_hex(0x26206A));
_info->align(LV_ALIGN_CENTER, 0, -16);
_info->setTextAlign(LV_TEXT_ALIGN_CENTER);
_info->setText("Servo test completed.\n");
_btn_retest = std::make_unique<Button>(lv_screen_active());
apply_button_common_style(*_btn_retest);
_btn_retest->align(LV_ALIGN_CENTER, -72, 67);
_btn_retest->setSize(112, 48);
_btn_retest->setBgColor(lv_color_hex(0xD4D9E0));
_btn_retest->label().setText("Retest");
_btn_retest->label().setTextFont(&lv_font_montserrat_20);
_btn_retest->label().setTextColor(lv_color_hex(0x525064));
_btn_retest->onClick().connect([this]() { _is_retest_clicked = true; });
_btn_next = std::make_unique<Button>(lv_screen_active());
apply_button_common_style(*_btn_next);
_btn_next->align(LV_ALIGN_CENTER, 72, 67);
_btn_next->setSize(112, 48);
_btn_next->label().setText("Next");
_btn_next->label().setTextFont(&lv_font_montserrat_20);
_btn_next->onClick().connect([this]() { _is_next_clicked = true; });
}
bool isRetestClicked() const
{
return _is_retest_clicked;
}
bool isNextClicked() const
{
return _is_next_clicked;
}
private:
std::unique_ptr<uitk::lvgl_cpp::Container> _panel;
std::unique_ptr<uitk::lvgl_cpp::Label> _title;
std::unique_ptr<uitk::lvgl_cpp::Label> _info;
std::unique_ptr<uitk::lvgl_cpp::Button> _btn_retest;
std::unique_ptr<uitk::lvgl_cpp::Button> _btn_next;
bool _is_retest_clicked = false;
bool _is_next_clicked = false;
};
ServoTestWorker::ServoTestWorker()
{
_page_tips = std::make_unique<PageServoTips>();
}
void ServoTestWorker::update()
{
if (_page_tips) {
auto* page = static_cast<PageServoTips*>(_page_tips.get());
if (page->isSkipClicked()) {
_page_tips.reset();
_is_done = true;
} else if (page->isStartClicked()) {
_page_tips.reset();
_page_test = std::make_unique<PageServoTest>();
}
} else if (_page_test) {
_page_test->update();
if (_page_test->isDone()) {
_page_test.reset();
_page_done = std::make_unique<PageServoDone>();
}
} else if (_page_done) {
auto* page = static_cast<PageServoDone*>(_page_done.get());
if (page->isRetestClicked()) {
_page_done.reset();
_page_test = std::make_unique<PageServoTest>();
} else if (page->isNextClicked()) {
_page_done.reset();
_is_done = true;
}
}
}
struct RgbColorEntry {
std::string name;
uint8_t r;
@@ -235,7 +501,7 @@ RgbTestWorker::RgbTestWorker()
auto btn_quit = std::make_unique<Button>(*_panel);
apply_button_common_style(*btn_quit);
btn_quit->setSize(200, 50);
btn_quit->label().setText("Quit");
btn_quit->label().setText("Back");
btn_quit->onClick().connect([this]() { _is_done = true; });
_buttons.push_back(std::move(btn_quit));
}
@@ -67,6 +67,15 @@ void StartupWorker::update()
_is_done = true;
} else if (_page_startup->isStartClicked()) {
_page_startup.reset();
mclog::tagInfo(_tag, "start servo test");
_worker_servo_test = std::make_unique<ServoTestWorker>();
}
}
// Servo test
else if (_worker_servo_test) {
_worker_servo_test->update();
if (_worker_servo_test->isDone()) {
_worker_servo_test.reset();
mclog::tagInfo(_tag, "start wifi setup");
_worker_wifi = std::make_unique<WifiSetupWorker>();
}
@@ -76,8 +85,8 @@ void StartupWorker::update()
_worker_wifi->update();
if (_worker_wifi->isDone()) {
_worker_wifi.reset();
mclog::tagInfo(_tag, "startup done");
_is_done = true;
mclog::tagInfo(_tag, "startup back");
_page_startup = std::make_unique<PageStartup>();
}
}
}
@@ -33,6 +33,74 @@ static const std::vector<TimezoneOption_t> _timezone_list = {
{"Tokyo (UTC+9)", "JST-9"}, {"Sydney (UTC+10)", "AEST-10"}, {"Noumea (UTC+11)", "SBT-11"},
{"Auckland (UTC+12)", "NZST-12"}, {"Fiji (UTC+13)", "FJT-13"}, {"Line Islands (UTC+14)", "LINT-14"}};
VolumeSetupWorker::VolumeSetupWorker()
{
mclog::info("VolumeSetupWorker start");
for (int volume = 0; volume <= 100; volume += 5) {
_volume_levels.push_back(volume);
}
uint8_t current_volume = GetHAL().getSpeakerVolume();
int current_index = _volume_levels.size() - 1;
for (size_t i = 0; i < _volume_levels.size(); i++) {
if (_volume_levels[i] >= current_volume) {
current_index = static_cast<int>(i);
break;
}
}
_panel = std::make_unique<Container>(lv_screen_active());
_panel->setBgColor(lv_color_hex(0xEDF4FF));
_panel->align(LV_ALIGN_CENTER, 0, 0);
_panel->setBorderWidth(0);
_panel->setSize(320, 240);
_panel->setRadius(0);
_panel->removeFlag(LV_OBJ_FLAG_SCROLLABLE);
_label_volume = std::make_unique<Label>(*_panel);
_label_volume->setText(fmt::format("{}%", _volume_levels[current_index]));
_label_volume->setTextFont(&lv_font_montserrat_24);
_label_volume->setTextColor(lv_color_hex(0x26206A));
_label_volume->align(LV_ALIGN_CENTER, 0, -70);
_slider = std::make_unique<Slider>(*_panel);
_slider->align(LV_ALIGN_CENTER, 0, -12);
_slider->setRange(0, _volume_levels.size() - 1);
_slider->setSize(250, 18);
_slider->setBgColor(lv_color_hex(0x615B9E), LV_PART_KNOB);
_slider->setBgColor(lv_color_hex(0x615B9E), LV_PART_INDICATOR);
_slider->setBgColor(lv_color_hex(0xB8D3FD), LV_PART_MAIN);
_slider->setBgOpa(255);
_slider->setValue(current_index);
_slider->onValueChanged().connect([this](int32_t value) {
_label_volume->setText(fmt::format("{}%", _volume_levels[value]));
_target_volume = _volume_levels[value];
});
_btn_confirm = std::make_unique<Button>(*_panel);
apply_button_common_style(*_btn_confirm);
_btn_confirm->align(LV_ALIGN_CENTER, 0, 60);
_btn_confirm->setSize(150, 50);
_btn_confirm->label().setText("Confirm");
_btn_confirm->onClick().connect([this]() { _is_done = true; });
}
VolumeSetupWorker::~VolumeSetupWorker()
{
auto volume = _volume_levels[_slider->getValue()];
mclog::tagInfo(_tag, "final volume: {}", volume);
GetHAL().setSpeakerVolume(volume, true);
}
void VolumeSetupWorker::update()
{
if (_target_volume != -1) {
GetHAL().setSpeakerVolume(_target_volume, false);
_target_volume = -1;
}
}
TimezoneWorker::TimezoneWorker()
{
_panel = std::make_unique<uitk::lvgl_cpp::Container>(lv_screen_active());
+110 -2
View File
@@ -10,6 +10,7 @@
#include <hal/hal.h>
#include <cstdint>
#include <memory>
#include <string_view>
namespace setup_workers {
@@ -48,6 +49,21 @@ private:
std::unique_ptr<WorkerBase> _page_calibration;
};
/**
* @brief
*
*/
class ServoTestWorker : public WorkerBase {
public:
ServoTestWorker();
void update() override;
private:
std::unique_ptr<WorkerBase> _page_tips;
std::unique_ptr<WorkerBase> _page_test;
std::unique_ptr<WorkerBase> _page_done;
};
/**
* @brief
*
@@ -79,19 +95,29 @@ private:
struct StateAppDownloadData {
std::unique_ptr<uitk::lvgl_cpp::Container> panel;
std::unique_ptr<uitk::lvgl_cpp::Label> title;
std::unique_ptr<uitk::lvgl_cpp::Qrcode> qrcode;
std::unique_ptr<uitk::lvgl_cpp::Qrcode> qrcode_ios;
std::unique_ptr<uitk::lvgl_cpp::Qrcode> qrcode_android;
std::unique_ptr<uitk::lvgl_cpp::Label> label_ios;
std::unique_ptr<uitk::lvgl_cpp::Label> label_android;
std::unique_ptr<uitk::lvgl_cpp::Button> btn_next;
std::unique_ptr<uitk::lvgl_cpp::Button> btn_quit;
std::unique_ptr<uitk::lvgl_cpp::Label> info;
bool next_clicked = false;
bool quit_clicked = false;
void reset()
{
panel.reset();
title.reset();
qrcode.reset();
qrcode_ios.reset();
qrcode_android.reset();
label_ios.reset();
label_android.reset();
btn_next.reset();
btn_quit.reset();
info.reset();
next_clicked = false;
quit_clicked = false;
}
};
StateAppDownloadData _state_app_download_data;
@@ -170,6 +196,7 @@ public:
private:
std::unique_ptr<PageStartup> _page_startup;
std::unique_ptr<ServoTestWorker> _worker_servo_test;
std::unique_ptr<WifiSetupWorker> _worker_wifi;
};
@@ -187,6 +214,17 @@ private:
uint32_t _last_tick = 0;
};
/**
* @brief
*
*/
class SystemUpdateWorker : public WorkerBase {
public:
SystemUpdateWorker();
~SystemUpdateWorker();
void update() override;
};
/**
* @brief
*
@@ -205,6 +243,25 @@ private:
int32_t _target_brightness = -1;
};
/**
* @brief
*
*/
class VolumeSetupWorker : public WorkerBase {
public:
VolumeSetupWorker();
~VolumeSetupWorker();
void update() override;
private:
std::unique_ptr<uitk::lvgl_cpp::Container> _panel;
std::unique_ptr<uitk::lvgl_cpp::Label> _label_volume;
std::unique_ptr<uitk::lvgl_cpp::Slider> _slider;
std::unique_ptr<uitk::lvgl_cpp::Button> _btn_confirm;
std::vector<uint8_t> _volume_levels;
int32_t _target_volume = -1;
};
/**
* @brief
*
@@ -247,4 +304,55 @@ private:
void update_ui();
};
/**
* @brief
*
*/
class AccountWorker : public WorkerBase {
public:
class PanelInfo {
public:
PanelInfo(lv_obj_t* parent, int posY, std::string_view title, std::string_view info);
private:
std::unique_ptr<uitk::lvgl_cpp::Container> _panel;
std::unique_ptr<uitk::lvgl_cpp::Label> _label_title;
std::unique_ptr<uitk::lvgl_cpp::Label> _label_info;
};
class PageAccount {
public:
PageAccount(std::string_view username, std::string_view deviceName);
bool isUnbindClicked() const
{
return _is_unbind_clicked;
}
bool isQuitClicked() const
{
return _is_quit_clicked;
}
private:
std::unique_ptr<uitk::lvgl_cpp::Container> _panel;
std::unique_ptr<uitk::lvgl_cpp::Label> _label_title;
std::unique_ptr<PanelInfo> _panel_username;
std::unique_ptr<PanelInfo> _panel_device_name;
std::unique_ptr<uitk::lvgl_cpp::Button> _btn_unbind;
std::unique_ptr<uitk::lvgl_cpp::Button> _btn_quit;
bool _is_unbind_clicked = false;
bool _is_quit_clicked = false;
};
AccountWorker();
~AccountWorker();
void update() override;
private:
std::unique_ptr<PageAccount> _page_account;
std::unique_ptr<FactoryResetWorker> _worker_reset;
};
} // namespace setup_workers
+3
View File
@@ -9,3 +9,6 @@
#include "app_avatar/app_avatar.h"
#include "app_setup/app_setup.h"
#include "app_espnow_ctrl/app_espnow_ctrl.h"
#include "app_app_center/app_app_center.h"
#include "app_ezdata/app_ezdata.h"
#include "app_dance/app_dance.h"
+1 -1
View File
@@ -13,6 +13,6 @@
namespace common {
inline constexpr std::string_view FirmwareVersion = "V0.18";
inline constexpr std::string_view FirmwareVersion = "V" FIRMWARE_VERSION;
}
@@ -121,7 +121,8 @@ public:
_icon = std::make_unique<Image>(_btn->get());
_icon->align(LV_ALIGN_CENTER, 0, -10);
_icon->setSrc(&icon_home);
_icon_home = assets::get_image("icon_home.bin");
_icon->setSrc(&_icon_home);
_icon->setImageRecolorOpa(LV_OPA_COVER);
_icon->setImageRecolor(lv_color_hex(colorBorder));
@@ -185,6 +186,7 @@ private:
bool _is_hidden = false;
bool _is_clicked = false;
bool _hide_mask_flag = false;
lv_image_dsc_t _icon_home;
};
/**
@@ -35,8 +35,9 @@ public:
_msg_panel->setSize(296, 156);
_msg_panel->setRadius(18);
_bell = std::make_unique<uitk::lvgl_cpp::Image>(_msg_panel->get());
_bell->setSrc(&icon_bell);
_bell = std::make_unique<uitk::lvgl_cpp::Image>(_msg_panel->get());
_icon_bell = assets::get_image("icon_bell.bin");
_bell->setSrc(&_icon_bell);
_bell->align(LV_ALIGN_CENTER, -122, -59);
_bell->setRotation(150);
@@ -91,6 +92,7 @@ private:
std::unique_ptr<uitk::lvgl_cpp::Label> _title;
std::unique_ptr<uitk::lvgl_cpp::Label> _msg;
std::unique_ptr<uitk::lvgl_cpp::Button> _btn_ok;
lv_image_dsc_t _icon_bell;
uint32_t _anim_tick = 0;
bool _anim_flag = false;
@@ -15,6 +15,7 @@
#include <memory>
#include <vector>
#include <lvgl.h>
#include <src/draw/lv_image_dsc.h>
using namespace smooth_ui_toolkit;
using namespace smooth_ui_toolkit::lvgl_cpp;
@@ -159,8 +160,9 @@ public:
_bar->setOutlineColor(lv_color_hex(colorPrimary));
_bar->setRadius(3, LV_PART_INDICATOR);
_lightning_icon = std::make_unique<uitk::lvgl_cpp::Image>(parent);
_lightning_icon->setSrc(&icon_bat_lightning);
_lightning_icon = std::make_unique<uitk::lvgl_cpp::Image>(parent);
_icon_bat_lightning = assets::get_image("icon_bat_lightning.bin");
_lightning_icon->setSrc(&_icon_bat_lightning);
_lightning_icon->setImageRecolor(lv_color_hex(colorPrimary));
_lightning_icon->setImageRecolorOpa(LV_OPA_COVER);
_lightning_icon->setHidden(true);
@@ -193,6 +195,7 @@ private:
std::unique_ptr<Bar> _bar;
std::unique_ptr<Container> _bat_top;
std::unique_ptr<Image> _lightning_icon;
lv_image_dsc_t _icon_bat_lightning;
uint32_t _color_primary = 0;
};
@@ -235,6 +238,11 @@ public:
_wifi_icon->setImageRecolor(lv_color_hex(colorPrimary));
_wifi_icon->setImageRecolorOpa(LV_OPA_COVER);
_icon_wifi_low = assets::get_image("icon_wifi_low.bin");
_icon_wifi_medium = assets::get_image("icon_wifi_medium.bin");
_icon_wifi_high = assets::get_image("icon_wifi_high.bin");
_icon_wifi_slash = assets::get_image("icon_wifi_slash.bin");
update();
}
@@ -246,22 +254,26 @@ public:
_wifi_icon->setSrc(NULL);
break;
case WifiStatus::Low:
_wifi_icon->setSrc(&icon_wifi_low);
_wifi_icon->setSrc(&_icon_wifi_low);
break;
case WifiStatus::Medium:
_wifi_icon->setSrc(&icon_wifi_medium);
_wifi_icon->setSrc(&_icon_wifi_medium);
break;
case WifiStatus::High:
_wifi_icon->setSrc(&icon_wifi_high);
_wifi_icon->setSrc(&_icon_wifi_high);
break;
default:
_wifi_icon->setSrc(&icon_wifi_slash);
_wifi_icon->setSrc(&_icon_wifi_slash);
break;
}
}
private:
std::unique_ptr<Image> _wifi_icon;
lv_image_dsc_t _icon_wifi_low;
lv_image_dsc_t _icon_wifi_medium;
lv_image_dsc_t _icon_wifi_high;
lv_image_dsc_t _icon_wifi_slash;
};
class StatusBarView {
+1 -1
View File
@@ -4,7 +4,7 @@
* SPDX-License-Identifier: MIT
*/
#include "assets.h"
#include <assets.h> // Include Xiaozhi's Assets class
#include <assets.h>
#include <mooncake_log.h>
#include <map>
#include <string>
-21
View File
@@ -9,27 +9,6 @@
LV_FONT_DECLARE(MontserratSemiBold26);
LV_IMG_DECLARE(icon_ai_agent);
LV_IMG_DECLARE(icon_controller);
LV_IMG_DECLARE(icon_indicator_left);
LV_IMG_DECLARE(icon_indicator_right);
LV_IMG_DECLARE(icon_sentinel);
LV_IMG_DECLARE(icon_setup);
LV_IMG_DECLARE(icon_uiflow);
LV_IMG_DECLARE(icon_calibrate);
LV_IMG_DECLARE(icon_remote);
LV_IMG_DECLARE(setup_stackchan_front_view);
LV_IMG_DECLARE(icon_home);
LV_IMG_DECLARE(icon_bell);
LV_IMG_DECLARE(icon_app_store);
LV_IMG_DECLARE(icon_ezdata);
LV_IMG_DECLARE(icon_wifi_high);
LV_IMG_DECLARE(icon_wifi_medium);
LV_IMG_DECLARE(icon_wifi_low);
LV_IMG_DECLARE(icon_wifi_slash);
LV_IMG_DECLARE(icon_bat_lightning);
LV_IMG_DECLARE(icon_dance);
extern const char ogg_camera_shutter_start[] asm("_binary_camera_shutter_ogg_start");
extern const char ogg_camera_shutter_end[] asm("_binary_camera_shutter_ogg_end");
static const std::string_view OGG_CAMERA_SHUTTER{
Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,68 +0,0 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMAGE_ICON_BAT_LIGHTNING
#define LV_ATTRIBUTE_IMAGE_ICON_BAT_LIGHTNING
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_ICON_BAT_LIGHTNING uint8_t
icon_bat_lightning_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x60, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xdf, 0xaf, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff,
0xff, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff, 0xff, 0xff, 0x50, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x9f, 0x20, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00,
0x00, 0x00, 0x20, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xff,
0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xdf,
0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const lv_image_dsc_t icon_bat_lightning = {
.header.cf = LV_COLOR_FORMAT_RGB565A8,
.header.magic = LV_IMAGE_HEADER_MAGIC,
.header.w = 12,
.header.h = 16,
.data_size = 192 * 3,
.data = icon_bat_lightning_map,
};
-126
View File
@@ -1,126 +0,0 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMAGE_ICON_BELL
#define LV_ATTRIBUTE_IMAGE_ICON_BELL
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_ICON_BELL uint8_t icon_bell_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x83, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87,
0x8b, 0x86, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x86, 0x83, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87,
0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x87, 0x8b, 0x87,
0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00,
0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87,
0x8b, 0x87, 0x8b, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x86, 0x83, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87,
0x8b, 0x87, 0x8b, 0x86, 0x83, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x83, 0x87, 0x8b, 0x87, 0x8b,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x86, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b,
0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b,
0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87,
0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b,
0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87,
0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87,
0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b,
0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x87, 0x8b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x9f, 0xff, 0x60, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xff, 0x8f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xcf, 0xff, 0x70, 0x00, 0x10, 0x80, 0xcf, 0xef, 0xef, 0xbf, 0x8f, 0x20, 0x00, 0x80, 0xff, 0xcf, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x70, 0x00, 0x70, 0xef, 0xff, 0xbf, 0x8f, 0x8f, 0xbf, 0xff, 0xdf, 0x80, 0x00,
0x60, 0xff, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff, 0x8f, 0x00, 0x80, 0xff, 0x9f, 0x20, 0x00, 0x00, 0x00,
0x00, 0x20, 0x9f, 0xff, 0x80, 0x00, 0x8f, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x30, 0xaf, 0x10, 0x40, 0xff, 0x80,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x40, 0x10, 0x9f, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xdf, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xbf, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x6f, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xdf, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xff, 0x8f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xef, 0x10, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x60, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xff,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xdf, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xdf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf,
0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xdf, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xbf,
0xbf, 0xbf, 0xbf, 0xdf, 0xff, 0xbf, 0xbf, 0xbf, 0xbf, 0xef, 0xef, 0xbf, 0xbf, 0xbf, 0xaf, 0x60, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xff, 0x80, 0x00, 0x00, 0x80, 0xff, 0x60, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaf, 0xff, 0xdf, 0xef, 0xff,
0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0xaf, 0xaf, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const lv_image_dsc_t icon_bell = {
.header.cf = LV_COLOR_FORMAT_RGB565A8,
.header.magic = LV_IMAGE_HEADER_MAGIC,
.header.w = 24,
.header.h = 24,
.data_size = 576 * 3,
.data = icon_bell_map,
};
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
-196
View File
@@ -1,196 +0,0 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMAGE_ICON_HOME
#define LV_ATTRIBUTE_IMAGE_ICON_HOME
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_ICON_HOME uint8_t icon_home_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d,
0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00,
0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d,
0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29,
0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d,
0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x21, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29,
0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0e, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x21, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29,
0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0e, 0x21, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x21, 0x0d,
0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d,
0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29,
0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d,
0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29,
0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29,
0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d,
0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29,
0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d,
0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d,
0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29,
0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29,
0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x29, 0x0d,
0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x0d, 0x29, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xef, 0xdf, 0x50,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x80, 0xff, 0xff, 0x80, 0x80, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x80, 0x00, 0x00,
0x80, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f,
0xff, 0xff, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0xff, 0xef, 0x40, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0xef, 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x10, 0x9f, 0xff, 0xef, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0xef, 0xff, 0x9f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xcf, 0xff, 0xdf,
0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xdf, 0xff, 0xcf, 0x10, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xcf, 0xff, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xdf, 0xff, 0xcf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xaf, 0xff, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20, 0xdf, 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x20, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff,
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00,
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xdf, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xdf, 0x30, 0x00, 0x00, 0x00, 0x00, 0x30, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x30, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const lv_image_dsc_t icon_home = {
.header.cf = LV_COLOR_FORMAT_RGB565A8,
.header.magic = LV_IMAGE_HEADER_MAGIC,
.header.w = 32,
.header.h = 32,
.data_size = 1024 * 3,
.data = icon_home_map,
};
@@ -1,407 +0,0 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMAGE_ICON_INDICATOR_LEFT
#define LV_ATTRIBUTE_IMAGE_ICON_INDICATOR_LEFT
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_ICON_INDICATOR_LEFT uint8_t
icon_indicator_left_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0xde, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7a, 0xd6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xdf, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1c, 0xe7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xdf, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x75, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 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, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x75, 0xad, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1c, 0xe7, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xdf, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xd6, 0xdf, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x75, 0xad,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xd6, 0xdf, 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, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xfb, 0xde, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0x75, 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7d, 0xef, 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, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x10, 0x84, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 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, 0xfb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xf7, 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, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xf7, 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, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xfb, 0xde, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7e, 0xf7,
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, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0xbe, 0xf7, 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, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0xfb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xde, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e, 0xf7, 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, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e, 0xf7, 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, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0xfb, 0xde,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0xfb, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0x9e, 0xf7, 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, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e, 0xf7, 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, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf, 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, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xf7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e, 0xf7, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x84,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xbe, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0x7d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xde, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1e, 0x5a, 0x53, 0x0c, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x27, 0x85, 0xbf, 0xb0, 0x60, 0x13, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x2d, 0x7a, 0xd7, 0xf8, 0xec, 0xb8, 0x58, 0x1a, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x05, 0x28, 0x77, 0xde, 0xf9, 0xff, 0xfe, 0xf2, 0xbb, 0x4f, 0x09,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x20, 0x83, 0xd9, 0xf9, 0xfe, 0xff, 0xff, 0xfc, 0xec, 0x8c, 0x26,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x26, 0x87, 0xd1, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xf5, 0xc3, 0x5c, 0x10,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x2c, 0x7b, 0xd7, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc4, 0x6b, 0x22, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x05, 0x27, 0x74, 0xde, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xf4, 0xc5, 0x71, 0x16, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x20, 0x81, 0xd9, 0xf8, 0xfe, 0xff, 0xff, 0xfe, 0xf8, 0xc2, 0x6d, 0x17, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x06, 0x24, 0x87, 0xd1, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xf5, 0xc3, 0x67, 0x1f, 0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x08, 0x2b, 0x7c, 0xd5, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc3, 0x6a, 0x23, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05,
0x29, 0x74, 0xdd, 0xfa, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xc5, 0x70, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x22,
0x7f, 0xda, 0xf8, 0xfe, 0xff, 0xff, 0xfe, 0xf8, 0xc2, 0x6e, 0x17, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x23, 0x87,
0xd2, 0xf9, 0xfe, 0xff, 0xff, 0xff, 0xf6, 0xc4, 0x67, 0x1d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x2a, 0x7d, 0xd3,
0xf7, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc3, 0x69, 0x23, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x2a, 0x74, 0xdb, 0xf9,
0xff, 0xff, 0xff, 0xff, 0xf2, 0xc5, 0x70, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x23, 0x7d, 0xdb, 0xf8, 0xfe,
0xff, 0xff, 0xfe, 0xf8, 0xc3, 0x6f, 0x17, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x22, 0x87, 0xd3, 0xf9, 0xfe, 0xff,
0xff, 0xff, 0xf7, 0xc5, 0x68, 0x1c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x29, 0x7f, 0xd2, 0xf7, 0xff, 0xff, 0xff,
0xff, 0xf1, 0xc3, 0x68, 0x23, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x2b, 0x74, 0xda, 0xf9, 0xff, 0xff, 0xff, 0xff,
0xf1, 0xc6, 0x6f, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x24, 0x7c, 0xdd, 0xf8, 0xfe, 0xff, 0xff, 0xfe, 0xf7,
0xc3, 0x6f, 0x17, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x20, 0x87, 0xd4, 0xfa, 0xfe, 0xff, 0xff, 0xff, 0xf8, 0xc5,
0x68, 0x19, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x27, 0x80, 0xd1, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xf2, 0xc3, 0x68,
0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x2b, 0x74, 0xd8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc5, 0x6f, 0x1c,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x06, 0x25, 0x7a, 0xdd, 0xf8, 0xfe, 0xff, 0xff, 0xfe, 0xf6, 0xc3, 0x70, 0x17, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x05, 0x1f, 0x86, 0xd6, 0xfa, 0xfe, 0xff, 0xff, 0xff, 0xf8, 0xc4, 0x69, 0x17, 0x03, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0x27, 0x82, 0xd0, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xc2, 0x67, 0x23, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x07, 0x2c, 0x75, 0xd7, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xc5, 0x6e, 0x1d, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x26, 0x79, 0xdd, 0xf9, 0xfe, 0xff, 0xff, 0xfe, 0xf5, 0xc3, 0x70, 0x17, 0x03, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1e, 0x84, 0xd6, 0xf9, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0xc4, 0x6a, 0x16, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x5d, 0xc0, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xed, 0x80, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x57, 0xb4, 0xee, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xed, 0x8a, 0x35, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0d, 0x65, 0xbd, 0xf3, 0xfd, 0xff, 0xff, 0xff, 0xfc, 0xe0, 0x89, 0x28, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x02, 0x15, 0x5c, 0xc1, 0xf3, 0xfe, 0xff, 0xff, 0xfe, 0xfa, 0xda, 0x94, 0x27, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x1c, 0x5b, 0xbd, 0xef, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xda, 0x8d, 0x30, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x16, 0x65, 0xba, 0xee, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xdc, 0x83, 0x35, 0x06, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x0e, 0x67, 0xbd, 0xf4, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xe1, 0x87, 0x29, 0x08, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x5d, 0xc1, 0xf2, 0xfe, 0xff, 0xff, 0xfe, 0xfa, 0xda, 0x93, 0x28, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x59, 0xbe, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd9, 0x8f, 0x2e,
0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x16, 0x64, 0xbb, 0xed, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xdb, 0x84,
0x36, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x68, 0xbd, 0xf4, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xe3,
0x87, 0x2a, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x5f, 0xc0, 0xf2, 0xfd, 0xff, 0xff, 0xfe, 0xfb,
0xda, 0x92, 0x28, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1b, 0x58, 0xbe, 0xf0, 0xff, 0xff, 0xff, 0xff,
0xf8, 0xd9, 0x91, 0x2c, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x18, 0x63, 0xbb, 0xed, 0xff, 0xff, 0xff,
0xff, 0xf8, 0xdb, 0x85, 0x36, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x68, 0xbd, 0xf2, 0xfd, 0xff,
0xff, 0xff, 0xfb, 0xe3, 0x85, 0x2c, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x12, 0x60, 0xbf, 0xf2, 0xfd,
0xff, 0xff, 0xfe, 0xfb, 0xdb, 0x91, 0x28, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1a, 0x58, 0xbe, 0xf1,
0xff, 0xff, 0xff, 0xff, 0xf8, 0xd9, 0x92, 0x2a, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x19, 0x61, 0xbb,
0xed, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xda, 0x87, 0x36, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x68,
0xbb, 0xf1, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xe3, 0x84, 0x2e, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10,
0x61, 0xbe, 0xf2, 0xfd, 0xff, 0xff, 0xfe, 0xfb, 0xdb, 0x8f, 0x27, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x19, 0x58, 0xbf, 0xf2, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd9, 0x94, 0x29, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x1a, 0x60, 0xbd, 0xed, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xda, 0x88, 0x35, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x12, 0x68, 0xbb, 0xf0, 0xfd, 0xff, 0xff, 0xff, 0xfa, 0xe1, 0x83, 0x30, 0x07, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0x0f, 0x63, 0xbe, 0xf2, 0xfd, 0xff, 0xff, 0xfe, 0xfb, 0xdd, 0x8f, 0x28, 0x08, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x18, 0x58, 0xc0, 0xf4, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xdb, 0x96, 0x29, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x1c, 0x60, 0xbe, 0xee, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xdb, 0x8b, 0x35, 0x05,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x14, 0x69, 0xbc, 0xf0, 0xfe, 0xff, 0xff, 0xff, 0xfa, 0xdf, 0x6c, 0x13,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x65, 0xbf, 0xf3, 0xfd, 0xff, 0xff, 0xfb, 0xe5, 0x82, 0x20,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x17, 0x5b, 0xc2, 0xf4, 0xff, 0xfe, 0xea, 0x91, 0x39, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1d, 0x5f, 0xbe, 0xee, 0xde, 0x95, 0x3c, 0x0f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x15, 0x67, 0xa5, 0x94, 0x3d, 0x0a, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0d, 0x31, 0x30, 0x07, 0x01, 0x00, 0x00,
};
const lv_image_dsc_t icon_indicator_left = {
.header.cf = LV_COLOR_FORMAT_RGB565A8,
.header.magic = LV_IMAGE_HEADER_MAGIC,
.header.w = 36,
.header.h = 62,
.data_size = 2232 * 3,
.data = icon_indicator_left_map,
};
@@ -1,407 +0,0 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMAGE_ICON_INDICATOR_RIGHT
#define LV_ATTRIBUTE_IMAGE_ICON_INDICATOR_RIGHT
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_ICON_INDICATOR_RIGHT uint8_t
icon_indicator_right_map[] = {
0x00, 0x00, 0x00, 0x00, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xfd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x5d, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7d, 0xef, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e, 0xf7, 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, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xe7, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
0x7d, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x7d, 0xef, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0x1c, 0xe7, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x10, 0x84, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 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, 0x5d, 0xef, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1c, 0xe7, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x7d, 0xef,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9e, 0xf7, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x84, 0x9e, 0xf7, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1c, 0xe7,
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1c, 0xe7, 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, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7e, 0xf7, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x7a, 0xd6,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 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, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xbf, 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, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xdf, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0xdf, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdf, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, 0xd6, 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, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xbb, 0xde, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0xc6, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x75, 0xad, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x18, 0xc6, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0a, 0x29, 0x6d, 0x35, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x08, 0x3f, 0x97, 0xc9, 0x9b, 0x4a, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0a, 0x3f, 0x93, 0xe6, 0xf9, 0xe4, 0x9e, 0x43, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x2b, 0x98, 0xe6, 0xfd, 0xff, 0xfe, 0xe5, 0xa8, 0x39, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x74, 0xcd, 0xfa, 0xff, 0xff, 0xff, 0xfb, 0xe7, 0xa7, 0x3f, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x3b, 0xa2, 0xe9, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xe5, 0xa0, 0x49, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0b, 0x50, 0xa5, 0xea, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xe4, 0x9d, 0x44, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x08, 0x49, 0xb1, 0xea, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xe6, 0xa7, 0x39, 0x0d, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x10, 0x3f, 0xb0, 0xe9, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xe7, 0xa7, 0x3d, 0x0b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x10, 0x45, 0xa8, 0xe9, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xe5, 0xa2, 0x48, 0x05, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x0c, 0x50, 0xa4, 0xea, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xe5, 0x9d, 0x46, 0x0c, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x4b, 0xb0, 0xea, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xe5, 0xa5, 0x3b, 0x0d,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x3f, 0xb0, 0xe9, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xe6, 0xa7, 0x3c,
0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x43, 0xaa, 0xea, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xe5, 0xa4,
0x48, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0d, 0x4f, 0xa4, 0xea, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xe5,
0x9d, 0x48, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x4d, 0xae, 0xe9, 0xfb, 0xff, 0xff, 0xff, 0xff,
0xe5, 0xa4, 0x3c, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0x41, 0xb0, 0xe9, 0xfc, 0xff, 0xff, 0xff,
0xfc, 0xe5, 0xa7, 0x3a, 0x0c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x42, 0xac, 0xea, 0xff, 0xff, 0xff,
0xff, 0xfb, 0xe6, 0xa5, 0x46, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x4f, 0xa4, 0xea, 0xfc, 0xff,
0xff, 0xff, 0xfb, 0xe5, 0x9d, 0x48, 0x0b, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08, 0x4f, 0xac, 0xe9, 0xfb,
0xff, 0xff, 0xff, 0xff, 0xe5, 0xa2, 0x3d, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0e, 0x42, 0xb0, 0xe9,
0xfc, 0xff, 0xff, 0xff, 0xfc, 0xe5, 0xa7, 0x39, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x41, 0xae,
0xea, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xe7, 0xa7, 0x44, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0f, 0x4d,
0xa4, 0xea, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xe6, 0x9d, 0x49, 0x09, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x08,
0x4f, 0xaa, 0xe9, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xe4, 0xa0, 0x3f, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0x0d, 0x43, 0xb0, 0xea, 0xfc, 0xff, 0xff, 0xff, 0xfc, 0xe5, 0xa7, 0x39, 0x0d, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x0f, 0x3f, 0xb0, 0xea, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xe7, 0xa8, 0x43, 0x05, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x0f, 0x4b, 0xa4, 0xe9, 0xfd, 0xff, 0xff, 0xff, 0xfb, 0xe5, 0x9e, 0x4a, 0x08, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x08, 0x50, 0xa9, 0xe9, 0xfc, 0xff, 0xff, 0xff, 0xfe, 0xe4, 0xa0, 0x40, 0x0d, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0c, 0x46, 0xb1, 0xeb, 0xfc, 0xff, 0xff, 0xff, 0xfd, 0xe5, 0xa8, 0x3a, 0x0e, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x40, 0xb2, 0xeb, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xe7, 0xa8, 0x41, 0x05,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x64, 0xc6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xe4, 0x7a, 0x1c,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1f, 0x6e, 0xca, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd3, 0x72, 0x1b,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x1d, 0x5e, 0xce, 0xf6, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd9, 0x7f, 0x2a, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x1c, 0x62, 0xcc, 0xf4, 0xfe, 0xff, 0xff, 0xff, 0xfc, 0xd4, 0x80, 0x26, 0x07, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x1a, 0x6c, 0xc2, 0xf4, 0xfe, 0xff, 0xff, 0xff, 0xfd, 0xcd, 0x80, 0x2b, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x05, 0x1e, 0x67, 0xbe, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xf8, 0xd3, 0x7f, 0x31, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x1d, 0x5e, 0xcc, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd9, 0x7f, 0x2c, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
0x1d, 0x61, 0xcc, 0xf4, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xd4, 0x7f, 0x26, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1a,
0x6b, 0xc4, 0xf4, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xce, 0x7f, 0x2b, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1e, 0x68,
0xbe, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xf8, 0xd2, 0x7f, 0x30, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1c, 0x5d, 0xcb,
0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd9, 0x7f, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1e, 0x60, 0xcc, 0xf4,
0xfe, 0xff, 0xff, 0xff, 0xfa, 0xd5, 0x7f, 0x26, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1a, 0x6b, 0xc6, 0xf3, 0xfe,
0xff, 0xff, 0xff, 0xff, 0xce, 0x7f, 0x2a, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1e, 0x6a, 0xbe, 0xf8, 0xfe, 0xff,
0xff, 0xff, 0xf9, 0xd1, 0x7f, 0x30, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1c, 0x5f, 0xc8, 0xf8, 0xff, 0xff, 0xff,
0xff, 0xf8, 0xd8, 0x7f, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1e, 0x5f, 0xcc, 0xf4, 0xfe, 0xff, 0xff, 0xff,
0xfa, 0xd6, 0x7f, 0x27, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1a, 0x6a, 0xc9, 0xf4, 0xfd, 0xff, 0xff, 0xff, 0xff,
0xcf, 0x7f, 0x29, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1e, 0x6b, 0xbe, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0xd0,
0x7f, 0x2f, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x1c, 0x60, 0xc7, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xd7, 0x7f,
0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1e, 0x5e, 0xcd, 0xf4, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0xd7, 0x80, 0x28,
0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02, 0x1a, 0x68, 0xcb, 0xf4, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x80, 0x28, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x05, 0x1d, 0x6c, 0xbe, 0xf8, 0xfe, 0xff, 0xff, 0xff, 0xfa, 0xcf, 0x7f, 0x2f, 0x06, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x1d, 0x62, 0xc4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd6, 0x7f, 0x2f, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x04, 0x1e, 0x5e, 0xcd, 0xf4, 0xfe, 0xff, 0xff, 0xff, 0xf9, 0xd8, 0x7f, 0x29, 0x05, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x1a, 0x68, 0xcd, 0xf4, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x7f, 0x27, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1c, 0x6c, 0xbf, 0xf7, 0xfe, 0xff, 0xff, 0xff, 0xfa, 0xce, 0x7f, 0x2d, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x49, 0xb8, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xd5, 0x7f, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x69, 0xc5, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0xd9, 0x7f, 0x2a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x1c, 0x79, 0xce, 0xfd, 0xff, 0xff, 0xd2, 0x7f, 0x26, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0x2b, 0x77, 0xcd, 0xf3, 0xce, 0x7f, 0x2c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0x2a, 0x76, 0xb2, 0x7a, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x04, 0x14, 0x3f, 0x1d, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
const lv_image_dsc_t icon_indicator_right = {
.header.cf = LV_COLOR_FORMAT_RGB565A8,
.header.magic = LV_IMAGE_HEADER_MAGIC,
.header.w = 36,
.header.h = 62,
.data_size = 2232 * 3,
.data = icon_indicator_right_map,
};
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,99 +0,0 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMAGE_ICON_WIFI_HIGH
#define LV_ATTRIBUTE_IMAGE_ICON_WIFI_HIGH
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_ICON_WIFI_HIGH uint8_t icon_wifi_high_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 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, 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, 0x00, 0x00, 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, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x5f, 0x6f, 0x80, 0x5f, 0x40, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6f, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x60,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xdf, 0x70, 0x00, 0x00, 0x20, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xcf, 0x10, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x10, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x10, 0x00, 0x20, 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x20, 0xef, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
};
const lv_image_dsc_t icon_wifi_high = {
.header.cf = LV_COLOR_FORMAT_RGB565A8,
.header.magic = LV_IMAGE_HEADER_MAGIC,
.header.w = 20,
.header.h = 20,
.data_size = 400 * 3,
.data = icon_wifi_high_map,
};
@@ -1,99 +0,0 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMAGE_ICON_WIFI_LOW
#define LV_ATTRIBUTE_IMAGE_ICON_WIFI_LOW
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_ICON_WIFI_LOW uint8_t icon_wifi_low_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x5f, 0x6f, 0x80, 0x5f, 0x40, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6f, 0xbf, 0xff, 0xef, 0xdf, 0xcf, 0xbf, 0xdf, 0xff, 0xff, 0xbf, 0x60,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xef, 0xef, 0x80, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x9f,
0xdf, 0xdf, 0x70, 0x00, 0x00, 0x20, 0xbf, 0xef, 0x80, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x70, 0xef, 0xcf, 0x10, 0x50, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x40, 0xff, 0x50, 0x10, 0xdf, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xdf, 0x10, 0x00, 0x20, 0xef, 0x8f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x40, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0x40, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xff, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xef, 0x20, 0x20,
0x8f, 0x9f, 0xaf, 0x80, 0x20, 0x20, 0xdf, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xef,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x20, 0xef, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
};
const lv_image_dsc_t icon_wifi_low = {
.header.cf = LV_COLOR_FORMAT_RGB565A8,
.header.magic = LV_IMAGE_HEADER_MAGIC,
.header.w = 20,
.header.h = 20,
.data_size = 400 * 3,
.data = icon_wifi_low_map,
};
@@ -1,103 +0,0 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMAGE_ICON_WIFI_MEDIUM
#define LV_ATTRIBUTE_IMAGE_ICON_WIFI_MEDIUM
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_ICON_WIFI_MEDIUM uint8_t
icon_wifi_medium_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x40, 0x5f, 0x6f, 0x80, 0x5f, 0x40, 0x10,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x6f, 0xbf, 0xff, 0xef, 0xdf, 0xcf, 0xbf, 0xdf,
0xff, 0xff, 0xbf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xef, 0xef, 0x80, 0x40, 0x10, 0x00, 0x00,
0x00, 0x00, 0x00, 0x40, 0x9f, 0xdf, 0xdf, 0x70, 0x00, 0x00, 0x20, 0xbf, 0xef, 0x80, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xef, 0xcf, 0x10, 0x50, 0xff, 0x30, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xff, 0x50, 0x10, 0xdf, 0xbf, 0x00,
0x00, 0x00, 0x00, 0x20, 0x5f, 0x6f, 0x6f, 0x50, 0x20, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xdf, 0x10, 0x00, 0x20,
0xef, 0x8f, 0x00, 0x50, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x60, 0x00, 0x80, 0xdf, 0x20, 0x00,
0x00, 0x00, 0x40, 0xff, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0xff, 0x30,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xaf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xdf, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xdf, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xef,
0xff, 0xff, 0xff, 0xff, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x40, 0xff, 0xff, 0xff, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
};
const lv_image_dsc_t icon_wifi_medium = {
.header.cf = LV_COLOR_FORMAT_RGB565A8,
.header.magic = LV_IMAGE_HEADER_MAGIC,
.header.w = 20,
.header.h = 20,
.data_size = 400 * 3,
.data = icon_wifi_medium_map,
};
@@ -1,103 +0,0 @@
#ifdef __has_include
#if __has_include("lvgl.h")
#ifndef LV_LVGL_H_INCLUDE_SIMPLE
#define LV_LVGL_H_INCLUDE_SIMPLE
#endif
#endif
#endif
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMAGE_ICON_WIFI_SLASH
#define LV_ATTRIBUTE_IMAGE_ICON_WIFI_SLASH
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMAGE_ICON_WIFI_SLASH uint8_t
icon_wifi_slash_map[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 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, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
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, 0x00, 0x00, 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, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 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, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 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,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x00, 0x00, 0x30, 0x5f, 0x6f, 0x80, 0x5f, 0x40, 0x10,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xdf, 0x20, 0x30, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xbf, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xef, 0xff, 0xcf, 0x10, 0x80, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x70, 0x00, 0x00, 0x20, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xbf, 0x00,
0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xcf, 0x10, 0x50, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x9f, 0x00, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x50, 0x10, 0xdf, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x10, 0x00, 0x20,
0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x10, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdf, 0x20, 0x00,
0x00, 0x00, 0x40, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x70, 0x20, 0xdf, 0xff, 0xff, 0xff, 0xff, 0x30,
0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x20, 0xdf, 0xff, 0xff,
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0x30, 0x20,
0xef, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xef, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xdf, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xef,
0xff, 0xff, 0xff, 0xff, 0xdf, 0xcf, 0xdf, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x40, 0xff, 0xff, 0xff, 0xff, 0x40, 0x10, 0xcf, 0xcf, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x70, 0xff, 0xff, 0x80, 0x00, 0x00, 0x20, 0xdf, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x50, 0x00, 0x00, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
};
const lv_image_dsc_t icon_wifi_slash = {
.header.cf = LV_COLOR_FORMAT_RGB565A8,
.header.magic = LV_IMAGE_HEADER_MAGIC,
.header.w = 20,
.header.h = 20,
.data_size = 400 * 3,
.data = icon_wifi_slash_map,
};
File diff suppressed because it is too large Load Diff
@@ -177,6 +177,8 @@ void CoreS3AudioCodec::CreateDuplexChannels(gpio_num_t mclk, gpio_num_t bclk, gp
ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle_, &std_cfg));
ESP_ERROR_CHECK(i2s_channel_init_tdm_mode(rx_handle_, &tdm_cfg));
ESP_ERROR_CHECK(i2s_channel_enable(tx_handle_));
ESP_ERROR_CHECK(i2s_channel_enable(rx_handle_));
ESP_LOGI(TAG, "Duplex channels created");
}
-8
View File
@@ -92,12 +92,6 @@ void disply_lvgl_unlock()
display->LvglUnlock();
}
void display_setup_xiaozhi_ui()
{
auto display = static_cast<DISPLAY_TYPE*>(Board::GetInstance().GetDisplay());
display->SetupXiaoZhiUI();
}
/* -------------------------------------------------------------------------- */
/* Application */
/* -------------------------------------------------------------------------- */
@@ -110,8 +104,6 @@ void xiaozhi_board_init()
void start_xiaozhi_app()
{
display_setup_xiaozhi_ui();
set_xiaozhi_mode(true);
// Initialize and run the application
+2 -1
View File
@@ -37,7 +37,6 @@ void toggle_xiaozhi_chat_state();
void disply_lvgl_lock();
void disply_lvgl_unlock();
lv_disp_t* display_get_lvgl_display();
void display_setup_xiaozhi_ui();
void xiaozhi_board_init();
void start_xiaozhi_app();
@@ -49,6 +48,8 @@ int board_get_battery_level();
bool board_is_battery_charging();
void board_set_backlight_brightness(uint8_t brightness, bool permanent = false);
uint8_t board_get_backlight_brightness();
void board_set_speaker_volume(uint8_t volume, bool permanent = false);
uint8_t board_get_speaker_volume();
void app_play_sound(const std::string_view& sound);
+23 -1
View File
@@ -16,7 +16,6 @@
#include <esp_lcd_panel_ops.h>
#include <esp_lcd_ili9341.h>
#include <esp_timer.h>
// #include "esp32_camera.h"
#include "stackchan_camera.h"
#include "hal_bridge.h"
@@ -59,6 +58,7 @@ public:
WriteReg(0x90, 0xBF);
WriteReg(0x94, 33 - 5);
WriteReg(0x95, 33 - 5);
WriteReg(0x27, 0x00);
auto ret = setChargerConstantCurr(XPOWERS_AXP2101_CHG_CUR_700MA);
if (!ret) {
@@ -541,6 +541,28 @@ uint8_t hal_bridge::board_get_backlight_brightness()
}
}
void hal_bridge::board_set_speaker_volume(uint8_t volume, bool permanent)
{
auto& board = Board::GetInstance();
auto audio_codec = board.GetAudioCodec();
if (audio_codec) {
if (permanent) {
audio_codec->SetOutputVolume(volume);
}
}
}
uint8_t hal_bridge::board_get_speaker_volume()
{
int volume = 70;
Settings settings("audio", false);
volume = settings.GetInt("output_volume", volume);
if (volume <= 0) {
volume = 10;
}
return volume;
}
void hal_bridge::toggle_xiaozhi_chat_state()
{
auto& app = Application::GetInstance();
+44 -7
View File
@@ -10,6 +10,7 @@
#include <esp_psram.h>
#include <vector>
#include <cstring>
#include <src/misc/cache/lv_cache.h>
#include <settings.h>
#include <lvgl.h>
#include <lvgl_theme.h>
@@ -228,8 +229,16 @@ lv_disp_t* StackChanAvatarDisplay::GetLvglDisplay()
#include <hal/board/hal_bridge.h>
void StackChanAvatarDisplay::SetupXiaoZhiUI()
void StackChanAvatarDisplay::SetupUI()
{
// Prevent duplicate calls - if already called, return early
if (setup_ui_called_) {
ESP_LOGW(TAG, "SetupUI() called multiple times, skipping duplicate call");
return;
}
Display::SetupUI(); // Mark SetupUI as called
auto& stackchan = GetStackChan();
if (stackchan.hasAvatar()) {
@@ -243,7 +252,11 @@ void StackChanAvatarDisplay::SetupXiaoZhiUI()
auto avatar = std::make_unique<DefaultAvatar>();
avatar->init(lv_screen_active());
avatar->getPanel()->onClick().connect([]() { hal_bridge::toggle_xiaozhi_chat_state(); });
avatar->getPanel()->onClick().connect([]() {
if (hal_bridge::is_xiaozhi_ready()) {
hal_bridge::toggle_xiaozhi_chat_state();
}
});
stackchan.attachAvatar(std::move(avatar));
stackchan.addModifier(std::make_unique<BreathModifier>());
@@ -283,7 +296,7 @@ void StackChanAvatarDisplay::SetEmotion(const char* emotion)
DisplayLockGuard lock(this);
ESP_LOGE(TAG, "SetEmotion: %s", emotion);
// ESP_LOGE(TAG, "SetEmotion: %s", emotion);
auto& avatar = stackchan.avatar();
@@ -335,12 +348,16 @@ void StackChanAvatarDisplay::SetEmotion(const char* emotion)
void StackChanAvatarDisplay::SetChatMessage(const char* role, const char* content)
{
if (!setup_ui_called_) {
ESP_LOGW(TAG, "SetChatMessage('%s', '%s') called before SetupUI() - message will be lost!", role, content);
}
auto& stackchan = GetStackChan();
if (!stackchan.hasAvatar()) {
return;
}
ESP_LOGE(TAG, "SetChatMessage: role=%s, content=%s", role ? role : "null", content ? content : "null");
// ESP_LOGE(TAG, "SetChatMessage: role=%s, content=%s", role ? role : "null", content ? content : "null");
DisplayLockGuard lock(this);
@@ -351,6 +368,20 @@ void StackChanAvatarDisplay::SetChatMessage(const char* role, const char* conten
}
}
void StackChanAvatarDisplay::ClearChatMessages()
{
auto& stackchan = GetStackChan();
if (!stackchan.hasAvatar()) {
return;
}
DisplayLockGuard lock(this);
stackchan.avatar().clearSpeech();
ESP_LOGI(TAG, "Chat messages cleared");
}
void StackChanAvatarDisplay::SetPreviewImage(std::unique_ptr<LvglImage> image)
{
DisplayLockGuard lock(this);
@@ -380,6 +411,10 @@ void StackChanAvatarDisplay::SetPreviewImage(std::unique_ptr<LvglImage> image)
ESP_ERROR_CHECK(esp_timer_start_once(preview_timer_, 6000 * 1000));
}
void StackChanAvatarDisplay::UpdateStatusBar(bool update_all)
{
}
void StackChanAvatarDisplay::SetTheme(Theme* theme)
{
ESP_LOGI(TAG, "SetTheme: %s", theme->name().c_str());
@@ -407,9 +442,7 @@ bool hal_bridge::is_xiaozhi_ready()
void StackChanAvatarDisplay::SetStatus(const char* status)
{
ESP_LOGE(TAG, "SetStatus: %s", status);
LvglDisplay::SetStatus(status);
// ESP_LOGE(TAG, "SetStatus: %s", status);
auto& stackchan = GetStackChan();
if (!stackchan.hasAvatar()) {
@@ -491,3 +524,7 @@ void StackChanAvatarDisplay::SetStatus(const char* status)
avatar.setSpeech("");
}
}
void StackChanAvatarDisplay::ShowNotification(const char* notification, int duration_ms)
{
}
+4 -1
View File
@@ -38,11 +38,14 @@ public:
// Override Display methods to control Robot
virtual void SetEmotion(const char* emotion) override;
virtual void SetChatMessage(const char* role, const char* content) override;
virtual void ClearChatMessages() override;
virtual void SetPreviewImage(std::unique_ptr<LvglImage> image) override;
virtual void UpdateStatusBar(bool update_all = false) override;
virtual void SetupUI() override;
virtual void SetTheme(Theme* theme) override;
virtual void SetStatus(const char* status) override;
virtual void ShowNotification(const char* notification, int duration_ms = 3000) override;
void SetupXiaoZhiUI();
void LvglLock();
void LvglUnlock();
lv_disp_t* GetLvglDisplay();
+42 -28
View File
@@ -48,6 +48,7 @@ void Hal::init()
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <system_info.h>
#include <esp_ota_ops.h>
#include <esp_system.h>
#include <esp_timer.h>
#include <esp_mac.h>
@@ -86,8 +87,38 @@ void Hal::reboot()
esp_restart();
}
static void _confirm_ota_image_if_stable()
{
constexpr uint32_t ota_confirm_delay_ms = 20000;
static bool ota_confirm_checked = false;
if (ota_confirm_checked || GetHAL().millis() < ota_confirm_delay_ms) {
return;
}
ota_confirm_checked = true;
const esp_partition_t* running = esp_ota_get_running_partition();
if (running == nullptr) {
mclog::tagError(_tag, "failed to get running partition for ota confirmation");
return;
}
esp_ota_img_states_t ota_state;
if (esp_ota_get_state_partition(running, &ota_state) != ESP_OK) {
mclog::tagError(_tag, "failed to get ota state for partition: {}", running->label);
return;
}
mclog::tagInfo(_tag, "ota confirm check: partition={}, state={}", running->label, static_cast<int>(ota_state));
if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) {
mclog::tagInfo(_tag, "ota image is stable, marking current app valid");
esp_ota_mark_app_valid_cancel_rollback();
}
}
void Hal::updateHeapStatusLog()
{
_confirm_ota_image_if_stable();
static uint32_t last_log_tick = 0;
if (millis() - last_log_tick < 10000) {
return;
@@ -164,7 +195,7 @@ void Hal::startXiaozhi()
});
// Start stackchan update task
xTaskCreate(_stackchan_update_task, "stackchan", 4096, NULL, 5, NULL);
xTaskCreatePinnedToCore(_stackchan_update_task, "stackchan", 4096, NULL, 5, NULL, 1);
hal_bridge::start_xiaozhi_app();
}
@@ -211,6 +242,16 @@ uint8_t Hal::getBackLightBrightness()
return hal_bridge::board_get_backlight_brightness();
}
void Hal::setSpeakerVolume(uint8_t volume, bool permanent)
{
hal_bridge::board_set_speaker_volume(volume, permanent);
}
uint8_t Hal::getSpeakerVolume()
{
return hal_bridge::board_get_speaker_volume();
}
/* -------------------------------------------------------------------------- */
/* Lvgl */
/* -------------------------------------------------------------------------- */
@@ -252,33 +293,6 @@ void Hal::lvgl_init()
hal_bridge::disply_lvgl_unlock();
}
lv_timer_t* _timer_stackchan_update = NULL;
void Hal::startStackChanAutoUpdate(int fps)
{
mclog::tagInfo(_tag, "start stack chan auto update with fps: {}", fps);
if (_timer_stackchan_update) {
mclog::tagWarn(_tag, "stack chan auto update already started");
return;
}
_timer_stackchan_update = lv_timer_create([](lv_timer_t* timer) { GetStackChan().update(); }, 1000 / fps, NULL);
}
void Hal::stopStackChanAutoUpdate()
{
mclog::tagInfo(_tag, "stop stack chan auto update");
if (!_timer_stackchan_update) {
mclog::tagWarn(_tag, "stack chan auto update already stopped");
return;
}
lv_timer_delete(_timer_stackchan_update);
_timer_stackchan_update = NULL;
}
/* -------------------------------------------------------------------------- */
/* Warm Reboot */
/* -------------------------------------------------------------------------- */
+56 -6
View File
@@ -73,6 +73,23 @@ enum class CommonLogLevel {
Error,
};
/**
* @brief
*
*/
namespace app_center {
struct AppInfo_t {
std::string name;
std::string iconUrl;
std::string description;
std::string firmwareUrl;
};
using AppInfoList_t = std::vector<AppInfo_t>;
}; // namespace app_center
/**
* @brief
*
@@ -84,6 +101,15 @@ enum class WifiStatus {
High,
};
/**
* @brief
*
*/
struct UserAccountInfo_t {
std::string username;
std::string deviceName;
};
/**
* @brief
*
@@ -97,6 +123,7 @@ public:
_panel->setAlign(LV_ALIGN_CENTER);
_panel->setBorderWidth(0);
_panel->setBgOpa(0);
_panel->setPaddingAll(0);
_label_logo = std::make_unique<uitk::lvgl_cpp::Label>(_panel->get());
_label_logo->setTextFont(&lv_font_montserrat_24);
@@ -109,12 +136,19 @@ public:
_label_msg->setTextColor(lv_color_hex(0xBFBFBF));
_label_msg->align(LV_ALIGN_CENTER, 0, 14);
_label_msg->setText("Starting up ...");
_label_version = std::make_unique<uitk::lvgl_cpp::Label>(_panel->get());
_label_version->setTextFont(&lv_font_montserrat_14);
_label_version->setTextColor(lv_color_hex(0x8B8B8B));
_label_version->align(LV_ALIGN_BOTTOM_RIGHT, -7, -6);
_label_version->setText("V" FIRMWARE_VERSION);
}
private:
std::unique_ptr<uitk::lvgl_cpp::Container> _panel;
std::unique_ptr<uitk::lvgl_cpp::Label> _label_logo;
std::unique_ptr<uitk::lvgl_cpp::Label> _label_msg;
std::unique_ptr<uitk::lvgl_cpp::Label> _label_version;
};
/**
@@ -167,14 +201,11 @@ public:
bool isBleConnected();
void startAppConfigServer();
bool isAppConfiged();
void resetAppConfiged();
/* --------------------------------- HeadPet -------------------------------- */
uitk::Signal<HeadPetGesture> onHeadPetGesture;
/* -------------------------------- StackChan ------------------------------- */
void startStackChanAutoUpdate(int fps); // Start the auto update with lvgl timer
void stopStackChanAutoUpdate();
/* ----------------------------------- RGB ---------------------------------- */
void setRgbColor(uint8_t index, uint8_t r, uint8_t g, uint8_t b);
void showRgbColor(uint8_t r, uint8_t g, uint8_t b);
@@ -205,7 +236,6 @@ public:
void syncSystemTimeToRtc();
void setTimezone(std::string_view tz);
std::string getTimezone();
void resetTimezoneConfig();
/* --------------------------------- EspNow --------------------------------- */
uitk::Signal<const std::vector<uint8_t>&> onEspNowData;
@@ -223,13 +253,33 @@ public:
WifiStatus getWifiStatus();
void startSntp();
/* -------------------------------- App center ------------------------------- */
app_center::AppInfoList_t fetchAppList();
void launchApp(std::string_view url, std::function<void(int)> onProgress);
/* --------------------------------- EzData --------------------------------- */
void startEzDataService(std::function<void(std::string_view)> onStartLog);
uitk::Signal<std::string_view> onEzdataPairCode;
/* ------------------------------- User Acount ------------------------------ */
UserAccountInfo_t getUserAccountInfo();
bool updateAccountInfo(std::function<void(std::string_view)> onLog);
bool unbindAccount(std::function<void(std::string_view)> onLog);
/* ----------------------------------- OTA ---------------------------------- */
bool updateFirmware(std::function<void(std::string_view)> onLog);
/* ---------------------------------- Audio --------------------------------- */
void setSpeakerVolume(uint8_t volume, bool permanent = false);
uint8_t getSpeakerVolume();
private:
bool _xiaozhi_start_requested = false;
void xiaozhi_board_init();
void lvgl_init();
void xiaozhi_mcp_init();
void ble_init();
void ble_init(bool useAltUuid);
void servo_init();
void head_touch_init();
void io_expander_init();
+246
View File
@@ -0,0 +1,246 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#include "hal.h"
#include "utils/secret_logic/secret_logic.h"
#include <settings.h>
#include <mooncake_log.h>
#include <memory>
#include <board.h>
#include <cJSON.h>
static const std::string_view _tag = "HAL-Account";
static const std::string_view _setting_ns = "account";
static const std::string_view _setting_username_key = "username";
static const std::string_view _setting_device_name_key = "device_name";
static const std::string_view _get_user_account_info_url = "http://47.113.125.164:12800/stackChan/device/user";
static const std::string_view _get_device_info_url = "http://47.113.125.164:12800/stackChan/device/info";
static const std::string_view _unbind_user_account_info_url = "http://47.113.125.164:12800/stackChan/device/unbind";
static bool request_authorized_get(std::string_view token, std::string_view url, std::string &response,
std::function<void(std::string_view)> onLog)
{
auto &board = Board::GetInstance();
auto network = board.GetNetwork();
auto http = network->CreateHttp(0);
if (!http) {
mclog::tagError(_tag, "failed to create http client");
onLog("Failed to create HTTP client");
return false;
}
http->SetHeader("Authorization", std::string(token));
if (!http->Open("GET", std::string(url))) {
mclog::tagError(_tag, "failed to open http request: {}", url);
onLog("Failed to connect to server");
return false;
}
int status_code = http->GetStatusCode();
if (status_code != 200) {
mclog::tagError(_tag, "http get failed, status code: {}, url: {}", status_code, url);
onLog("HTTP Request Failed");
return false;
}
response = http->ReadAll();
mclog::tagInfo(_tag, "response from {}: {}", url, response);
return true;
}
static bool fetch_username(std::string_view token, std::string &username, std::function<void(std::string_view)> onLog)
{
onLog("Updating user account info...");
std::string response;
if (!request_authorized_get(token, _get_user_account_info_url, response, onLog)) {
return false;
}
cJSON *root = cJSON_Parse(response.c_str());
if (!root) {
mclog::tagError(_tag, "failed to parse user account json");
onLog("Failed to parse response");
return false;
}
bool success = false;
cJSON *code = cJSON_GetObjectItem(root, "code");
cJSON *data = cJSON_GetObjectItem(root, "data");
const char *username_value = nullptr;
if (data && cJSON_IsString(data)) {
username_value = data->valuestring;
} else if (data && cJSON_IsObject(data)) {
cJSON *username_json = cJSON_GetObjectItem(data, "username");
if (username_json && cJSON_IsString(username_json)) {
username_value = username_json->valuestring;
}
}
if (code && cJSON_IsNumber(code) && code->valueint == 0 && username_value != nullptr) {
username = username_value;
success = true;
} else {
mclog::tagError(_tag, "invalid user account response format or error code");
onLog("Invalid response from server");
}
cJSON_Delete(root);
return success;
}
static bool fetch_device_name(std::string_view token, std::string &deviceName,
std::function<void(std::string_view)> onLog)
{
onLog("Updating device info...");
std::string response;
if (!request_authorized_get(token, _get_device_info_url, response, onLog)) {
return false;
}
cJSON *root = cJSON_Parse(response.c_str());
if (!root) {
mclog::tagError(_tag, "failed to parse device info json");
onLog("Failed to parse response");
return false;
}
bool success = false;
cJSON *code = cJSON_GetObjectItem(root, "code");
cJSON *data = cJSON_GetObjectItem(root, "data");
cJSON *target = root;
if (code && cJSON_IsNumber(code)) {
if (code->valueint != 0) {
mclog::tagError(_tag, "device info request failed, code: {}", code->valueint);
onLog("Invalid response from server");
cJSON_Delete(root);
return false;
}
if (data && cJSON_IsObject(data)) {
target = data;
}
}
cJSON *name_json = cJSON_GetObjectItem(target, "name");
if (name_json && cJSON_IsString(name_json)) {
deviceName = name_json->valuestring;
success = true;
} else {
mclog::tagError(_tag, "invalid device info response format");
onLog("Invalid response from server");
}
cJSON_Delete(root);
return success;
}
UserAccountInfo_t Hal::getUserAccountInfo()
{
UserAccountInfo_t info;
Settings settings(_setting_ns.data(), false);
info.username = settings.GetString(_setting_username_key.data(), "Account Info");
info.deviceName = settings.GetString(_setting_device_name_key.data(), "");
return info;
}
bool Hal::updateAccountInfo(std::function<void(std::string_view)> onLog)
{
std::string token = secret_logic::generate_auth_token();
std::string username;
if (!fetch_username(token, username, onLog)) {
return false;
}
std::string device_name;
if (!fetch_device_name(token, device_name, onLog)) {
return false;
}
Settings settings(_setting_ns.data(), true);
settings.SetString(_setting_username_key.data(), username);
settings.SetString(_setting_device_name_key.data(), device_name);
mclog::tagInfo(_tag, "account updated: username={}, device_name={}", username, device_name);
onLog(std::string("Account updated: ") + username);
return true;
}
bool Hal::unbindAccount(std::function<void(std::string_view)> onLog)
{
std::string token = secret_logic::generate_auth_token();
auto &board = Board::GetInstance();
auto network = board.GetNetwork();
auto http = network->CreateHttp(0);
if (!http) {
mclog::tagError(_tag, "failed to create http client");
onLog("Failed to create HTTP client");
return false;
}
http->SetHeader("Authorization", token);
http->SetContent(std::string());
mclog::tagInfo(_tag, "requesting to unbind account...");
onLog("Unbinding account...");
if (!http->Open("POST", std::string(_unbind_user_account_info_url))) {
mclog::tagError(_tag, "failed to open http request");
onLog("Failed to connect to server");
return false;
}
int status_code = http->GetStatusCode();
if (status_code != 200) {
mclog::tagError(_tag, "http post failed, status code: {}", status_code);
onLog("HTTP Request Failed");
return false;
}
std::string response = http->ReadAll();
mclog::tagInfo(_tag, "response: {}", response);
cJSON *root = cJSON_Parse(response.c_str());
if (!root) {
mclog::tagError(_tag, "failed to parse json");
onLog("Failed to parse response");
return false;
}
bool success = false;
cJSON *code = cJSON_GetObjectItem(root, "code");
if (code && cJSON_IsNumber(code) && code->valueint == 0) {
Settings settings(_setting_ns.data(), true);
settings.SetString(_setting_username_key.data(), "Account Info");
settings.SetString(_setting_device_name_key.data(), "");
mclog::tagInfo(_tag, "account unbound successfully");
onLog("Account unbound successfully");
success = true;
} else {
mclog::tagError(_tag, "invalid response format or error code");
cJSON *msg = cJSON_GetObjectItem(root, "message");
if (msg && cJSON_IsString(msg)) {
onLog(std::string("Unbind failed: ") + msg->valuestring);
} else {
onLog("Invalid response from server");
}
}
cJSON_Delete(root);
if (success) {
resetAppConfiged();
}
return success;
}
+122
View File
@@ -0,0 +1,122 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#include "hal.h"
#include "utils/ota/ota.h"
#include <mooncake_log.h>
#include <memory>
#include <board.h>
#include <cJSON.h>
static const std::string_view _tag = "HAL-AppCenter";
static const std::string_view _app_info_list_url = "http://47.113.125.164:12800/stackChan/apps";
static const char *get_json_string(cJSON *item, std::initializer_list<const char *> keys)
{
for (const auto *key : keys) {
cJSON *value = cJSON_GetObjectItemCaseSensitive(item, key);
if (cJSON_IsString(value) && value->valuestring != nullptr) {
return value->valuestring;
}
}
return nullptr;
}
app_center::AppInfoList_t Hal::fetchAppList()
{
app_center::AppInfoList_t app_list;
auto &board = Board::GetInstance();
auto network = board.GetNetwork();
auto http = network->CreateHttp(0);
if (!http->Open("GET", std::string(_app_info_list_url))) {
mclog::tagError(_tag, "failed to open http connection");
return app_list;
}
if (http->GetStatusCode() != 200) {
mclog::tagError(_tag, "failed to fetch app list, status code: {}", http->GetStatusCode());
http->Close();
return app_list;
}
std::string data = http->ReadAll();
http->Close();
cJSON *root = cJSON_Parse(data.c_str());
if (root == NULL) {
mclog::tagError(_tag, "failed to parse json response");
return app_list;
}
cJSON *app_array = nullptr;
if (cJSON_IsArray(root)) {
app_array = root;
} else if (cJSON_IsObject(root)) {
cJSON *code = cJSON_GetObjectItemCaseSensitive(root, "code");
if (cJSON_IsNumber(code) && code->valueint != 0) {
cJSON *message = cJSON_GetObjectItemCaseSensitive(root, "message");
mclog::tagError(_tag, "failed to fetch app list, code: {}, message: {}", code->valueint,
cJSON_IsString(message) ? message->valuestring : "unknown");
cJSON_Delete(root);
return app_list;
}
app_array = cJSON_GetObjectItemCaseSensitive(root, "data");
if (!cJSON_IsArray(app_array)) {
mclog::tagError(_tag, "invalid app list response: data is not an array");
cJSON_Delete(root);
return app_list;
}
}
if (cJSON_IsArray(app_array)) {
cJSON *item = NULL;
cJSON_ArrayForEach(item, app_array)
{
app_center::AppInfo_t info;
if (const char *name = get_json_string(item, {"appName", "name"})) {
info.name = name;
}
if (const char *icon = get_json_string(item, {"iconUrl", "appIcon", "icon"})) {
info.iconUrl = icon;
}
if (const char *desc = get_json_string(item, {"description", "appDescription", "desc"})) {
info.description = desc;
}
if (const char *url = get_json_string(item, {"firmwareUrl", "downloadUrl", "otaUrl", "url"})) {
info.firmwareUrl = url;
}
app_list.push_back(info);
}
} else {
mclog::tagError(_tag, "invalid app list response: unexpected json shape");
}
cJSON_Delete(root);
return app_list;
}
static std::function<void(int)> _on_progress = nullptr;
static void ota_callback(int progress)
{
if (_on_progress) {
_on_progress(progress);
}
}
void Hal::launchApp(std::string_view url, std::function<void(int)> onProgress)
{
mclog::tagInfo(_tag, "launching app from url: {}", url);
_on_progress = onProgress;
start_ota_update(url.data(), ota_callback);
}
+10 -4
View File
@@ -48,7 +48,7 @@ static uint8_t _handle_ble_battery_read(void)
return 96;
}
void Hal::ble_init()
void Hal::ble_init(bool useAltUuid)
{
mclog::tagInfo(_tag, "init");
@@ -61,7 +61,7 @@ void Hal::ble_init()
};
stackchan_ble_register_callbacks(&ble_callbacks);
ble_prph_init();
ble_prph_init(useAltUuid);
uint8_t mac[6];
esp_read_mac(mac, ESP_MAC_EFUSE_FACTORY);
@@ -72,7 +72,7 @@ void Hal::ble_init()
void Hal::startBleServer()
{
mclog::tagInfo(_tag, "start ble server");
ble_init();
ble_init(false);
}
bool Hal::isBleConnected()
@@ -273,7 +273,7 @@ void Hal::startAppConfigServer()
{
mclog::tagInfo(_tag, "start app config server");
ble_init();
ble_init(true);
mooncake::GetMooncake().extensionManager()->createAbility(std::make_unique<AppConfigServerWorker>());
}
@@ -283,3 +283,9 @@ bool Hal::isAppConfiged()
Settings settings("app_config", false);
return settings.GetBool("is_configed", false);
}
void Hal::resetAppConfiged()
{
Settings settings("app_config", true);
settings.SetBool("is_configed", false);
}
+465
View File
@@ -0,0 +1,465 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#include "hal.h"
#include <stackchan/stackchan.h>
#include <mooncake.h>
#include <mooncake_log.h>
#include <ArduinoJson.hpp>
#include <cstdint>
#include <board.h>
#include <mqtt.h>
#include <esp_log.h>
#include <mutex>
#include <queue>
#include <vector>
#include <map>
using namespace stackchan;
static std::string _tag = "EzData";
class EzData {
public:
enum class CmdType : int {
// --- 数据操作 (100-102) ---
DeviceAddData = 100, ///< 设备端新增数据
DeviceUpdateData = 101, ///< 设备端修改数据
DeviceDeleteData = 102, ///< 设备端删除数据
// --- 数据查询 (103-104) ---
DeviceQueryList = 103, ///< 设备端查询数据列表
DeviceQueryDetail = 104, ///< 设备端查询数据详情
// --- 文件上传 (105) ---
DeviceUploadFile = 105, ///< 设备端上传文件 (通知)
// --- 用户操作 (106-109) ---
UserScanCode = 106, ///< 用户端扫码
UserUpdateData = 107, ///< 用户端修改数据
UserDeleteData = 108, ///< 用户端删除数据
UserAddData = 109, ///< 用户端新增数据
// --- 设备操作 (112) ---
DeviceGetMatchCode = 112, ///< 设备端获取匹配码
// --- 错误 (500) ---
Error = 500 ///< 设备端请求错误
};
std::function<void(void)> onConnected;
std::function<void(std::string_view)> onPairCodeReceived;
std::function<void(std::string_view, const ArduinoJson::JsonVariant&)> onUserUpdateData;
void init()
{
_connect();
}
void update()
{
if (!_mqtt) {
return;
}
if (!_mqtt->IsConnected()) {
if (GetHAL().millis() - _last_reconnect_attempt > 5000) {
ESP_LOGI(_tag.c_str(), "Reconnecting...");
_connect();
}
} else {
_process_messages();
_check_callbacks_timeout();
}
}
void sendPacket(CmdType type, const std::function<void(ArduinoJson::JsonObject&)>& bodyBuilder = nullptr)
{
if (!_mqtt || !_mqtt->IsConnected()) {
return;
}
ArduinoJson::JsonDocument doc;
doc["deviceToken"] = _token;
ArduinoJson::JsonObject body = doc["body"].to<ArduinoJson::JsonObject>();
body["requestType"] = static_cast<int>(type);
if (bodyBuilder) {
bodyBuilder(body);
}
std::string payload;
ArduinoJson::serializeJson(doc, payload);
ESP_LOGI(_tag.c_str(), "Sending Packet Type: %d", (int)type);
_mqtt->Publish(_pub_topic, payload, 0);
}
void requestPairCode()
{
ESP_LOGI(_tag.c_str(), "Requesting pair code");
sendPacket(CmdType::DeviceGetMatchCode);
}
template <typename T>
void addData(std::string_view name, T value)
{
sendPacket(CmdType::DeviceAddData, [&name, &value](ArduinoJson::JsonObject& body) {
body["name"] = name;
body["value"] = value;
});
}
template <typename T>
void modifyData(std::string_view name, T value)
{
sendPacket(CmdType::DeviceUpdateData, [&name, &value](ArduinoJson::JsonObject& body) {
body["name"] = name;
body["value"] = value;
});
}
void getData(std::string_view name, std::function<void(const ArduinoJson::JsonVariant&)> onData,
std::function<void()> onFailed)
{
// 注册回调
{
std::lock_guard<std::mutex> lock(_callbacks_mutex);
_get_data_callbacks[name.data()] = {onData, onFailed, GetHAL().millis()};
}
// 发送请求
sendPacket(CmdType::DeviceQueryDetail, [&name](ArduinoJson::JsonObject& body) { body["name"] = name; });
}
private:
std::unique_ptr<Mqtt> _mqtt;
uint32_t _last_reconnect_attempt = 0;
std::string _sub_topic;
std::string _pub_topic;
std::string _token;
std::mutex _mutex;
std::queue<std::string> _msg_queue;
struct GetDataCallback_t {
std::function<void(const ArduinoJson::JsonVariant&)> onData;
std::function<void()> onFailed;
uint32_t requestTime;
};
std::mutex _callbacks_mutex;
std::map<std::string, GetDataCallback_t> _get_data_callbacks;
std::string _get_device_token()
{
const std::string url = "https://ezdata2.m5stack.com/api/v2/device/registerMac";
auto& board = Board::GetInstance();
auto network = board.GetNetwork();
auto http = network->CreateHttp(0);
if (!http) {
ESP_LOGE(_tag.c_str(), "failed to create HTTP instance");
return "";
}
ArduinoJson::JsonDocument doc;
doc["deviceType"] = "CoreS3";
doc["mac"] = GetHAL().getFactoryMacString();
std::string payload;
ArduinoJson::serializeJson(doc, payload);
http->SetHeader("Content-Type", "application/json");
http->SetContent(std::move(payload));
if (!http->Open("POST", url)) {
ESP_LOGE(_tag.c_str(), "failed to open HTTP connection");
return "";
}
int status_code = http->GetStatusCode();
if (status_code != 200) {
ESP_LOGE(_tag.c_str(), "HTTP request failed, status code: %d", status_code);
http->Close();
return "";
}
std::string response = http->ReadAll();
http->Close();
doc.clear();
auto error = ArduinoJson::deserializeJson(doc, response);
if (error) {
ESP_LOGE(_tag.c_str(), "failed to parse JSON response: %s", error.c_str());
return "";
}
if (doc["code"] == 200 && doc["msg"] == "OK") {
if (doc["data"].is<std::string>()) {
return doc["data"].as<std::string>();
}
}
ESP_LOGE(_tag.c_str(), "failed to get token from response");
return "";
}
void _connect()
{
_mqtt.reset();
_token = _get_device_token();
if (_token.empty()) {
ESP_LOGE(_tag.c_str(), "failed to get device token");
_last_reconnect_attempt = GetHAL().millis();
return;
}
ESP_LOGI(_tag.c_str(), "get token %s", _token.c_str());
auto& board = Board::GetInstance();
auto network = board.GetNetwork();
_mqtt = network->CreateMqtt(1);
if (!_mqtt) {
ESP_LOGE(_tag.c_str(), "Failed to create MQTT instance");
_last_reconnect_attempt = GetHAL().millis();
return;
}
std::string mac = GetHAL().getFactoryMacString();
std::string client_id = fmt::format("ez{}ez", mac);
_sub_topic = fmt::format("$ezdata/{}/down", _token);
_pub_topic = fmt::format("$ezdata/{}/up", _token);
_mqtt->OnConnected([this]() {
ESP_LOGI(_tag.c_str(), "Connected");
_mqtt->Subscribe(_sub_topic, 0);
ESP_LOGI(_tag.c_str(), "Subscribed: %s", _sub_topic.c_str());
if (onConnected) {
onConnected();
}
});
_mqtt->OnDisconnected([this]() { ESP_LOGI(_tag.c_str(), "Disconnected"); });
_mqtt->OnMessage([this](const std::string&, const std::string& payload) {
std::lock_guard<std::mutex> lock(_mutex);
_msg_queue.push(payload);
});
ESP_LOGI(_tag.c_str(), "Connecting to EzData as %s", client_id.c_str());
_mqtt->Connect("uiflow2.m5stack.com", 1883, client_id, _token, "");
_last_reconnect_attempt = GetHAL().millis();
}
void _check_callbacks_timeout()
{
std::lock_guard<std::mutex> lock(_callbacks_mutex);
uint32_t now = GetHAL().millis();
for (auto it = _get_data_callbacks.begin(); it != _get_data_callbacks.end();) {
if (now - it->second.requestTime > 5000) {
ESP_LOGW(_tag.c_str(), "GetData timeout for %s", it->first.c_str());
if (it->second.onFailed) {
it->second.onFailed();
}
it = _get_data_callbacks.erase(it);
} else {
++it;
}
}
}
void _process_messages()
{
std::vector<std::string> messages;
{
std::lock_guard<std::mutex> lock(_mutex);
while (!_msg_queue.empty()) {
messages.push_back(std::move(_msg_queue.front()));
_msg_queue.pop();
}
}
for (const auto& msg : messages) {
_handle_message(msg);
}
}
void _handle_message(std::string_view payload)
{
ArduinoJson::JsonDocument doc;
auto error = ArduinoJson::deserializeJson(doc, payload);
if (error) {
ESP_LOGE(_tag.c_str(), "DeserializeJson failed: %s", error.c_str());
return;
}
if (!doc["code"].is<int>()) {
return;
}
int code = doc["code"];
if (code != 200) {
ESP_LOGW(_tag.c_str(), "EzData response error code: %d", code);
return;
}
if (!doc["cmd"].is<int>()) {
return;
}
CmdType cmd = static_cast<CmdType>(doc["cmd"].as<int>());
// auto body = doc["body"];
ESP_LOGI(_tag.c_str(), "Received Cmd: %d", (int)cmd);
switch (cmd) {
case CmdType::DeviceQueryList:
ESP_LOGI(_tag.c_str(), "Device list received");
break;
case CmdType::DeviceGetMatchCode: {
if (doc["body"]["pairCode"].is<std::string>()) {
std::string pair_code = doc["body"]["pairCode"].as<std::string>();
ESP_LOGI(_tag.c_str(), "Pair code: %s", pair_code.c_str());
if (onPairCodeReceived) {
onPairCodeReceived(pair_code);
}
}
break;
}
case CmdType::DeviceQueryDetail: {
// {"body": {"createTime": 1751274100000, "dataToken": "...", "id": "...", "name": "adasd",
// "updateTime": 1751274100000, "value": "ddsad"}}
if (doc["body"].is<ArduinoJson::JsonObject>()) {
std::string name;
ArduinoJson::JsonVariant value = doc["body"]["value"];
if (doc["body"]["name"].is<std::string>()) {
name = doc["body"]["name"].as<std::string>();
}
if (!name.empty()) {
std::lock_guard<std::mutex> lock(_callbacks_mutex);
auto it = _get_data_callbacks.find(name);
if (it != _get_data_callbacks.end()) {
if (it->second.onData) {
it->second.onData(value);
}
_get_data_callbacks.erase(it);
}
}
}
break;
}
case CmdType::UserUpdateData: {
if (doc["body"].is<ArduinoJson::JsonObject>()) {
std::string name;
ArduinoJson::JsonVariant value = doc["body"]["value"];
if (doc["body"]["name"].is<std::string>()) {
name = doc["body"]["name"].as<std::string>();
}
if (!name.empty() && onUserUpdateData) {
onUserUpdateData(name, value);
}
}
break;
}
default:
break;
}
}
};
class EzdataWorker : public mooncake::BasicAbility {
public:
EzdataWorker()
{
_service = std::make_unique<EzData>();
_service->onConnected = [this]() { _service->requestPairCode(); };
_service->onPairCodeReceived = [this](std::string_view pairCode) { GetHAL().onEzdataPairCode.emit(pairCode); };
_service->onUserUpdateData = [this](std::string_view name, const ArduinoJson::JsonVariant& value) {
handle_user_update_data(name, value);
};
_service->init();
setup_data();
}
void onRunning() override
{
_service->update();
}
void onDestroy() override
{
_service.reset();
}
private:
std::unique_ptr<EzData> _service;
int _pitch_servo_speed = 500;
int _yaw_servo_speed = 500;
const std::string_view KEY_PITCH_SERVO_ANGLE = "SERVO.Y.ANGLE";
const std::string_view KEY_PITCH_SERVO_SPEED = "SERVO.Y.SPEED";
const std::string_view KEY_YAW_SERVO_ANGLE = "SERVO.X.ANGLE";
const std::string_view KEY_YAW_SERVO_SPEED = "SERVO.X.SPEED";
void setup_data()
{
auto& motion = GetStackChan().motion();
_service->addData(KEY_PITCH_SERVO_ANGLE, ((float)motion.getCurrentPitchAngle() / 10.0f));
_service->addData(KEY_YAW_SERVO_ANGLE, ((float)motion.getCurrentYawAngle() / 10.0f));
_service->addData(KEY_PITCH_SERVO_SPEED, _pitch_servo_speed);
_service->addData(KEY_YAW_SERVO_SPEED, _yaw_servo_speed);
}
void handle_user_update_data(std::string_view name, const ArduinoJson::JsonVariant& value)
{
mclog::tagInfo(_tag, "on user update data {}", name);
auto& motion = GetStackChan().motion();
if (name == KEY_PITCH_SERVO_ANGLE) {
if (value.is<float>()) {
float angle = value.as<float>();
motion.movePitchWithSpeed(angle * 10, _pitch_servo_speed);
}
} else if (name == KEY_YAW_SERVO_ANGLE) {
if (value.is<float>()) {
float angle = value.as<float>();
motion.moveYawWithSpeed(angle * 10, _yaw_servo_speed);
}
} else if (name == KEY_PITCH_SERVO_SPEED) {
if (value.is<int>()) {
_pitch_servo_speed = value.as<int>();
}
} else if (name == KEY_YAW_SERVO_SPEED) {
if (value.is<int>()) {
_yaw_servo_speed = value.as<int>();
}
}
}
};
void Hal::startEzDataService(std::function<void(std::string_view)> onStartLog)
{
mclog::tagInfo(_tag, "start ezdata service");
startNetwork(onStartLog);
onStartLog("Connecting to\nserver...");
mooncake::GetMooncake().extensionManager()->createAbility(std::make_unique<EzdataWorker>());
}
+10 -1
View File
@@ -15,8 +15,10 @@
#include <ctime>
#include <sys/time.h>
#include <esp_sntp.h>
#include <atomic>
static std::string _tag = "Network";
static std::string _tag = "Network";
static bool _is_network_connected = false;
static void time_sync_notification_cb(struct timeval* tv)
{
@@ -44,6 +46,11 @@ void Hal::startSntp()
void Hal::startNetwork(std::function<void(std::string_view)> onLog)
{
if (_is_network_connected) {
mclog::tagInfo(_tag, "network already connected");
return;
}
std::atomic<bool> network_connected = false;
auto& board = Board::GetInstance();
@@ -108,6 +115,8 @@ void Hal::startNetwork(std::function<void(std::string_view)> onLog)
board.SetNetworkEventCallback(nullptr);
startSntp();
_is_network_connected = true;
}
WifiStatus Hal::getWifiStatus()
+67
View File
@@ -0,0 +1,67 @@
/*
* SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
*
* SPDX-License-Identifier: MIT
*/
#include "hal.h"
#include <mooncake_log.h>
#include <memory>
#include <ota.h>
static const std::string_view _tag = "HAL-OTA";
bool Hal::updateFirmware(std::function<void(std::string_view)> onLog)
{
onLog("Checking firmware updates...");
Ota ota;
esp_err_t err = ota.CheckVersion();
if (err != ESP_OK) {
mclog::tagError(_tag, "failed to check firmware version: {}", esp_err_to_name(err));
onLog("Failed to check firmware updates");
return false;
}
if (!ota.HasNewVersion()) {
ota.MarkCurrentVersionValid();
mclog::tagInfo(_tag, "no new firmware version available");
onLog("Already up to date");
return true;
}
const std::string &firmware_url = ota.GetFirmwareUrl();
const std::string &firmware_version = ota.GetFirmwareVersion();
if (firmware_url.empty()) {
mclog::tagError(_tag, "firmware update available but url is empty");
onLog("Invalid firmware update info");
return false;
}
mclog::tagInfo(_tag, "new firmware available: version={}, url={}", firmware_version, firmware_url);
if (!firmware_version.empty()) {
onLog(std::string("New firmware found: ") + firmware_version);
} else {
onLog("New firmware found");
}
onLog("Starting firmware upgrade...");
bool upgrade_success = Ota::Upgrade(firmware_url, [&](int progress, size_t speed) {
auto msg = fmt::format("Upgrading firmware: {}% at {}KB/s", progress, speed / 1024);
mclog::tagInfo(_tag, "upgrade progress: {}", msg);
onLog(msg);
});
if (!upgrade_success) {
mclog::tagError(_tag, "firmware upgrade failed: version={}, url={}", firmware_version, firmware_url);
onLog("Firmware upgrade failed, rebooting...");
vTaskDelay(pdMS_TO_TICKS(5000));
reboot();
return false;
}
mclog::tagInfo(_tag, "firmware upgrade successful, rebooting");
onLog("Upgrade successful, rebooting...");
vTaskDelay(pdMS_TO_TICKS(1000));
reboot();
return true;
}
+2 -2
View File
@@ -170,7 +170,7 @@ void Hal::servo_init()
ServoConfig_t yaw_servo_config;
yaw_servo_config.id = 1;
yaw_servo_config.defaultZeroPos = 450;
yaw_servo_config.defaultZeroPos = 460;
yaw_servo_config.angleLimit = Vector2i(-1280, 1280);
yaw_servo_config.rawPosLimit = Vector2i(0, 1000);
yaw_servo_config.settingNs = "servo";
@@ -179,7 +179,7 @@ void Hal::servo_init()
ServoConfig_t pitch_servo_config;
pitch_servo_config.id = 2;
pitch_servo_config.defaultZeroPos = 125;
pitch_servo_config.defaultZeroPos = 620;
pitch_servo_config.angleLimit = Vector2i(0, 900);
pitch_servo_config.rawPosLimit = Vector2i(0, 1000);
pitch_servo_config.settingNs = "servo";
-53
View File
@@ -24,7 +24,6 @@
#include <lvgl_image.h>
#include <wifi_manager.h>
#include "utils/jpeg_to_image/jpeg_decoder.h"
#include "audio/audio_service.h"
#include "utils/secret_logic/secret_logic.h"
static std::string _tag = "WS-Avatar";
@@ -94,9 +93,6 @@ public:
ESP_LOGI(_tag.c_str(), "Sending EndCall");
sendPacket(DataType::EndCall, nullptr, 0);
});
// Initialize audio service
setupAudio();
}
void connect()
@@ -134,18 +130,6 @@ public:
});
_websocket->OnData([this](const char* data, size_t len, bool binary) {
// Fast path for Audio packets to avoid jitter from main thread loop
if (binary && len > 5 && static_cast<DataType>(data[0]) == DataType::Opus) {
// Determine raw pointer and size safely
const uint8_t* u_data = reinterpret_cast<const uint8_t*>(data);
// Directly construct and push to AudioService
auto packet = std::make_unique<AudioStreamPacket>();
packet->payload.assign(u_data + 5, u_data + len);
_audio_service.PushPacketToDecodeQueue(std::move(packet));
return;
}
std::lock_guard<std::mutex> lock(_mutex);
_msg_queue.push({binary, std::vector<uint8_t>(data, data + len)});
});
@@ -373,13 +357,9 @@ public:
break;
}
case DataType::StartAudioStream: {
ESP_LOGI(_tag.c_str(), "Start Audio Stream");
_is_audio_streaming = true;
break;
}
case DataType::StopAudioStream: {
ESP_LOGI(_tag.c_str(), "Stop Audio Stream");
_is_audio_streaming = false;
break;
}
default:
@@ -452,44 +432,11 @@ private:
uint32_t _last_heartbeat_time = 0;
bool _is_streaming = false;
bool _is_video_mode = false;
std::atomic<bool> _is_audio_streaming{false};
std::mutex _mutex;
std::queue<ReceivedMessage> _msg_queue;
// Audio
AudioService _audio_service;
std::mutex _send_mutex;
void setupAudio()
{
auto codec = Board::GetInstance().GetAudioCodec();
_audio_service.Initialize(codec);
AudioServiceCallbacks callbacks;
callbacks.on_send_queue_available = [this]() {
while (true) {
auto packet = _audio_service.PopPacketFromSendQueue();
if (!packet) {
break;
}
// Only send audio if streaming is enabled
if (_is_audio_streaming) {
if (!packet->payload.empty()) {
sendPacket(DataType::Opus, packet->payload.data(), packet->payload.size());
}
}
}
};
_audio_service.SetCallbacks(callbacks);
codec->SetInputGain(0.0f);
_audio_service.Start();
_audio_service.EnableVoiceProcessing(true);
_audio_service.EnableDeviceAec(true);
}
void sendPacket(DataType type, const uint8_t* data, size_t len)
{
std::lock_guard<std::mutex> lock(_send_mutex);
+52 -11
View File
@@ -32,8 +32,35 @@
#if CONFIG_EXAMPLE_EXTENDED_ADV
static uint8_t ext_adv_pattern_1[] = {
0x02, 0x01, 0x06, 0x03, 0x03, 0xab, 0xcd, 0x03, 0x03, 0x18, 0x11, 0x11, 0X09, 'n', 'i',
'm', 'b', 'l', 'e', '-', 'b', 'l', 'e', 'p', 'r', 'p', 'h', '-', 'e',
0x02,
BLE_HS_ADV_TYPE_FLAGS,
0x06,
0x03,
BLE_HS_ADV_TYPE_COMP_UUIDS16,
0xab,
0xcd,
0x03,
BLE_HS_ADV_TYPE_COMP_UUIDS16,
0x18,
0x11,
0x11,
BLE_HS_ADV_TYPE_COMP_NAME,
'n',
'i',
'm',
'b',
'l',
'e',
'-',
'b',
'l',
'e',
'p',
'r',
'p',
'h',
'-',
'e',
};
#endif
@@ -50,6 +77,8 @@ static uint16_t cids[MYNEWT_VAL(BLE_EATT_CHAN_NUM)];
static uint16_t bearers;
#endif
static bool s_use_alt_uuid = false;
void ble_store_config_init(void);
#if NIMBLE_BLE_CONNECT
@@ -103,8 +132,8 @@ static void ext_bleprph_advertise(void)
params.primary_phy = BLE_HCI_LE_PHY_1M;
params.secondary_phy = BLE_HCI_LE_PHY_2M;
// params.tx_power = 127;
params.sid = 1;
params.tx_power = 127;
params.sid = 1;
params.itvl_min = BLE_GAP_ADV_FAST_INTERVAL1_MIN;
params.itvl_max = BLE_GAP_ADV_FAST_INTERVAL1_MIN;
@@ -229,10 +258,17 @@ static void bleprph_advertise(void)
// fields.num_uuids16 = 1;
// fields.uuids16_is_complete = 1;
ble_uuid128_t stackchan_uuid = BLE_UUID128_INIT(STACKCHAN_SVC_UUID_BASE);
fields.uuids128 = &stackchan_uuid;
fields.num_uuids128 = 1;
fields.uuids128_is_complete = 1;
ble_uuid128_t stackchan_uuid = BLE_UUID128_INIT(STACKCHAN_SVC_UUID_BASE);
ble_uuid128_t stackchan_uuid_alt = BLE_UUID128_INIT(STACKCHAN_SVC_UUID_BASE_ALT);
if (s_use_alt_uuid) {
fields.uuids128 = &stackchan_uuid_alt;
} else {
fields.uuids128 = &stackchan_uuid;
}
fields.num_uuids128 = 1;
fields.uuids128_is_complete = 1;
rc = ble_gap_adv_set_fields(&fields);
if (rc != 0) {
@@ -600,8 +636,9 @@ void bleprph_host_task(void *param)
nimble_port_freertos_deinit();
}
void ble_prph_init(void)
void ble_prph_init(bool use_alt_uuid)
{
s_use_alt_uuid = use_alt_uuid;
int rc;
esp_err_t ret;
@@ -647,14 +684,18 @@ void ble_prph_init(void)
ble_hs_cfg.sm_their_key_dist |= BLE_SM_PAIR_KEY_DIST_ID;
#endif
#if MYNEWT_VAL(STATIC_PASSKEY) && NIMBLE_BLE_CONNECT
ble_sm_configure_static_passkey(456789, true);
#endif
#if MYNEWT_VAL(BLE_GATTS)
rc = gatt_svr_init();
rc = gatt_svr_init(use_alt_uuid);
assert(rc == 0);
#endif
#if CONFIG_BT_NIMBLE_GAP_SERVICE
/* Set the default device name. */
rc = ble_svc_gap_device_name_set("Stack-Chan");
rc = ble_svc_gap_device_name_set("StackChan");
assert(rc == 0);
#endif
+6 -2
View File
@@ -44,6 +44,10 @@ struct ble_gatt_register_ctxt;
#define STACKCHAN_SVC_UUID_BASE \
0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12, 0x78, 0x56, 0x34, 0x12, 0xe0, 0xe5, 0xe5, 0xe2
// Service UUID Alt: e2e5e5ff-1234-5678-1234-56789abcdef0
#define STACKCHAN_SVC_UUID_BASE_ALT \
0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12, 0x78, 0x56, 0x34, 0x12, 0xff, 0xe5, 0xe5, 0xe2
// Motion Characteristic UUID: e2e5e5e1-1234-5678-1234-56789abcdef0
#define STACKCHAN_CHR_MOTION_UUID \
0xf0, 0xde, 0xbc, 0x9a, 0x78, 0x56, 0x34, 0x12, 0x78, 0x56, 0x34, 0x12, 0xe1, 0xe5, 0xe5, 0xe2
@@ -160,9 +164,9 @@ void stackchan_ble_set_conn_handle(uint16_t conn_handle);
bool stackchan_ble_is_connected(void);
void gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg);
int gatt_svr_init(void);
int gatt_svr_init(bool use_alt_uuid);
void ble_prph_init(void);
void ble_prph_init(bool use_alt_uuid);
#ifdef __cplusplus
}
+10 -3
View File
@@ -33,7 +33,8 @@
#define MAX_NOTIFY 5
/* Stack-Chan Service */
static const ble_uuid128_t stackchan_svc_uuid = BLE_UUID128_INIT(STACKCHAN_SVC_UUID_BASE);
static const ble_uuid128_t stackchan_svc_uuid = BLE_UUID128_INIT(STACKCHAN_SVC_UUID_BASE);
static const ble_uuid128_t stackchan_svc_uuid_alt = BLE_UUID128_INIT(STACKCHAN_SVC_UUID_BASE_ALT);
static const ble_uuid128_t stackchan_chr_motion_uuid = BLE_UUID128_INIT(STACKCHAN_CHR_MOTION_UUID);
@@ -77,7 +78,7 @@ static int stackchan_svc_access(uint16_t conn_handle, uint16_t attr_handle, stru
static int battery_svc_access(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
static const struct ble_gatt_svc_def gatt_svr_svcs[] = {
static struct ble_gatt_svc_def gatt_svr_svcs[] = {
{
/*** Stack-Chan Service ***/
.type = BLE_GATT_SVC_TYPE_PRIMARY,
@@ -321,7 +322,7 @@ void gatt_svr_register_cb(struct ble_gatt_register_ctxt *ctxt, void *arg)
}
}
int gatt_svr_init(void)
int gatt_svr_init(bool use_alt_uuid)
{
int rc;
@@ -339,6 +340,12 @@ int gatt_svr_init(void)
ble_svc_gap_init();
ble_svc_gatt_init();
if (use_alt_uuid) {
gatt_svr_svcs[0].uuid = &stackchan_svc_uuid_alt.u;
} else {
gatt_svr_svcs[0].uuid = &stackchan_svc_uuid.u;
}
rc = ble_gatts_count_cfg(gatt_svr_svcs);
if (rc != 0) {
return rc;
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -32,7 +32,7 @@ static int enter_passkey_handler(int argc, char *argv[])
return -1;
}
sscanf(argv[1], "%s", pkey);
sscanf(argv[1], "%7s", pkey);
ESP_LOGI("You entered", "%s %s", argv[0], argv[1]);
num = pkey[0];
@@ -45,7 +45,9 @@ static int enter_passkey_handler(int argc, char *argv[])
xQueueSend(cli_handle, &key, 0);
}
} else {
sscanf(pkey, "%d", &key);
if (sscanf(pkey, "%d", &key) != 1) {
key = 0;
}
xQueueSend(cli_handle, &key, 0);
}
@@ -84,14 +86,14 @@ static void scli_task(void *arg)
QueueHandle_t uart_queue;
uart_event_t event;
uart_driver_install(uart_num, 256, 0, 8, &uart_queue, 0);
ESP_ERROR_CHECK(uart_driver_install(uart_num, 256, 0, 8, &uart_queue, 0));
/* Initialize the console */
esp_console_config_t console_config = {
.max_cmdline_args = 8,
.max_cmdline_length = 256,
};
esp_console_init(&console_config);
ESP_ERROR_CHECK(esp_console_init(&console_config));
while (!stop) {
i = 0;
@@ -107,6 +109,9 @@ static void scli_task(void *arg)
}
if (event.type == UART_DATA) {
while (uart_read_bytes(uart_num, (uint8_t *)&linebuf[i], 1, 0)) {
if (i >= sizeof(linebuf) - 1) {
break;
}
if (linebuf[i] == '\r') {
uart_write_bytes(uart_num, "\r\n", 2);
} else {
@@ -115,13 +120,17 @@ static void scli_task(void *arg)
i++;
}
}
} while ((i < 255) && linebuf[i - 1] != '\r');
} while ((i < 255) && (i == 0 || linebuf[i - 1] != '\r'));
if (stop) {
break;
}
/* Remove the truncating \r\n */
linebuf[strlen((char *)linebuf) - 1] = '\0';
ret = esp_console_run((char *)linebuf, &cmd_ret);
size_t len = strlen((char *)linebuf);
if (len > 0) {
linebuf[len - 1] = '\0';
}
ret = esp_console_run((char *)linebuf, &cmd_ret);
if (ret < 0) {
break;
}
@@ -144,3 +153,40 @@ int scli_init(void)
}
return ESP_OK;
}
int scli_deinit(void)
{
if (cli_task == NULL) {
return ESP_OK; // Already deinitialized
}
// Signal task to exit
stop = 1;
// Wait for task to exit (it will clean up UART and console)
int timeout_ms = 200;
while (timeout_ms > 0 && cli_task != NULL && eTaskGetState(cli_task) != eDeleted) {
vTaskDelay(pdMS_TO_TICKS(10));
timeout_ms -= 10;
}
// Force delete if still running (shouldn't happen if task exits properly)
if (cli_task != NULL && eTaskGetState(cli_task) != eDeleted) {
vTaskDelete(cli_task);
// If force-deleted, clean up resources manually
uart_driver_delete(0);
esp_console_deinit();
}
cli_task = NULL;
// Clean up queue
if (cli_handle != NULL) {
vQueueDelete(cli_handle);
cli_handle = NULL;
}
// Reset stop flag
stop = 0;
return ESP_OK;
}
+33 -16
View File
@@ -1,6 +1,7 @@
## IDF Component Manager Manifest File
dependencies:
waveshare/esp_lcd_sh8601: 1.0.2
espressif/esp_lcd_co5300: ^2.0.3
espressif/esp_lcd_ili9341: ==1.2.0
espressif/esp_lcd_gc9a01: ==2.0.1
espressif/esp_lcd_st77916: ^1.0.1
@@ -16,21 +17,32 @@ dependencies:
- if: target in [esp32, esp32s2, esp32s3, esp32p4]
espressif/esp_lcd_spd2010: ==1.0.2
espressif/esp_io_expander_tca9554: ==2.0.0
waveshare/custom_io_expander_ch32v003: ^1.0.0
espressif/esp_lcd_panel_io_additions: ^1.0.1
78/esp_lcd_nv3023: ~1.0.0
78/esp-wifi-connect: ~3.0.2
78/esp-opus-encoder: ~2.4.1
78/esp-ml307: ~3.5.3
78/xiaozhi-fonts: ~1.5.5
espressif/led_strip: ~3.0.1
espressif/esp_codec_dev: ~1.5
# espressif/esp-sr: ~2.2.0
espressif/button: ~4.1.3
78/esp-wifi-connect: ~3.1.1
espressif/esp_audio_effects: ~1.2.1
espressif/esp_audio_codec: ~2.4.1
78/esp-ml307: ~3.6.4
78/uart-eth-modem:
version: ~0.3.3
rules:
- if: target not in [esp32]
78/xiaozhi-fonts: ~1.6.0
espressif/led_strip: ~3.0.2
espressif/esp_codec_dev: ~1.5.4
espressif/esp-sr: ~2.3.0
espressif/button: ~4.1.5
espressif/knob: ^1.0.0
espressif/esp32-camera:
version: ^2.1.4
rules:
- if: target in [esp32s3]
espressif/esp_video:
version: ==1.3.1 # for compatibility. update version may need to modify this project code.
rules:
- if: target not in [esp32]
- if: target in [esp32p4, esp32s3]
espressif/esp_image_effects:
version: ^1.0.1
rules:
@@ -40,15 +52,15 @@ dependencies:
espressif/esp_lcd_touch_gt1151: ^1
waveshare/esp_lcd_touch_cst9217: ^1.0.3
espressif/esp_lcd_touch_cst816s: ^1.0.6
lvgl/lvgl: ~9.3.0
esp_lvgl_port: ~2.6.0
lvgl/lvgl: ~9.4.0
esp_lvgl_port: ~2.7.0
espressif/esp_io_expander_tca95xx_16bit: ^2.0.0
espressif2022/image_player: ^1.1.1
espressif2022/esp_emote_gfx: ==2.0.0
# espressif2022/esp_emote_expression: ^0.1.0
espressif/adc_mic: ^0.2.1
espressif/esp_mmap_assets: '>=1.2'
txp666/otto-emoji-gif-component:
version: ^1.0.3
version: ^1.1.1
rules:
- if: target in [esp32s3]
espressif/adc_battery_estimation: ^0.2.0
@@ -61,7 +73,7 @@ dependencies:
- if: target in [esp32s3]
tny-robotics/sh1106-esp-idf: ^1.0.0
waveshare/esp_lcd_jd9365_10_1:
espressif/esp_lcd_jd9365:
version: '*'
rules:
- if: target in [esp32p4]
@@ -104,7 +116,12 @@ dependencies:
rules:
- if: target in [esp32s3, esp32c5]
espressif/esp_lcd_touch_st7123: ^1.0.0
espressif/iot_usbh_rndis:
version: ^0.3.1
rules:
- if: target in [esp32s3, esp32p4]
## Required IDF version
idf:
version: '>=5.4.0'
espressif/esp_lcd_touch_st7123: ^1.0.0
version: '>=5.5.2'
+3
View File
@@ -31,6 +31,9 @@ extern "C" void app_main(void)
GetMooncake().installApp(std::make_unique<AppAiAgent>());
GetMooncake().installApp(std::make_unique<AppAvatar>());
GetMooncake().installApp(std::make_unique<AppEspnowControl>());
GetMooncake().installApp(std::make_unique<AppAppCenter>());
GetMooncake().installApp(std::make_unique<AppEzdata>());
GetMooncake().installApp(std::make_unique<AppDance>());
GetMooncake().installApp(std::make_unique<AppSetup>());
// Main loop
+247
View File
@@ -0,0 +1,247 @@
diff --git a/main/application.cc b/main/application.cc
index d69d43d..3b6f07e 100644
--- a/main/application.cc
+++ b/main/application.cc
@@ -610,33 +610,36 @@ void Application::InitializeProtocol() {
}
void Application::ShowActivationCode(const std::string& code, const std::string& message) {
- struct digit_sound {
- char digit;
- const std::string_view& sound;
- };
- static const std::array<digit_sound, 10> digit_sounds{{
- digit_sound{'0', Lang::Sounds::OGG_0},
- digit_sound{'1', Lang::Sounds::OGG_1},
- digit_sound{'2', Lang::Sounds::OGG_2},
- digit_sound{'3', Lang::Sounds::OGG_3},
- digit_sound{'4', Lang::Sounds::OGG_4},
- digit_sound{'5', Lang::Sounds::OGG_5},
- digit_sound{'6', Lang::Sounds::OGG_6},
- digit_sound{'7', Lang::Sounds::OGG_7},
- digit_sound{'8', Lang::Sounds::OGG_8},
- digit_sound{'9', Lang::Sounds::OGG_9}
- }};
-
- // This sentence uses 9KB of SRAM, so we need to wait for it to finish
- Alert(Lang::Strings::ACTIVATION, message.c_str(), "link", Lang::Sounds::OGG_ACTIVATION);
-
- for (const auto& digit : code) {
- auto it = std::find_if(digit_sounds.begin(), digit_sounds.end(),
- [digit](const digit_sound& ds) { return ds.digit == digit; });
- if (it != digit_sounds.end()) {
- audio_service_.PlaySound(it->sound);
- }
- }
+ // struct digit_sound {
+ // char digit;
+ // const std::string_view& sound;
+ // };
+ // static const std::array<digit_sound, 10> digit_sounds{{
+ // digit_sound{'0', Lang::Sounds::OGG_0},
+ // digit_sound{'1', Lang::Sounds::OGG_1},
+ // digit_sound{'2', Lang::Sounds::OGG_2},
+ // digit_sound{'3', Lang::Sounds::OGG_3},
+ // digit_sound{'4', Lang::Sounds::OGG_4},
+ // digit_sound{'5', Lang::Sounds::OGG_5},
+ // digit_sound{'6', Lang::Sounds::OGG_6},
+ // digit_sound{'7', Lang::Sounds::OGG_7},
+ // digit_sound{'8', Lang::Sounds::OGG_8},
+ // digit_sound{'9', Lang::Sounds::OGG_9}
+ // }};
+
+ // // This sentence uses 9KB of SRAM, so we need to wait for it to finish
+ // Alert(Lang::Strings::ACTIVATION, message.c_str(), "link", Lang::Sounds::OGG_ACTIVATION);
+
+ // for (const auto& digit : code) {
+ // auto it = std::find_if(digit_sounds.begin(), digit_sounds.end(),
+ // [digit](const digit_sound& ds) { return ds.digit == digit; });
+ // if (it != digit_sounds.end()) {
+ // audio_service_.PlaySound(it->sound);
+ // }
+ // }
+
+ auto display = Board::GetInstance().GetDisplay();
+ display->SetChatMessage("system", "Please bind and set up in the mobile app.");
}
void Application::Alert(const char* status, const char* message, const char* emotion, const std::string_view& sound) {
diff --git a/main/assets.cc b/main/assets.cc
index ad61944..6b84daf 100644
--- a/main/assets.cc
+++ b/main/assets.cc
@@ -3,8 +3,8 @@
#include "display.h"
#include "application.h"
#include "lvgl_theme.h"
-#include "emote_display.h"
-#include "expression_emote.h"
+// #include "emote_display.h"
+// #include "expression_emote.h"
#if HAVE_LVGL
#include "display/lcd_display.h"
#include <spi_flash_mmap.h>
@@ -356,72 +356,72 @@ bool Assets::LvglStrategy::Apply(Assets* assets) {
}
#endif // HAVE_LVGL
-bool Assets::EmoteStrategy::InitializePartition(Assets* assets) {
- assets->partition_valid_ = false;
-
- if (!Assets::FindPartition(assets)) {
- return false;
- }
-
- esp_err_t ret = ESP_ERR_INVALID_STATE;
- auto display = Board::GetInstance().GetDisplay();
- auto* emote_display = dynamic_cast<emote::EmoteDisplay*>(display);
- if (emote_display && emote_display->GetEmoteHandle() != nullptr) {
- const emote_data_t data = {
- .type = EMOTE_SOURCE_PARTITION,
- .source = {
- .partition_label = PARTITION_LABEL,
- },
- .flags = {
- .mmap_enable = true, //must be true here!!!
- },
- };
- ret = emote_mount_assets(emote_display->GetEmoteHandle(), &data);
- } else {
- ESP_LOGE(TAG, "Emote display is not initialized");
- }
- assets->partition_valid_ = ((ret == ESP_OK) ? true : false);
- return assets->partition_valid_;
-}
-
-void Assets::EmoteStrategy::UnApplyPartition(Assets* assets) {
- auto display = Board::GetInstance().GetDisplay();
- auto* emote_display = dynamic_cast<emote::EmoteDisplay*>(display);
- if (emote_display && emote_display->GetEmoteHandle() != nullptr) {
- emote_unmount_assets(emote_display->GetEmoteHandle());
- }
- (void)assets; // Unused parameter
-}
-
-bool Assets::EmoteStrategy::GetAssetData(Assets* assets, const std::string& name, void*& ptr, size_t& size) {
- auto display = Board::GetInstance().GetDisplay();
- auto* emote_display = dynamic_cast<emote::EmoteDisplay*>(display);
- if (emote_display && emote_display->GetEmoteHandle() != nullptr) {
- const uint8_t* data = nullptr;
- size_t data_size = 0;
- if (ESP_OK == emote_get_asset_data_by_name(emote_display->GetEmoteHandle(), name.c_str(), &data, &data_size)) {
- ptr = const_cast<void*>(static_cast<const void*>(data));
- size = data_size;
- return true;
- }
- ESP_LOGE(TAG, "Failed to get asset data by name: %s", name.c_str());
- return false;
- }
- (void)assets; // Unused parameter
- return false;
-}
-
-bool Assets::EmoteStrategy::Apply(Assets* assets) {
- Assets::LoadSrmodelsFromIndex(assets);
-
- auto display = Board::GetInstance().GetDisplay();
- auto* emote_display = dynamic_cast<emote::EmoteDisplay*>(display);
-
- if (emote_display && emote_display->GetEmoteHandle() != nullptr) {
- emote_load_assets(emote_display->GetEmoteHandle());
- }
- return true;
-}
+// bool Assets::EmoteStrategy::InitializePartition(Assets* assets) {
+// assets->partition_valid_ = false;
+
+// if (!Assets::FindPartition(assets)) {
+// return false;
+// }
+
+// esp_err_t ret = ESP_ERR_INVALID_STATE;
+// auto display = Board::GetInstance().GetDisplay();
+// auto* emote_display = dynamic_cast<emote::EmoteDisplay*>(display);
+// if (emote_display && emote_display->GetEmoteHandle() != nullptr) {
+// const emote_data_t data = {
+// .type = EMOTE_SOURCE_PARTITION,
+// .source = {
+// .partition_label = PARTITION_LABEL,
+// },
+// .flags = {
+// .mmap_enable = true, //must be true here!!!
+// },
+// };
+// ret = emote_mount_assets(emote_display->GetEmoteHandle(), &data);
+// } else {
+// ESP_LOGE(TAG, "Emote display is not initialized");
+// }
+// assets->partition_valid_ = ((ret == ESP_OK) ? true : false);
+// return assets->partition_valid_;
+// }
+
+// void Assets::EmoteStrategy::UnApplyPartition(Assets* assets) {
+// auto display = Board::GetInstance().GetDisplay();
+// auto* emote_display = dynamic_cast<emote::EmoteDisplay*>(display);
+// if (emote_display && emote_display->GetEmoteHandle() != nullptr) {
+// emote_unmount_assets(emote_display->GetEmoteHandle());
+// }
+// (void)assets; // Unused parameter
+// }
+
+// bool Assets::EmoteStrategy::GetAssetData(Assets* assets, const std::string& name, void*& ptr, size_t& size) {
+// auto display = Board::GetInstance().GetDisplay();
+// auto* emote_display = dynamic_cast<emote::EmoteDisplay*>(display);
+// if (emote_display && emote_display->GetEmoteHandle() != nullptr) {
+// const uint8_t* data = nullptr;
+// size_t data_size = 0;
+// if (ESP_OK == emote_get_asset_data_by_name(emote_display->GetEmoteHandle(), name.c_str(), &data, &data_size)) {
+// ptr = const_cast<void*>(static_cast<const void*>(data));
+// size = data_size;
+// return true;
+// }
+// ESP_LOGE(TAG, "Failed to get asset data by name: %s", name.c_str());
+// return false;
+// }
+// (void)assets; // Unused parameter
+// return false;
+// }
+
+// bool Assets::EmoteStrategy::Apply(Assets* assets) {
+// Assets::LoadSrmodelsFromIndex(assets);
+
+// auto display = Board::GetInstance().GetDisplay();
+// auto* emote_display = dynamic_cast<emote::EmoteDisplay*>(display);
+
+// if (emote_display && emote_display->GetEmoteHandle() != nullptr) {
+// emote_load_assets(emote_display->GetEmoteHandle());
+// }
+// return true;
+// }
bool Assets::Download(std::string url, std::function<void(int progress, size_t speed)> progress_callback) {
ESP_LOGI(TAG, "Downloading new version of assets from %s", url.c_str());
diff --git a/main/assets.h b/main/assets.h
index 3692e0c..7bfbc5c 100644
--- a/main/assets.h
+++ b/main/assets.h
@@ -68,13 +68,13 @@ private:
bool checksum_valid_ = false;
};
- class EmoteStrategy : public AssetStrategy {
- public:
- bool Apply(Assets* assets) override;
- bool InitializePartition(Assets* assets) override;
- void UnApplyPartition(Assets* assets) override;
- bool GetAssetData(Assets* assets, const std::string& name, void*& ptr, size_t& size) override;
- };
+ // class EmoteStrategy : public AssetStrategy {
+ // public:
+ // bool Apply(Assets* assets) override;
+ // bool InitializePartition(Assets* assets) override;
+ // void UnApplyPartition(Assets* assets) override;
+ // bool GetAssetData(Assets* assets, const std::string& name, void*& ptr, size_t& size) override;
+ // };
// Strategy instance
std::unique_ptr<AssetStrategy> strategy_;
+5 -9
View File
@@ -2,22 +2,23 @@
{
"url": "https://github.com/Forairaaaaa/mooncake.git",
"path": "components/mooncake",
"branch": "main"
"branch": "v2.3.3"
},
{
"url": "https://github.com/Forairaaaaa/mooncake_log.git",
"path": "components/mooncake_log",
"branch": "main"
"branch": "v1.5.0"
},
{
"url": "https://github.com/Forairaaaaa/smooth_ui_toolkit.git",
"path": "components/smooth_ui_toolkit",
"branch": "main"
"branch": "v2.12.0"
},
{
"url": "https://github.com/78/xiaozhi-esp32.git",
"path": "xiaozhi-esp32",
"branch": "v2.1.0"
"branch": "v2.2.4",
"patch": "patches/xiaozhi-esp32.patch"
},
{
"url": "https://github.com/bblanchon/ArduinoJson.git",
@@ -28,10 +29,5 @@
"url": "https://github.com/espressif/esp-now.git",
"path": "components/esp-now",
"branch": "c33383de97f3ed2fc52117f5ef04f71990432e5d"
},
{
"url": "https://github.com/espressif/esp-sr",
"path": "components/espressif__esp-sr",
"branch": "8adb700e780cbd6c7743717c35ebfcf08f943526"
}
]
+3 -3
View File
@@ -1,5 +1,5 @@
# This file was generated using idf.py save-defconfig. It can be edited manually.
# Espressif IoT Development Framework (ESP-IDF) 5.5.1 Project Minimal Configuration
# Espressif IoT Development Framework (ESP-IDF) 5.5.4 Project Minimal Configuration
#
CONFIG_IDF_TARGET="esp32s3"
CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y
@@ -17,9 +17,9 @@ CONFIG_COMPILER_CXX_RTTI=y
CONFIG_BT_ENABLED=y
CONFIG_BT_NIMBLE_ENABLED=y
CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_EXTERNAL=y
CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=512
CONFIG_BT_NIMBLE_HS_FLOW_CTRL=y
CONFIG_BT_NIMBLE_ENABLE_CONN_REATTEMPT=n
CONFIG_BT_NIMBLE_HS_FLOW_CTRL=y
CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=512
CONFIG_UART_ISR_IN_IRAM=y
CONFIG_HTTPD_MAX_REQ_HDR_LEN=2048
CONFIG_HTTPD_MAX_URI_LEN=2048