Showing preview only (4,013K chars total). Download the full file or copy to clipboard to get everything.
Repository: 78/xiaozhi-esp32
Branch: main
Commit: 280b2ff856af
Files: 1426
Total size: 3.7 MB
Directory structure:
gitextract_bwja74tq/
├── .clang-format
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── 01_build_install_bug.yml
│ │ ├── 02_runtime_bug.yml
│ │ ├── 03_feature_request.yml
│ │ └── config.yml
│ └── workflows/
│ └── build.yml
├── .gitignore
├── CMakeLists.txt
├── LICENSE
├── README.md
├── README_ja.md
├── README_zh.md
├── docs/
│ ├── blufi.md
│ ├── code_style.md
│ ├── custom-board.md
│ ├── mcp-protocol.md
│ ├── mcp-usage.md
│ ├── mqtt-udp.md
│ └── websocket.md
├── main/
│ ├── CMakeLists.txt
│ ├── Kconfig.projbuild
│ ├── application.cc
│ ├── application.h
│ ├── assets/
│ │ ├── common/
│ │ │ ├── exclamation.ogg
│ │ │ ├── low_battery.ogg
│ │ │ ├── popup.ogg
│ │ │ ├── success.ogg
│ │ │ └── vibration.ogg
│ │ └── locales/
│ │ ├── ar-SA/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── bg-BG/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── ca-ES/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── cs-CZ/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── da-DK/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── de-DE/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── el-GR/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── en-US/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── es-ES/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── fa-IR/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── fi-FI/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── fil-PH/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── fr-FR/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── he-IL/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── hi-IN/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── hr-HR/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── hu-HU/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── id-ID/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── it-IT/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── ja-JP/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── ko-KR/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── ms-MY/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── nb-NO/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── nl-NL/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── pl-PL/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── pt-PT/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── ro-RO/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── ru-RU/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── sk-SK/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── sl-SI/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── sr-RS/
│ │ │ └── language.json
│ │ ├── sv-SE/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── th-TH/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── tr-TR/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── uk-UA/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── vi-VN/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ ├── zh-CN/
│ │ │ ├── 0.ogg
│ │ │ ├── 1.ogg
│ │ │ ├── 2.ogg
│ │ │ ├── 3.ogg
│ │ │ ├── 4.ogg
│ │ │ ├── 5.ogg
│ │ │ ├── 6.ogg
│ │ │ ├── 7.ogg
│ │ │ ├── 8.ogg
│ │ │ ├── 9.ogg
│ │ │ ├── activation.ogg
│ │ │ ├── err_pin.ogg
│ │ │ ├── err_reg.ogg
│ │ │ ├── language.json
│ │ │ ├── upgrade.ogg
│ │ │ ├── welcome.ogg
│ │ │ └── wificonfig.ogg
│ │ └── zh-TW/
│ │ ├── 0.ogg
│ │ ├── 1.ogg
│ │ ├── 2.ogg
│ │ ├── 3.ogg
│ │ ├── 4.ogg
│ │ ├── 5.ogg
│ │ ├── 6.ogg
│ │ ├── 7.ogg
│ │ ├── 8.ogg
│ │ ├── 9.ogg
│ │ ├── activation.ogg
│ │ ├── err_pin.ogg
│ │ ├── err_reg.ogg
│ │ ├── language.json
│ │ ├── upgrade.ogg
│ │ ├── welcome.ogg
│ │ └── wificonfig.ogg
│ ├── assets.cc
│ ├── assets.h
│ ├── audio/
│ │ ├── README.md
│ │ ├── audio_codec.cc
│ │ ├── audio_codec.h
│ │ ├── audio_processor.h
│ │ ├── audio_service.cc
│ │ ├── audio_service.h
│ │ ├── codecs/
│ │ │ ├── box_audio_codec.cc
│ │ │ ├── box_audio_codec.h
│ │ │ ├── dummy_audio_codec.cc
│ │ │ ├── dummy_audio_codec.h
│ │ │ ├── es8311_audio_codec.cc
│ │ │ ├── es8311_audio_codec.h
│ │ │ ├── es8374_audio_codec.cc
│ │ │ ├── es8374_audio_codec.h
│ │ │ ├── es8388_audio_codec.cc
│ │ │ ├── es8388_audio_codec.h
│ │ │ ├── es8389_audio_codec.cc
│ │ │ ├── es8389_audio_codec.h
│ │ │ ├── no_audio_codec.cc
│ │ │ └── no_audio_codec.h
│ │ ├── demuxer/
│ │ │ ├── ogg_demuxer.cc
│ │ │ └── ogg_demuxer.h
│ │ ├── processors/
│ │ │ ├── afe_audio_processor.cc
│ │ │ ├── afe_audio_processor.h
│ │ │ ├── audio_debugger.cc
│ │ │ ├── audio_debugger.h
│ │ │ ├── no_audio_processor.cc
│ │ │ └── no_audio_processor.h
│ │ ├── wake_word.h
│ │ └── wake_words/
│ │ ├── afe_wake_word.cc
│ │ ├── afe_wake_word.h
│ │ ├── custom_wake_word.cc
│ │ ├── custom_wake_word.h
│ │ ├── esp_wake_word.cc
│ │ └── esp_wake_word.h
│ ├── boards/
│ │ ├── aipi-lite/
│ │ │ ├── README.md
│ │ │ ├── README_en.md
│ │ │ ├── aipi-lite.cc
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── config_en.json
│ │ │ └── power_manager.h
│ │ ├── atk-dnesp32s3/
│ │ │ ├── atk_dnesp32s3.cc
│ │ │ ├── config.h
│ │ │ └── config.json
│ │ ├── atk-dnesp32s3-box/
│ │ │ ├── atk_dnesp32s3_box.cc
│ │ │ ├── config.h
│ │ │ └── config.json
│ │ ├── atk-dnesp32s3-box0/
│ │ │ ├── atk_dnesp32s3_box0.cc
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── power_manager.h
│ │ ├── atk-dnesp32s3-box2-4g/
│ │ │ ├── atk_dnesp32s3_box2.cc
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── power_manager.h
│ │ ├── atk-dnesp32s3-box2-wifi/
│ │ │ ├── atk_dnesp32s3_box2.cc
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── power_manager.h
│ │ ├── atk-dnesp32s3m-4g/
│ │ │ ├── atk_dnesp32s3m.cc
│ │ │ └── config.h
│ │ ├── atk-dnesp32s3m-wifi/
│ │ │ ├── atk_dnesp32s3m.cc
│ │ │ └── config.h
│ │ ├── atom-echos3r/
│ │ │ ├── README.md
│ │ │ ├── atom_echos3r.cc
│ │ │ ├── config.h
│ │ │ └── config.json
│ │ ├── atommatrix-echo-base/
│ │ │ ├── README.md
│ │ │ ├── atommatrix_echo_base.cc
│ │ │ ├── config.h
│ │ │ └── config.json
│ │ ├── atoms3-echo-base/
│ │ │ ├── README.md
│ │ │ ├── atoms3_echo_base.cc
│ │ │ ├── config.h
│ │ │ └── config.json
│ │ ├── atoms3r-cam-m12-echo-base/
│ │ │ ├── README.md
│ │ │ ├── atoms3r_cam_m12_echo_base.cc
│ │ │ ├── config.h
│ │ │ └── config.json
│ │ ├── atoms3r-echo-base/
│ │ │ ├── README.md
│ │ │ ├── atoms3r_echo_base.cc
│ │ │ ├── config.h
│ │ │ └── config.json
│ │ ├── bread-compact-esp32/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── esp32_bread_board.cc
│ │ ├── bread-compact-esp32-lcd/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── esp32_bread_board_lcd.cc
│ │ ├── bread-compact-ml307/
│ │ │ ├── compact_ml307_board.cc
│ │ │ ├── config.h
│ │ │ └── config.json
│ │ ├── bread-compact-nt26/
│ │ │ ├── compact_nt26_board.cc
│ │ │ ├── config.h
│ │ │ └── config.json
│ │ ├── bread-compact-wifi/
│ │ │ ├── compact_wifi_board.cc
│ │ │ ├── config.h
│ │ │ └── config.json
│ │ ├── bread-compact-wifi-lcd/
│ │ │ ├── compact_wifi_board_lcd.cc
│ │ │ └── config.h
│ │ ├── bread-compact-wifi-s3cam/
│ │ │ ├── README.md
│ │ │ ├── compact_wifi_board_s3cam.cc
│ │ │ └── config.h
│ │ ├── common/
│ │ │ ├── adc_battery_monitor.cc
│ │ │ ├── adc_battery_monitor.h
│ │ │ ├── afsk_demod.cc
│ │ │ ├── afsk_demod.h
│ │ │ ├── axp2101.cc
│ │ │ ├── axp2101.h
│ │ │ ├── backlight.cc
│ │ │ ├── backlight.h
│ │ │ ├── blufi.cpp
│ │ │ ├── blufi.h
│ │ │ ├── board.cc
│ │ │ ├── board.h
│ │ │ ├── button.cc
│ │ │ ├── button.h
│ │ │ ├── camera.h
│ │ │ ├── dual_network_board.cc
│ │ │ ├── dual_network_board.h
│ │ │ ├── esp32_camera.cc
│ │ │ ├── esp32_camera.h
│ │ │ ├── esp_video.cc
│ │ │ ├── esp_video.h
│ │ │ ├── i2c_device.cc
│ │ │ ├── i2c_device.h
│ │ │ ├── knob.cc
│ │ │ ├── knob.h
│ │ │ ├── lamp_controller.h
│ │ │ ├── ml307_board.cc
│ │ │ ├── ml307_board.h
│ │ │ ├── nt26_board.cc
│ │ │ ├── nt26_board.h
│ │ │ ├── power_save_timer.cc
│ │ │ ├── power_save_timer.h
│ │ │ ├── press_to_talk_mcp_tool.cc
│ │ │ ├── press_to_talk_mcp_tool.h
│ │ │ ├── rndis_board.cc
│ │ │ ├── rndis_board.h
│ │ │ ├── sleep_timer.cc
│ │ │ ├── sleep_timer.h
│ │ │ ├── sy6970.cc
│ │ │ ├── sy6970.h
│ │ │ ├── system_reset.cc
│ │ │ ├── system_reset.h
│ │ │ ├── wifi_board.cc
│ │ │ └── wifi_board.h
│ │ ├── df-k10/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── df_k10_board.cc
│ │ │ ├── k10_audio_codec.cc
│ │ │ ├── k10_audio_codec.h
│ │ │ ├── led_control.cc
│ │ │ └── led_control.h
│ │ ├── df-s3-ai-cam/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── df_s3_ai_cam.cc
│ │ ├── doit-s3-aibox/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── doit_s3_aibox.cc
│ │ ├── du-chatx/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── du-chatx-wifi.cc
│ │ │ └── power_manager.h
│ │ ├── electron-bot/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── electron_bot.cc
│ │ │ ├── electron_bot_controller.cc
│ │ │ ├── electron_emoji_display.cc
│ │ │ ├── electron_emoji_display.h
│ │ │ ├── movements.cc
│ │ │ ├── movements.h
│ │ │ ├── oscillator.cc
│ │ │ ├── oscillator.h
│ │ │ ├── otto_icon_font.c
│ │ │ └── power_manager.h
│ │ ├── esp-box/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── esp_box_board.cc
│ │ ├── esp-box-3/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── esp_box3_board.cc
│ │ ├── esp-box-lite/
│ │ │ ├── box_audio_codec_lite.cc
│ │ │ ├── box_audio_codec_lite.h
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── esp_box_lite_board.cc
│ │ ├── esp-hi/
│ │ │ ├── README.md
│ │ │ ├── adc_pdm_audio_codec.cc
│ │ │ ├── adc_pdm_audio_codec.h
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── emoji_display.cc
│ │ │ ├── emoji_display.h
│ │ │ └── esp_hi.cc
│ │ ├── esp-p4-function-ev-board/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── esp-p4-function-ev-board.cc
│ │ ├── esp-s3-lcd-ev-board/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── esp-s3-lcd-ev-board.cc
│ │ │ ├── esp_io_expander_tca9554.c
│ │ │ ├── esp_io_expander_tca9554.h
│ │ │ ├── esp_lcd_gc9503.c
│ │ │ ├── esp_lcd_gc9503.h
│ │ │ └── pin_config.h
│ │ ├── esp-s3-lcd-ev-board-2/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── esp-s3-lcd-ev-board-2.cc
│ │ │ ├── esp_lcd_gc9503.c
│ │ │ ├── esp_lcd_gc9503.h
│ │ │ └── pin_config.h
│ │ ├── esp-sensairshuttle/
│ │ │ ├── README.md
│ │ │ ├── adc_pdm_audio_codec.cc
│ │ │ ├── adc_pdm_audio_codec.h
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── esp-sensairshuttle.cc
│ │ ├── esp-sparkbot/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── esp_sparkbot_board.cc
│ │ ├── esp-spot/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── esp_spot_board.cc
│ │ ├── esp-vocat/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── esp_vocat.cc
│ │ │ └── touch.h
│ │ ├── esp32-cgc/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── esp32_cgc_board.cc
│ │ ├── esp32-cgc-144/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── esp32_cgc_144_board.cc
│ │ │ ├── power_manager.h
│ │ │ └── power_manager_lite.h
│ │ ├── esp32s3-korvo2-v3/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── esp32s3_korvo2_v3_board.cc
│ │ │ └── power_manager.h
│ │ ├── esp32s3-korvo2-v3-rndis/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── esp32s3_korvo2_v3_board.cc
│ │ │ └── power_manager.h
│ │ ├── genjutech-s3-1.54tft/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── genjutech-s3-1.54tft.cc
│ │ │ └── power_manager.h
│ │ ├── hu-087/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── hu_087_board.cc
│ │ ├── jiuchuan-s3/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── esp_lcd_panel_gc9301.c
│ │ │ ├── esp_lcd_panel_gc9301.h
│ │ │ ├── gpio_manager.h
│ │ │ ├── jiuchuan_dev_board.cc
│ │ │ ├── power_controller.h
│ │ │ └── power_manager.h
│ │ ├── kevin-box-2/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── kevin_box_board.cc
│ │ ├── kevin-c3/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── kevin_c3_board.cc
│ │ │ ├── led_strip_control.cc
│ │ │ └── led_strip_control.h
│ │ ├── kevin-sp-v3-dev/
│ │ │ ├── config.h
│ │ │ └── kevin-sp-v3_board.cc
│ │ ├── kevin-sp-v4-dev/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── kevin-sp-v4_board.cc
│ │ ├── kevin-yuying-313lcd/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── esp_lcd_gc9503.c
│ │ │ ├── esp_lcd_gc9503.h
│ │ │ ├── kevin_yuying_313lcd.cc
│ │ │ └── pin_config.h
│ │ ├── labplus-ledong-v2/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── labplus_ledong_v2.cc
│ │ ├── labplus-mpython-v3/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── mpython_pro.cc
│ │ ├── lceda-course-examples/
│ │ │ ├── eda-robot-pro/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── eda_dog_controller.cc
│ │ │ │ ├── eda_dog_movements.cc
│ │ │ │ ├── eda_dog_movements.h
│ │ │ │ ├── eda_robot_pro.cc
│ │ │ │ ├── oscillator.cc
│ │ │ │ └── oscillator.h
│ │ │ ├── eda-super-bear/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── eda_super_bear.cc
│ │ │ │ ├── eda_super_bear_controller.cc
│ │ │ │ ├── eda_super_bear_movements.cc
│ │ │ │ ├── eda_super_bear_movements.h
│ │ │ │ ├── oscillator.cc
│ │ │ │ └── oscillator.h
│ │ │ └── eda-tv-pro/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── eda-tv-pro.cc
│ │ ├── lichuang-c3-dev/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── lichuang_c3_dev_board.cc
│ │ ├── lichuang-dev/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── lichuang_dev_board.cc
│ │ ├── lilygo-t-cameraplus-s3/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── ir_filter_controller.h
│ │ │ ├── lilygo-t-cameraplus-s3.cc
│ │ │ ├── pin_config.h
│ │ │ ├── tcamerapluss3_audio_codec.cc
│ │ │ └── tcamerapluss3_audio_codec.h
│ │ ├── lilygo-t-circle-s3/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── esp_lcd_gc9d01n.c
│ │ │ ├── esp_lcd_gc9d01n.h
│ │ │ ├── lilygo-t-circle-s3.cc
│ │ │ ├── pin_config.h
│ │ │ ├── tcircles3_audio_codec.cc
│ │ │ └── tcircles3_audio_codec.h
│ │ ├── lilygo-t-display-p4/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── hi8561_driver.cc
│ │ │ ├── hi8561_driver.h
│ │ │ ├── lilygo-t-display-p4.cc
│ │ │ ├── rm69a10_driver.cc
│ │ │ ├── rm69a10_driver.h
│ │ │ └── t_display_p4_config.h
│ │ ├── lilygo-t-display-s3-pro-mvsrlora/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── lilygo-t-display-s3-pro-mvsrlora.cc
│ │ │ ├── pin_config.h
│ │ │ ├── tdisplays3promvsrlora_audio_codec.cc
│ │ │ └── tdisplays3promvsrlora_audio_codec.h
│ │ ├── m5stack-cardputer-adv/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── m5stack_cardputer_adv.cc
│ │ ├── m5stack-core-s3/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── cores3_audio_codec.cc
│ │ │ ├── cores3_audio_codec.h
│ │ │ └── m5stack_core_s3.cc
│ │ ├── m5stack-tab5/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── esp_lcd_st7123.c
│ │ │ ├── esp_lcd_st7123.h
│ │ │ ├── m5stack_tab5.cc
│ │ │ ├── sdkconfig.tab5
│ │ │ ├── tab5_audio_codec.cc
│ │ │ └── tab5_audio_codec.h
│ │ ├── magiclick-2p4/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── magiclick_2p4_board.cc
│ │ ├── magiclick-2p5/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── magiclick_2p5_board.cc
│ │ │ └── power_manager.h
│ │ ├── magiclick-c3/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── magiclick_c3_board.cc
│ │ ├── magiclick-c3-v2/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── magiclick_c3_v2_board.cc
│ │ ├── minsi-k08-dual/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── minsi_k08_dual.cc
│ │ │ └── power_manager.h
│ │ ├── mixgo-nova/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── mixgo-nova.cc
│ │ ├── movecall-cuican-esp32s3/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── movecall_cuican_esp32s3.cc
│ │ ├── movecall-moji-esp32s3/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── movecall_moji_esp32s3.cc
│ │ ├── movecall-moji2-esp32c5/
│ │ │ ├── README.md
│ │ │ ├── README_zh.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── movecall_moji2_esp32s3.cc
│ │ ├── otto-robot/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── oscillator.cc
│ │ │ ├── oscillator.h
│ │ │ ├── otto_controller.cc
│ │ │ ├── otto_emoji_display.cc
│ │ │ ├── otto_emoji_display.h
│ │ │ ├── otto_icon_font.c
│ │ │ ├── otto_movements.cc
│ │ │ ├── otto_movements.h
│ │ │ ├── otto_robot.cc
│ │ │ ├── power_manager.h
│ │ │ ├── websocket_control_server.cc
│ │ │ └── websocket_control_server.h
│ │ ├── sensecap-watcher/
│ │ │ ├── README.md
│ │ │ ├── README_en.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── config_en.json
│ │ │ ├── sensecap_audio_codec.cc
│ │ │ ├── sensecap_audio_codec.h
│ │ │ ├── sensecap_watcher.cc
│ │ │ ├── sscma_camera.cc
│ │ │ └── sscma_camera.h
│ │ ├── sp-esp32-s3-1.28-box/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── power_manager.h
│ │ │ └── sp-esp32-s3-1.28-box.cc
│ │ ├── sp-esp32-s3-1.54-muma/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── power_manager.h
│ │ │ └── sp-esp32-s3-1.54-muma.cc
│ │ ├── surfer-c3-1.14tft/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── power_manager.h
│ │ │ └── surfer-c3-1.14tft.cc
│ │ ├── taiji-pi-s3/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── taiji_pi_s3.cc
│ │ ├── tudouzi/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── kevin_box_board.cc
│ │ ├── waveshare/
│ │ │ ├── esp32-c6-lcd-1.69/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── esp32-c6-lcd-1.69.cc
│ │ │ │ └── power_manager.h
│ │ │ ├── esp32-c6-touch-amoled-1.32/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-c6-touch-amoled-1.32.cc
│ │ │ ├── esp32-c6-touch-amoled-1.43/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-c6-touch-amoled-1.43.cc
│ │ │ ├── esp32-c6-touch-amoled-1.8/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-c6-touch-amoled-1.8.cc
│ │ │ ├── esp32-c6-touch-amoled-2.06/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-c6-touch-amoled-2.06.cc
│ │ │ ├── esp32-c6-touch-lcd-1.83/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-c6-touch-lcd-1.83.cc
│ │ │ ├── esp32-p4-nano/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── esp32-p4-nano.cc
│ │ │ │ └── lcd_init_cmds.h
│ │ │ ├── esp32-p4-wifi6-touch-lcd/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── esp32-p4-wifi6-touch-lcd.cc
│ │ │ │ └── lcd_init_cmds.h
│ │ │ ├── esp32-s3-audio-board/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── esp32-s3-audio_board.cc
│ │ │ │ ├── esp_lcd_jd9853.c
│ │ │ │ └── esp_lcd_jd9853.h
│ │ │ ├── esp32-s3-epaper-1.54/
│ │ │ │ ├── README.md
│ │ │ │ ├── board_power_bsp.cc
│ │ │ │ ├── board_power_bsp.h
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── custom_lcd_display.cc
│ │ │ │ ├── custom_lcd_display.h
│ │ │ │ └── waveshare-s3-epaper-1.54.cc
│ │ │ ├── esp32-s3-epaper-3.97/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── custom_lcd_display.cc
│ │ │ │ ├── custom_lcd_display.h
│ │ │ │ └── waveshare-s3-epaper-3.97.cc
│ │ │ ├── esp32-s3-rlcd-4.2/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── custom_lcd_display.cc
│ │ │ │ ├── custom_lcd_display.h
│ │ │ │ └── waveshare-s3-rlcd-4.2.cc
│ │ │ ├── esp32-s3-touch-amoled-1.32/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-s3-touch-amoled-1.32.cc
│ │ │ ├── esp32-s3-touch-amoled-1.75/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-s3-touch-amoled-1.75.cc
│ │ │ ├── esp32-s3-touch-amoled-1.8/
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-s3-touch-amoled-1.8.cc
│ │ │ ├── esp32-s3-touch-amoled-2.06/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-s3-touch-amoled-2.06.cc
│ │ │ ├── esp32-s3-touch-lcd-1.46/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-s3-touch-lcd-1.46.cc
│ │ │ ├── esp32-s3-touch-lcd-1.83/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-s3-touch-lcd-1.83.cc
│ │ │ ├── esp32-s3-touch-lcd-1.85/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-s3-touch-lcd-1.85.cc
│ │ │ ├── esp32-s3-touch-lcd-1.85c/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-s3-touch-lcd-1.85c.cc
│ │ │ ├── esp32-s3-touch-lcd-3.49/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── custom_lcd_display.cc
│ │ │ │ ├── custom_lcd_display.h
│ │ │ │ └── waveshare-s3-touch-lcd-3.49.cc
│ │ │ ├── esp32-s3-touch-lcd-3.5/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-s3-touch-lcd-3.5.cc
│ │ │ ├── esp32-s3-touch-lcd-3.5b/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── custom_lcd_display.cc
│ │ │ │ ├── custom_lcd_display.h
│ │ │ │ └── waveshare-s3-touch-lcd-3.5b.cc
│ │ │ ├── esp32-s3-touch-lcd-4.3c/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ ├── esp32_s3_touch_lcd_4.3c.cc
│ │ │ │ └── sdkconfig.4_3c
│ │ │ ├── esp32-s3-touch-lcd-4b/
│ │ │ │ ├── README.md
│ │ │ │ ├── config.h
│ │ │ │ ├── config.json
│ │ │ │ └── esp32-s3-touch-lcd-4b.cc
│ │ │ └── esp32-touch-lcd-3.5/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── esp32-touch-lcd-3.5.cc
│ │ ├── wireless-tag-wtp4c5mp07s/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── wireless-tag-wtp4c5mp07s.cc
│ │ ├── xingzhi-abs-2.0/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── customlcddisplay.h
│ │ │ ├── power_manager.h
│ │ │ └── xingzhi-abs-2.0.cc
│ │ ├── xingzhi-cube-0.85tft-ml307/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── xingzhi-cube-0.85tft-ml307.cc
│ │ ├── xingzhi-cube-0.85tft-wifi/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── xingzhi-cube-0.85tft-wifi.cc
│ │ ├── xingzhi-cube-0.96oled-ml307/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── xingzhi-cube-0.96oled-ml307.cc
│ │ ├── xingzhi-cube-0.96oled-wifi/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── xingzhi-cube-0.96oled-wifi.cc
│ │ ├── xingzhi-cube-1.54tft-ml307/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── xingzhi-cube-1.54tft-ml307.cc
│ │ ├── xingzhi-cube-1.54tft-wifi/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── power_manager.h
│ │ │ └── xingzhi-cube-1.54tft-wifi.cc
│ │ ├── xingzhi-metal-1.54-wifi/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── cst816x.cc
│ │ │ ├── cst816x.h
│ │ │ ├── power_manager.h
│ │ │ └── xingzhi-metal-1.54-wifi.cc
│ │ ├── xmini-c3/
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── xmini_c3_board.cc
│ │ ├── xmini-c3-4g/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── xmini_c3_4g_board.cc
│ │ ├── xmini-c3-v3/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── xmini_c3_board.cc
│ │ ├── yunliao-s3/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── power_manager.cc
│ │ │ ├── power_manager.h
│ │ │ └── yunliao_s3.cc
│ │ ├── zhengchen-1.54tft-ml307/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ └── zhengchen-1.54tft-ml307.cc
│ │ ├── zhengchen-1.54tft-wifi/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── power_manager.h
│ │ │ ├── zhengchen-1.54tft-wifi.cc
│ │ │ └── zhengchen_lcd_display.h
│ │ ├── zhengchen-cam/
│ │ │ ├── README.md
│ │ │ ├── config.h
│ │ │ ├── config.json
│ │ │ ├── mcp_controller.cc
│ │ │ ├── power_manager.h
│ │ │ └── zhengchen_cam_board.cc
│ │ └── zhengchen-cam-ml307/
│ │ ├── README.md
│ │ ├── config.h
│ │ ├── config.json
│ │ ├── mcp_controller.cc
│ │ ├── power_manager.h
│ │ └── zhengchen_cam_board_ml307.cc
│ ├── device_state.h
│ ├── device_state_machine.cc
│ ├── device_state_machine.h
│ ├── display/
│ │ ├── display.cc
│ │ ├── display.h
│ │ ├── emote_display.cc
│ │ ├── emote_display.h
│ │ ├── lcd_display.cc
│ │ ├── lcd_display.h
│ │ ├── lvgl_display/
│ │ │ ├── emoji_collection.cc
│ │ │ ├── emoji_collection.h
│ │ │ ├── gif/
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── README.md
│ │ │ │ ├── gifdec.c
│ │ │ │ ├── gifdec.h
│ │ │ │ ├── gifdec_mve.h
│ │ │ │ ├── lvgl_gif.cc
│ │ │ │ └── lvgl_gif.h
│ │ │ ├── jpg/
│ │ │ │ ├── image_to_jpeg.cpp
│ │ │ │ ├── image_to_jpeg.h
│ │ │ │ ├── jpeg_to_image.c
│ │ │ │ └── jpeg_to_image.h
│ │ │ ├── lvgl_display.cc
│ │ │ ├── lvgl_display.h
│ │ │ ├── lvgl_font.cc
│ │ │ ├── lvgl_font.h
│ │ │ ├── lvgl_image.cc
│ │ │ ├── lvgl_image.h
│ │ │ ├── lvgl_theme.cc
│ │ │ └── lvgl_theme.h
│ │ ├── oled_display.cc
│ │ └── oled_display.h
│ ├── idf_component.yml
│ ├── led/
│ │ ├── circular_strip.cc
│ │ ├── circular_strip.h
│ │ ├── gpio_led.cc
│ │ ├── gpio_led.h
│ │ ├── led.h
│ │ ├── single_led.cc
│ │ └── single_led.h
│ ├── main.cc
│ ├── mcp_server.cc
│ ├── mcp_server.h
│ ├── ota.cc
│ ├── ota.h
│ ├── protocols/
│ │ ├── mqtt_protocol.cc
│ │ ├── mqtt_protocol.h
│ │ ├── protocol.cc
│ │ ├── protocol.h
│ │ ├── websocket_protocol.cc
│ │ └── websocket_protocol.h
│ ├── settings.cc
│ ├── settings.h
│ ├── system_info.cc
│ └── system_info.h
├── partitions/
│ ├── v1/
│ │ ├── 16m.csv
│ │ ├── 16m_custom_wakeword.csv
│ │ ├── 16m_echoear.csv
│ │ ├── 32m.csv
│ │ ├── 4m.csv
│ │ ├── 4m_esp-hi.csv
│ │ └── 8m.csv
│ └── v2/
│ ├── 16m.csv
│ ├── 16m_c3.csv
│ ├── 32m.csv
│ ├── 4m.csv
│ ├── 8m.csv
│ └── README.md
├── scripts/
│ ├── Image_Converter/
│ │ ├── LVGLImage.py
│ │ ├── README.md
│ │ ├── lvgl_tools_gui.py
│ │ └── requirements.txt
│ ├── acoustic_check/
│ │ ├── demod.py
│ │ ├── graphic.py
│ │ ├── main.py
│ │ ├── readme.md
│ │ └── requirements.txt
│ ├── audio_debug_server.py
│ ├── build_default_assets.py
│ ├── download_github_runs.py
│ ├── gen_lang.py
│ ├── mp3_to_ogg.sh
│ ├── ogg_converter/
│ │ ├── README.md
│ │ └── xiaozhi_ogg_converter.py
│ ├── p3_tools/
│ │ ├── README.md
│ │ ├── batch_convert_gui.py
│ │ ├── convert_audio_to_p3.py
│ │ ├── convert_p3_to_audio.py
│ │ ├── p3_gui_player.py
│ │ ├── play_p3.py
│ │ └── requirements.txt
│ ├── release.py
│ ├── sonic_wifi_config.html
│ ├── spiffs_assets/
│ │ ├── README.md
│ │ ├── build.py
│ │ ├── build_all.py
│ │ ├── pack_model.py
│ │ └── spiffs_assets_gen.py
│ └── versions.py
├── sdkconfig.defaults
├── sdkconfig.defaults.esp32
├── sdkconfig.defaults.esp32c3
├── sdkconfig.defaults.esp32c5
├── sdkconfig.defaults.esp32c6
├── sdkconfig.defaults.esp32p4
└── sdkconfig.defaults.esp32s3
================================================
FILE CONTENTS
================================================
================================================
FILE: .clang-format
================================================
---
Language: Cpp
BasedOnStyle: Google
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Left
AlignOperands: true
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: ExceptShortType
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: false
SplitEmptyRecord: false
SplitEmptyNamespace: false
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 100
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- cJSON_ArrayForEach
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^<esp_.*\.h>'
Priority: 1
- Regex: '^<driver/.*\.h>'
Priority: 1
- Regex: '^<.*\.h>'
Priority: 2
- Regex: '^<.*'
Priority: 3
- Regex: '.*'
Priority: 4
IncludeIsMainRegex: '([-_](test|unittest))?$'
IndentCaseLabels: true
IndentPPDirectives: None
IndentWidth: 4
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: false
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 1
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Left
RawStringFormats:
- Language: Cpp
Delimiters:
- cc
- CC
- cpp
- Cpp
- CPP
- 'c++'
- 'C++'
CanonicalDelimiter: ''
BasedOnStyle: google
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Latest
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 4
UseTab: Never
================================================
FILE: .github/ISSUE_TEMPLATE/01_build_install_bug.yml
================================================
name: Installation or build bug report
description: Report installation or build bugs
labels: ['bug']
body:
- type: checkboxes
id: checklist
attributes:
label: Answers checklist.
description: Before submitting a new issue, please follow the checklist and try to find the answer.
options:
- label: I have read the documentation [XiaoZhi AI Programming Guide](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb) and the issue is not addressed there.
required: true
- label: I have updated my branch (master or release) to the latest version and checked that the issue is present there.
required: true
- label: I have searched the issue tracker for a similar issue and not found a similar issue.
required: true
- type: input
id: xiaozhi_ai_version
attributes:
label: XiaoZhi AI version.
description: On which XiaoZhi AI version does this issue occur on? Run `git describe --tags` to find it.
placeholder: ex. v1.1.0-44-g140aab8
validations:
required: true
- type: dropdown
id: operating_system
attributes:
label: Operating System used.
multiple: false
options:
- Windows
- Linux
- macOS
validations:
required: true
- type: dropdown
id: build
attributes:
label: How did you build your project?
multiple: false
options:
- Command line with CMake
- Command line with idf.py
- CLion IDE
- VS Code IDE/Cursor
- Other (please specify in More Information)
validations:
required: true
- type: dropdown
id: windows_comand_line
attributes:
label: If you are using Windows, please specify command line type.
multiple: false
options:
- PowerShell
- CMD
validations:
required: false
- type: textarea
id: expected
attributes:
label: What is the expected behavior?
description: Please provide a clear and concise description of the expected behavior.
placeholder: I expected it to...
validations:
required: true
- type: textarea
id: actual
attributes:
label: What is the actual behavior?
description: Please describe actual behavior.
placeholder: Instead it...
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to reproduce.
description: 'How do you trigger this bug? Please walk us through it step by step. If this is build bug, please attach sdkconfig file (from your project folder). Please attach your code here.'
value: |
1. Step
2. Step
3. Step
...
validations:
required: true
- type: textarea
id: debug_logs
attributes:
label: Build or installation Logs.
description: Build or installation log goes here, should contain the backtrace, as well as the reset source if it is a crash.
placeholder: Your log goes here.
render: plain
validations:
required: false
- type: textarea
id: more-info
attributes:
label: More Information.
description: Do you have any other information from investigating this?
placeholder: ex. Any more.
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/02_runtime_bug.yml
================================================
name: Runtime bug report
description: Report runtime bugs
labels: ['bug']
body:
- type: checkboxes
id: checklist
attributes:
label: Answers checklist.
description: Before submitting a new issue, please follow the checklist and try to find the answer.
options:
- label: I have read the documentation [XiaoZhi AI Programming Guide](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb) and the issue is not addressed there.
required: true
- label: I have updated my firmware to the latest version and checked that the issue is present there.
required: true
- label: I have searched the issue tracker for a similar issue and not found a similar issue.
required: true
- type: input
id: xiaozhi_ai_firmware_version
attributes:
label: XiaoZhi AI firmware version.
description: On which firmware version does this issue occur on?
placeholder: ex. v1.2.1_bread-compact-wifi
validations:
required: true
- type: dropdown
id: operating_system
attributes:
label: Operating System used.
multiple: false
options:
- Windows
- Linux
- macOS
validations:
required: true
- type: dropdown
id: build
attributes:
label: How did you build your project?
multiple: false
options:
- Command line with CMake
- Command line with idf.py
- CLion IDE
- VS Code IDE/Cursor
- Other (please specify in More Information)
validations:
required: true
- type: dropdown
id: windows_comand_line
attributes:
label: If you are using Windows, please specify command line type.
multiple: false
options:
- PowerShell
- CMD
validations:
required: false
- type: dropdown
id: power_supply
attributes:
label: Power Supply used.
multiple: false
options:
- USB
- External 5V
- External 3.3V
- Battery
validations:
required: true
- type: textarea
id: expected
attributes:
label: What is the expected behavior?
description: Please provide a clear and concise description of the expected behavior.
placeholder: I expected it to...
validations:
required: true
- type: textarea
id: actual
attributes:
label: What is the actual behavior?
description: Please describe actual behavior.
placeholder: Instead it...
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to reproduce.
description: 'How do you trigger this bug? Please walk us through it step by step. Please attach your code here.'
value: |
1. Step
2. Step
3. Step
...
validations:
required: true
- type: textarea
id: debug_logs
attributes:
label: Debug Logs.
description: Debug log goes here, should contain the backtrace, as well as the reset source if it is a crash.
placeholder: Your log goes here.
render: plain
validations:
required: false
- type: textarea
id: more-info
attributes:
label: More Information.
description: Do you have any other information from investigating this?
placeholder: ex. Any more.
validations:
required: false
================================================
FILE: .github/ISSUE_TEMPLATE/03_feature_request.yml
================================================
name: Feature request
description: Suggest an idea for this project.
labels: ['enhancement']
body:
- type: markdown
attributes:
value: |
* We welcome any ideas or feature requests! It’s helpful if you can explain exactly why the feature would be useful.
* There are usually some outstanding feature requests in the [existing issues list](https://github.com/78/xiaozhi-esp32/labels/enhancement), feel free to add comments to them.
* If you would like to contribute, please read the [contributions guide](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb).
- type: textarea
id: problem-related
attributes:
label: Is your feature request related to a problem?
description: Please provide a clear and concise description of what the problem is.
placeholder: ex. I'm always frustrated when ...
- type: textarea
id: solution
attributes:
label: Describe the solution you'd like.
description: Please provide a clear and concise description of what you want to happen.
placeholder: ex. When using XiaoZhi ...
- type: textarea
id: alternatives
attributes:
label: Describe alternatives you've considered.
description: Please provide a clear and concise description of any alternative solutions or features you've considered.
placeholder: ex. Choosing other approach wouldn't work, because ...
- type: textarea
id: context
attributes:
label: Additional context.
description: Please add any other context or screenshots about the feature request here.
placeholder: ex. This would work only when ...
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: true
contact_links:
- name: 小智 AI 官方网站
url: https://xiaozhi.me/
about: 激活设备、配置 AI、声纹识别、声音克隆等应有尽有,DIY 属于你自己的小智
- name: 小智 AI 聊天机器人百科全书
url: https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb
about: 开发文档、硬件制作、烧录教程、FAQ尽在小智百科
================================================
FILE: .github/workflows/build.yml
================================================
name: Build Boards
on:
push:
branches:
- main
- ci/* # for ci test
pull_request:
branches:
- main
permissions:
contents: read
jobs:
prepare:
name: Determine variants to build
runs-on: ubuntu-latest
outputs:
variants: ${{ steps.select.outputs.variants }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install jq
run: sudo apt-get update && sudo apt-get install -y jq
- id: list
name: Get all variant list
run: |
echo "all_variants=$(python scripts/release.py --list-boards --json)" >> $GITHUB_OUTPUT
- id: select
name: Select variants based on changes
env:
ALL_VARIANTS: ${{ steps.list.outputs.all_variants }}
run: |
EVENT_NAME="${{ github.event_name }}"
# push 到 main 分支,编译全部变体
if [[ "$EVENT_NAME" == "push" ]]; then
echo "variants=$ALL_VARIANTS" >> $GITHUB_OUTPUT
exit 0
fi
# pull_request 场景
BASE_SHA="${{ github.event.pull_request.base.sha }}"
HEAD_SHA="${{ github.event.pull_request.head.sha }}"
echo "Base: $BASE_SHA, Head: $HEAD_SHA"
CHANGED=$(git diff --name-only $BASE_SHA $HEAD_SHA || true)
echo -e "Changed files:\n$CHANGED"
NEED_ALL=0
declare -A AFFECTED
while IFS= read -r file; do
if [[ "$file" == main/* && "$file" != main/boards/* ]]; then
NEED_ALL=1
fi
if [[ "$file" == main/boards/common/* ]]; then
NEED_ALL=1
fi
if [[ "$file" == main/boards/* ]]; then
board=$(echo "$file" | cut -d '/' -f3)
AFFECTED[$board]=1
fi
done <<< "$CHANGED"
if [[ "$NEED_ALL" -eq 1 ]]; then
echo "variants=$ALL_VARIANTS" >> $GITHUB_OUTPUT
else
if [[ ${#AFFECTED[@]} -eq 0 ]]; then
echo "variants=[]" >> $GITHUB_OUTPUT
else
BOARDS_JSON=$(printf '%s\n' "${!AFFECTED[@]}" | sort -u | jq -R -s -c 'split("\n")[:-1]')
FILTERED=$(echo "$ALL_VARIANTS" | jq -c --argjson boards "$BOARDS_JSON" 'map(select(.board as $b | $boards | index($b)))')
echo "variants=$FILTERED" >> $GITHUB_OUTPUT
fi
fi
build:
name: Build ${{ matrix.full_name }}
needs: prepare
if: ${{ needs.prepare.outputs.variants != '[]' }}
strategy:
fail-fast: false # 单个变体失败不影响其它变体
matrix:
include: ${{ fromJson(needs.prepare.outputs.variants) }}
runs-on: ubuntu-latest
container:
image: espressif/idf:v5.5.2
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build current variant
shell: bash
run: |
source $IDF_PATH/export.sh
python scripts/release.py ${{ matrix.board }} --name ${{ matrix.name }}
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: xiaozhi_${{ matrix.full_name }}_${{ github.sha }}
path: build/merged-binary.bin
if-no-files-found: error
================================================
FILE: .gitignore
================================================
tmp/
components/
managed_components/
build/
dist/
.vscode/
.devcontainer/
sdkconfig.old
sdkconfig
dependencies.lock
.env
releases/
main/assets/lang_config.h
main/mmap_generate_emoji.h
.DS_Store
.cache
*.pyc
*.bin
mmap_generate_*.h
.clangd
================================================
FILE: CMakeLists.txt
================================================
# The following lines of boilerplate have to be in your project's
# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.16)
# Add this line to disable the specific warning
add_compile_options(-Wno-missing-field-initializers)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
# "Trim" the build. Include the minimal set of components, main, and anything it depends on.
idf_build_set_property(MINIMAL_BUILD ON)
set(PROJECT_VER "2.2.4")
project(xiaozhi)
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2025 Shenzhen Xinzhi Future Technology Co., Ltd.
Copyright (c) 2025 Project Contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# An MCP-based Chatbot
(English | [中文](README_zh.md) | [日本語](README_ja.md))
## Introduction
👉 [Human: Give AI a camera vs AI: Instantly finds out the owner hasn't washed hair for three days【bilibili】](https://www.bilibili.com/video/BV1bpjgzKEhd/)
👉 [Handcraft your AI girlfriend, beginner's guide【bilibili】](https://www.bilibili.com/video/BV1XnmFYLEJN/)
As a voice interaction entry, the XiaoZhi AI chatbot leverages the AI capabilities of large models like Qwen / DeepSeek, and achieves multi-terminal control via the MCP protocol.
<img src="docs/mcp-based-graph.jpg" alt="Control everything via MCP" width="320">
## Version Notes
The current v2 version is incompatible with the v1 partition table, so it is not possible to upgrade from v1 to v2 via OTA. For partition table details, see [partitions/v2/README.md](partitions/v2/README.md).
All hardware running v1 can be upgraded to v2 by manually flashing the firmware.
The stable version of v1 is 1.9.2. You can switch to v1 by running `git checkout v1`. The v1 branch will be maintained until February 2026.
### Features Implemented
- Wi-Fi / ML307 Cat.1 4G
- Offline voice wake-up [ESP-SR](https://github.com/espressif/esp-sr)
- Supports two communication protocols ([Websocket](docs/websocket.md) or MQTT+UDP)
- Uses OPUS audio codec
- Voice interaction based on streaming ASR + LLM + TTS architecture
- Speaker recognition, identifies the current speaker [3D Speaker](https://github.com/modelscope/3D-Speaker)
- OLED / LCD display, supports emoji display
- Battery display and power management
- Multi-language support (Chinese, English, Japanese)
- Supports ESP32-C3, ESP32-S3, ESP32-P4 chip platforms
- Device-side MCP for device control (Speaker, LED, Servo, GPIO, etc.)
- Cloud-side MCP to extend large model capabilities (smart home control, PC desktop operation, knowledge search, email, etc.)
- Customizable wake words, fonts, emojis, and chat backgrounds with online web-based editing ([Custom Assets Generator](https://github.com/78/xiaozhi-assets-generator))
## Hardware
### Breadboard DIY Practice
See the Feishu document tutorial:
👉 ["XiaoZhi AI Chatbot Encyclopedia"](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb?from=from_copylink)
Breadboard demo:

### Supports 70+ Open Source Hardware (Partial List)
- <a href="https://oshwhub.com/li-chuang-kai-fa-ban/li-chuang-shi-zhan-pai-esp32-s3-kai-fa-ban" target="_blank" title="LiChuang ESP32-S3 Development Board">LiChuang ESP32-S3 Development Board</a>
- <a href="https://github.com/espressif/esp-box" target="_blank" title="Espressif ESP32-S3-BOX3">Espressif ESP32-S3-BOX3</a>
- <a href="https://docs.m5stack.com/zh_CN/core/CoreS3" target="_blank" title="M5Stack CoreS3">M5Stack CoreS3</a>
- <a href="https://docs.m5stack.com/en/atom/Atomic%20Echo%20Base" target="_blank" title="AtomS3R + Echo Base">M5Stack AtomS3R + Echo Base</a>
- <a href="https://gf.bilibili.com/item/detail/1108782064" target="_blank" title="Magic Button 2.4">Magic Button 2.4</a>
- <a href="https://www.waveshare.net/shop/ESP32-S3-Touch-AMOLED-1.8.htm" target="_blank" title="Waveshare ESP32-S3-Touch-AMOLED-1.8">Waveshare ESP32-S3-Touch-AMOLED-1.8</a>
- <a href="https://github.com/Xinyuan-LilyGO/T-Circle-S3" target="_blank" title="LILYGO T-Circle-S3">LILYGO T-Circle-S3</a>
- <a href="https://oshwhub.com/tenclass01/xmini_c3" target="_blank" title="XiaGe Mini C3">XiaGe Mini C3</a>
- <a href="https://oshwhub.com/movecall/cuican-ai-pendant-lights-up-y" target="_blank" title="Movecall CuiCan ESP32S3">CuiCan AI Pendant</a>
- <a href="https://github.com/WMnologo/xingzhi-ai" target="_blank" title="WMnologo-Xingzhi-1.54">WMnologo-Xingzhi-1.54TFT</a>
- <a href="https://www.seeedstudio.com/SenseCAP-Watcher-W1-A-p-5979.html" target="_blank" title="SenseCAP Watcher">SenseCAP Watcher</a>
- <a href="https://www.bilibili.com/video/BV1BHJtz6E2S/" target="_blank" title="ESP-HI Low Cost Robot Dog">ESP-HI Low Cost Robot Dog</a>
<div style="display: flex; justify-content: space-between;">
<a href="docs/v1/lichuang-s3.jpg" target="_blank" title="LiChuang ESP32-S3 Development Board">
<img src="docs/v1/lichuang-s3.jpg" width="240" />
</a>
<a href="docs/v1/espbox3.jpg" target="_blank" title="Espressif ESP32-S3-BOX3">
<img src="docs/v1/espbox3.jpg" width="240" />
</a>
<a href="docs/v1/m5cores3.jpg" target="_blank" title="M5Stack CoreS3">
<img src="docs/v1/m5cores3.jpg" width="240" />
</a>
<a href="docs/v1/atoms3r.jpg" target="_blank" title="AtomS3R + Echo Base">
<img src="docs/v1/atoms3r.jpg" width="240" />
</a>
<a href="docs/v1/magiclick.jpg" target="_blank" title="Magic Button 2.4">
<img src="docs/v1/magiclick.jpg" width="240" />
</a>
<a href="docs/v1/waveshare.jpg" target="_blank" title="Waveshare ESP32-S3-Touch-AMOLED-1.8">
<img src="docs/v1/waveshare.jpg" width="240" />
</a>
<a href="docs/v1/lilygo-t-circle-s3.jpg" target="_blank" title="LILYGO T-Circle-S3">
<img src="docs/v1/lilygo-t-circle-s3.jpg" width="240" />
</a>
<a href="docs/v1/xmini-c3.jpg" target="_blank" title="XiaGe Mini C3">
<img src="docs/v1/xmini-c3.jpg" width="240" />
</a>
<a href="docs/v1/movecall-cuican-esp32s3.jpg" target="_blank" title="CuiCan">
<img src="docs/v1/movecall-cuican-esp32s3.jpg" width="240" />
</a>
<a href="docs/v1/wmnologo_xingzhi_1.54.jpg" target="_blank" title="WMnologo-Xingzhi-1.54">
<img src="docs/v1/wmnologo_xingzhi_1.54.jpg" width="240" />
</a>
<a href="docs/v1/sensecap_watcher.jpg" target="_blank" title="SenseCAP Watcher">
<img src="docs/v1/sensecap_watcher.jpg" width="240" />
</a>
<a href="docs/v1/esp-hi.jpg" target="_blank" title="ESP-HI Low Cost Robot Dog">
<img src="docs/v1/esp-hi.jpg" width="240" />
</a>
</div>
## Software
### Firmware Flashing
For beginners, it is recommended to use the firmware that can be flashed without setting up a development environment.
The firmware connects to the official [xiaozhi.me](https://xiaozhi.me) server by default. Personal users can register an account to use the Qwen real-time model for free.
👉 [Beginner's Firmware Flashing Guide](https://ccnphfhqs21z.feishu.cn/wiki/Zpz4wXBtdimBrLk25WdcXzxcnNS)
### Development Environment
- Cursor or VSCode
- Install ESP-IDF plugin, select SDK version 5.4 or above
- Linux is better than Windows for faster compilation and fewer driver issues
- This project uses Google C++ code style, please ensure compliance when submitting code
### Developer Documentation
- [Custom Board Guide](docs/custom-board.md) - Learn how to create custom boards for XiaoZhi AI
- [MCP Protocol IoT Control Usage](docs/mcp-usage.md) - Learn how to control IoT devices via MCP protocol
- [MCP Protocol Interaction Flow](docs/mcp-protocol.md) - Device-side MCP protocol implementation
- [MQTT + UDP Hybrid Communication Protocol Document](docs/mqtt-udp.md)
- [A detailed WebSocket communication protocol document](docs/websocket.md)
## Large Model Configuration
If you already have a XiaoZhi AI chatbot device and have connected to the official server, you can log in to the [xiaozhi.me](https://xiaozhi.me) console for configuration.
👉 [Backend Operation Video Tutorial (Old Interface)](https://www.bilibili.com/video/BV1jUCUY2EKM/)
## Related Open Source Projects
For server deployment on personal computers, refer to the following open-source projects:
- [xinnan-tech/xiaozhi-esp32-server](https://github.com/xinnan-tech/xiaozhi-esp32-server) Python server
- [joey-zhou/xiaozhi-esp32-server-java](https://github.com/joey-zhou/xiaozhi-esp32-server-java) Java server
- [AnimeAIChat/xiaozhi-server-go](https://github.com/AnimeAIChat/xiaozhi-server-go) Golang server
- [hackers365/xiaozhi-esp32-server-golang](https://github.com/hackers365/xiaozhi-esp32-server-golang) Golang server
Other client projects using the XiaoZhi communication protocol:
- [huangjunsen0406/py-xiaozhi](https://github.com/huangjunsen0406/py-xiaozhi) Python client
- [TOM88812/xiaozhi-android-client](https://github.com/TOM88812/xiaozhi-android-client) Android client
- [100askTeam/xiaozhi-linux](http://github.com/100askTeam/xiaozhi-linux) Linux client by 100ask
- [78/xiaozhi-sf32](https://github.com/78/xiaozhi-sf32) Bluetooth chip firmware by Sichuan
- [QuecPython/solution-xiaozhiAI](https://github.com/QuecPython/solution-xiaozhiAI) QuecPython firmware by Quectel
Custom Assets Tools:
- [78/xiaozhi-assets-generator](https://github.com/78/xiaozhi-assets-generator) Custom Assets Generator (Wake words, fonts, emojis, backgrounds)
## About the Project
This is an open-source ESP32 project, released under the MIT license, allowing anyone to use it for free, including for commercial purposes.
We hope this project helps everyone understand AI hardware development and apply rapidly evolving large language models to real hardware devices.
If you have any ideas or suggestions, please feel free to raise Issues or join our [Discord](https://discord.gg/C759fGMBcZ) or QQ group: 994694848
## Star History
<a href="https://star-history.com/#78/xiaozhi-esp32&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=78/xiaozhi-esp32&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=78/xiaozhi-esp32&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=78/xiaozhi-esp32&type=Date" />
</picture>
</a>
================================================
FILE: README_ja.md
================================================
# MCP ベースのチャットボット
(日本語 | [中文](README_zh.md) | [English](README.md))
## はじめに
👉 [人間:AIにカメラを装着 vs AI:その場で飼い主が3日間髪を洗っていないことを発見【bilibili】](https://www.bilibili.com/video/BV1bpjgzKEhd/)
👉 [手作りでAIガールフレンドを作る、初心者入門チュートリアル【bilibili】](https://www.bilibili.com/video/BV1XnmFYLEJN/)
シャオジーAIチャットボットは音声インタラクションの入口として、Qwen / DeepSeekなどの大規模モデルのAI能力を活用し、MCPプロトコルを通じてマルチエンド制御を実現します。
<img src="docs/mcp-based-graph.jpg" alt="MCPであらゆるものを制御" width="320">
## バージョンノート
現在のv2バージョンはv1パーティションテーブルと互換性がないため、v1からv2へOTAでアップグレードすることはできません。パーティションテーブルの詳細については、[partitions/v2/README.md](partitions/v2/README.md)をご参照ください。
v1を実行しているすべてのハードウェアは、ファームウェアを手動で書き込むことでv2にアップグレードできます。
v1の安定版は1.9.2です。`git checkout v1`でv1に切り替えることができます。v1ブランチは2026年2月まで継続的にメンテナンスされます。
### 実装済み機能
- Wi-Fi / ML307 Cat.1 4G
- オフライン音声ウェイクアップ [ESP-SR](https://github.com/espressif/esp-sr)
- 2種類の通信プロトコルに対応([Websocket](docs/websocket.md) または MQTT+UDP)
- OPUSオーディオコーデックを採用
- ストリーミングASR + LLM + TTSアーキテクチャに基づく音声インタラクション
- 話者認識、現在話している人を識別 [3D Speaker](https://github.com/modelscope/3D-Speaker)
- OLED / LCDディスプレイ、表情表示対応
- バッテリー表示と電源管理
- 多言語対応(中国語、英語、日本語)
- ESP32-C3、ESP32-S3、ESP32-P4チッププラットフォーム対応
- デバイス側MCPによるデバイス制御(音量・明るさ調整、アクション制御など)
- クラウド側MCPで大規模モデル能力を拡張(スマートホーム制御、PCデスクトップ操作、知識検索、メール送受信など)
- カスタマイズ可能なウェイクワード、フォント、絵文字、チャット背景、オンラインWeb編集に対応 ([カスタムアセットジェネレーター](https://github.com/78/xiaozhi-assets-generator))
## ハードウェア
### ブレッドボード手作り実践
Feishuドキュメントチュートリアルをご覧ください:
👉 [「シャオジーAIチャットボット百科事典」](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb?from=from_copylink)
ブレッドボードのデモ:

### 70種類以上のオープンソースハードウェアに対応(一部のみ表示)
- <a href="https://oshwhub.com/li-chuang-kai-fa-ban/li-chuang-shi-zhan-pai-esp32-s3-kai-fa-ban" target="_blank" title="立創・実戦派 ESP32-S3 開発ボード">立創・実戦派 ESP32-S3 開発ボード</a>
- <a href="https://github.com/espressif/esp-box" target="_blank" title="楽鑫 ESP32-S3-BOX3">楽鑫 ESP32-S3-BOX3</a>
- <a href="https://docs.m5stack.com/zh_CN/core/CoreS3" target="_blank" title="M5Stack CoreS3">M5Stack CoreS3</a>
- <a href="https://docs.m5stack.com/en/atom/Atomic%20Echo%20Base" target="_blank" title="AtomS3R + Echo Base">M5Stack AtomS3R + Echo Base</a>
- <a href="https://gf.bilibili.com/item/detail/1108782064" target="_blank" title="マジックボタン2.4">マジックボタン2.4</a>
- <a href="https://www.waveshare.net/shop/ESP32-S3-Touch-AMOLED-1.8.htm" target="_blank" title="微雪電子 ESP32-S3-Touch-AMOLED-1.8">微雪電子 ESP32-S3-Touch-AMOLED-1.8</a>
- <a href="https://github.com/Xinyuan-LilyGO/T-Circle-S3" target="_blank" title="LILYGO T-Circle-S3">LILYGO T-Circle-S3</a>
- <a href="https://oshwhub.com/tenclass01/xmini_c3" target="_blank" title="エビ兄さん Mini C3">エビ兄さん Mini C3</a>
- <a href="https://oshwhub.com/movecall/cuican-ai-pendant-lights-up-y" target="_blank" title="Movecall CuiCan ESP32S3">CuiCan AIペンダント</a>
- <a href="https://github.com/WMnologo/xingzhi-ai" target="_blank" title="無名科技Nologo-星智-1.54">無名科技Nologo-星智-1.54TFT</a>
- <a href="https://www.seeedstudio.com/SenseCAP-Watcher-W1-A-p-5979.html" target="_blank" title="SenseCAP Watcher">SenseCAP Watcher</a>
- <a href="https://www.bilibili.com/video/BV1BHJtz6E2S/" target="_blank" title="ESP-HI 超低コストロボット犬">ESP-HI 超低コストロボット犬</a>
<div style="display: flex; justify-content: space-between;">
<a href="docs/v1/lichuang-s3.jpg" target="_blank" title="立創・実戦派 ESP32-S3 開発ボード">
<img src="docs/v1/lichuang-s3.jpg" width="240" />
</a>
<a href="docs/v1/espbox3.jpg" target="_blank" title="楽鑫 ESP32-S3-BOX3">
<img src="docs/v1/espbox3.jpg" width="240" />
</a>
<a href="docs/v1/m5cores3.jpg" target="_blank" title="M5Stack CoreS3">
<img src="docs/v1/m5cores3.jpg" width="240" />
</a>
<a href="docs/v1/atoms3r.jpg" target="_blank" title="AtomS3R + Echo Base">
<img src="docs/v1/atoms3r.jpg" width="240" />
</a>
<a href="docs/v1/magiclick.jpg" target="_blank" title="マジックボタン2.4">
<img src="docs/v1/magiclick.jpg" width="240" />
</a>
<a href="docs/v1/waveshare.jpg" target="_blank" title="微雪電子 ESP32-S3-Touch-AMOLED-1.8">
<img src="docs/v1/waveshare.jpg" width="240" />
</a>
<a href="docs/v1/lilygo-t-circle-s3.jpg" target="_blank" title="LILYGO T-Circle-S3">
<img src="docs/v1/lilygo-t-circle-s3.jpg" width="240" />
</a>
<a href="docs/v1/xmini-c3.jpg" target="_blank" title="エビ兄さん Mini C3">
<img src="docs/v1/xmini-c3.jpg" width="240" />
</a>
<a href="docs/v1/movecall-cuican-esp32s3.jpg" target="_blank" title="CuiCan">
<img src="docs/v1/movecall-cuican-esp32s3.jpg" width="240" />
</a>
<a href="docs/v1/wmnologo_xingzhi_1.54.jpg" target="_blank" title="無名科技Nologo-星智-1.54">
<img src="docs/v1/wmnologo_xingzhi_1.54.jpg" width="240" />
</a>
<a href="docs/v1/sensecap_watcher.jpg" target="_blank" title="SenseCAP Watcher">
<img src="docs/v1/sensecap_watcher.jpg" width="240" />
</a>
<a href="docs/v1/esp-hi.jpg" target="_blank" title="ESP-HI 超低コストロボット犬">
<img src="docs/v1/esp-hi.jpg" width="240" />
</a>
</div>
## ソフトウェア
### ファームウェア書き込み
初心者の方は、まず開発環境を構築せずに書き込み可能なファームウェアを使用することをおすすめします。
ファームウェアはデフォルトで公式 [xiaozhi.me](https://xiaozhi.me) サーバーに接続します。個人ユーザーはアカウント登録でQwenリアルタイムモデルを無料で利用できます。
👉 [初心者向けファームウェア書き込みガイド](https://ccnphfhqs21z.feishu.cn/wiki/Zpz4wXBtdimBrLk25WdcXzxcnNS)
### 開発環境
- Cursor または VSCode
- ESP-IDFプラグインをインストールし、SDKバージョン5.4以上を選択
- LinuxはWindowsよりも優れており、コンパイルが速く、ドライバの問題も少ない
- 本プロジェクトはGoogle C++コードスタイルを採用、コード提出時は準拠を確認してください
### 開発者ドキュメント
- [カスタム開発ボードガイド](docs/custom-board.md) - シャオジーAI用のカスタム開発ボード作成方法
- [MCPプロトコルIoT制御使用法](docs/mcp-usage.md) - MCPプロトコルでIoTデバイスを制御する方法
- [MCPプロトコルインタラクションフロー](docs/mcp-protocol.md) - デバイス側MCPプロトコルの実装方法
- [MQTT + UDP ハイブリッド通信プロトコルドキュメント](docs/mqtt-udp.md)
- [詳細なWebSocket通信プロトコルドキュメント](docs/websocket.md)
## 大規模モデル設定
すでにシャオジーAIチャットボットデバイスをお持ちで、公式サーバーに接続済みの場合は、[xiaozhi.me](https://xiaozhi.me) コンソールで設定できます。
👉 [バックエンド操作ビデオチュートリアル(旧インターフェース)](https://www.bilibili.com/video/BV1jUCUY2EKM/)
## 関連オープンソースプロジェクト
個人PCでサーバーをデプロイする場合は、以下のオープンソースプロジェクトを参照してください:
- [xinnan-tech/xiaozhi-esp32-server](https://github.com/xinnan-tech/xiaozhi-esp32-server) Pythonサーバー
- [joey-zhou/xiaozhi-esp32-server-java](https://github.com/joey-zhou/xiaozhi-esp32-server-java) Javaサーバー
- [AnimeAIChat/xiaozhi-server-go](https://github.com/AnimeAIChat/xiaozhi-server-go) Golangサーバー
- [hackers365/xiaozhi-esp32-server-golang](https://github.com/hackers365/xiaozhi-esp32-server-golang) Golangサーバー
シャオジー通信プロトコルを利用した他のクライアントプロジェクト:
- [huangjunsen0406/py-xiaozhi](https://github.com/huangjunsen0406/py-xiaozhi) Pythonクライアント
- [TOM88812/xiaozhi-android-client](https://github.com/TOM88812/xiaozhi-android-client) Androidクライアント
- [100askTeam/xiaozhi-linux](http://github.com/100askTeam/xiaozhi-linux) 百問科技提供のLinuxクライアント
- [78/xiaozhi-sf32](https://github.com/78/xiaozhi-sf32) 思澈科技のBluetoothチップファームウェア
- [QuecPython/solution-xiaozhiAI](https://github.com/QuecPython/solution-xiaozhiAI) 移遠提供のQuecPythonファームウェア
## プロジェクトについて
これはエビ兄さんがオープンソースで公開しているESP32プロジェクトで、MITライセンスのもと、誰でも無料で、商用利用も可能です。
このプロジェクトを通じて、AIハードウェア開発を理解し、急速に進化する大規模言語モデルを実際のハードウェアデバイスに応用できるようになることを目指しています。
ご意見やご提案があれば、いつでもIssueを提出するか、[Discord](https://discord.gg/C759fGMBcZ) または QQグループ:1011329060 にご参加ください。
## スター履歴
<a href="https://star-history.com/#78/xiaozhi-esp32&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=78/xiaozhi-esp32&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=78/xiaozhi-esp32&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=78/xiaozhi-esp32&type=Date" />
</picture>
</a>
================================================
FILE: README_zh.md
================================================
# An MCP-based Chatbot
(中文 | [English](README.md) | [日本語](README_ja.md))
## 介绍
👉 [人类:给 AI 装摄像头 vs AI:当场发现主人三天没洗头【bilibili】](https://www.bilibili.com/video/BV1bpjgzKEhd/)
👉 [手工打造你的 AI 女友,新手入门教程【bilibili】](https://www.bilibili.com/video/BV1XnmFYLEJN/)
小智 AI 聊天机器人作为一个语音交互入口,利用 Qwen / DeepSeek 等大模型的 AI 能力,通过 MCP 协议实现多端控制。
<img src="docs/mcp-based-graph.jpg" alt="通过MCP控制万物" width="320">
### 版本说明
当前 v2 版本与 v1 版本分区表不兼容,所以无法从 v1 版本通过 OTA 升级到 v2 版本。分区表说明参见 [partitions/v2/README.md](partitions/v2/README.md)。
使用 v1 版本的所有硬件,可以通过手动烧录固件来升级到 v2 版本。
v1 的稳定版本为 1.9.2,可以通过 `git checkout v1` 来切换到 v1 版本,该分支会持续维护到 2026 年 2 月。
### 已实现功能
- Wi-Fi / ML307 Cat.1 4G
- 离线语音唤醒 [ESP-SR](https://github.com/espressif/esp-sr)
- 支持两种通信协议([Websocket](docs/websocket.md) 或 MQTT+UDP)
- 采用 OPUS 音频编解码
- 基于流式 ASR + LLM + TTS 架构的语音交互
- 声纹识别,识别当前说话人的身份 [3D Speaker](https://github.com/modelscope/3D-Speaker)
- OLED / LCD 显示屏,支持表情显示
- 电量显示与电源管理
- 支持多语言(中文、英文、日文)
- 支持 ESP32-C3、ESP32-S3、ESP32-P4 芯片平台
- 通过设备端 MCP 实现设备控制(音量、灯光、电机、GPIO 等)
- 通过云端 MCP 扩展大模型能力(智能家居控制、PC桌面操作、知识搜索、邮件收发等)
- 自定义唤醒词、字体、表情与聊天背景,支持网页端在线修改 ([自定义Assets生成器](https://github.com/78/xiaozhi-assets-generator))
## 硬件
### 面包板手工制作实践
详见飞书文档教程:
👉 [《小智 AI 聊天机器人百科全书》](https://ccnphfhqs21z.feishu.cn/wiki/F5krwD16viZoF0kKkvDcrZNYnhb?from=from_copylink)
面包板效果图如下:

### 支持 70 多个开源硬件(仅展示部分)
- <a href="https://oshwhub.com/li-chuang-kai-fa-ban/li-chuang-shi-zhan-pai-esp32-s3-kai-fa-ban" target="_blank" title="立创·实战派 ESP32-S3 开发板">立创·实战派 ESP32-S3 开发板</a>
- <a href="https://github.com/espressif/esp-box" target="_blank" title="乐鑫 ESP32-S3-BOX3">乐鑫 ESP32-S3-BOX3</a>
- <a href="https://docs.m5stack.com/zh_CN/core/CoreS3" target="_blank" title="M5Stack CoreS3">M5Stack CoreS3</a>
- <a href="https://docs.m5stack.com/en/atom/Atomic%20Echo%20Base" target="_blank" title="AtomS3R + Echo Base">M5Stack AtomS3R + Echo Base</a>
- <a href="https://gf.bilibili.com/item/detail/1108782064" target="_blank" title="神奇按钮 2.4">神奇按钮 2.4</a>
- <a href="https://www.waveshare.net/shop/ESP32-S3-Touch-AMOLED-1.8.htm" target="_blank" title="微雪电子 ESP32-S3-Touch-AMOLED-1.8">微雪电子 ESP32-S3-Touch-AMOLED-1.8</a>
- <a href="https://github.com/Xinyuan-LilyGO/T-Circle-S3" target="_blank" title="LILYGO T-Circle-S3">LILYGO T-Circle-S3</a>
- <a href="https://oshwhub.com/tenclass01/xmini_c3" target="_blank" title="虾哥 Mini C3">虾哥 Mini C3</a>
- <a href="https://oshwhub.com/movecall/cuican-ai-pendant-lights-up-y" target="_blank" title="Movecall CuiCan ESP32S3">璀璨·AI 吊坠</a>
- <a href="https://github.com/WMnologo/xingzhi-ai" target="_blank" title="无名科技Nologo-星智-1.54">无名科技 Nologo-星智-1.54TFT</a>
- <a href="https://www.seeedstudio.com/SenseCAP-Watcher-W1-A-p-5979.html" target="_blank" title="SenseCAP Watcher">SenseCAP Watcher</a>
- <a href="https://www.bilibili.com/video/BV1BHJtz6E2S/" target="_blank" title="ESP-HI 超低成本机器狗">ESP-HI 超低成本机器狗</a>
<div style="display: flex; justify-content: space-between;">
<a href="docs/v1/lichuang-s3.jpg" target="_blank" title="立创·实战派 ESP32-S3 开发板">
<img src="docs/v1/lichuang-s3.jpg" width="240" />
</a>
<a href="docs/v1/espbox3.jpg" target="_blank" title="乐鑫 ESP32-S3-BOX3">
<img src="docs/v1/espbox3.jpg" width="240" />
</a>
<a href="docs/v1/m5cores3.jpg" target="_blank" title="M5Stack CoreS3">
<img src="docs/v1/m5cores3.jpg" width="240" />
</a>
<a href="docs/v1/atoms3r.jpg" target="_blank" title="AtomS3R + Echo Base">
<img src="docs/v1/atoms3r.jpg" width="240" />
</a>
<a href="docs/v1/magiclick.jpg" target="_blank" title="神奇按钮 2.4">
<img src="docs/v1/magiclick.jpg" width="240" />
</a>
<a href="docs/v1/waveshare.jpg" target="_blank" title="微雪电子 ESP32-S3-Touch-AMOLED-1.8">
<img src="docs/v1/waveshare.jpg" width="240" />
</a>
<a href="docs/v1/lilygo-t-circle-s3.jpg" target="_blank" title="LILYGO T-Circle-S3">
<img src="docs/v1/lilygo-t-circle-s3.jpg" width="240" />
</a>
<a href="docs/v1/xmini-c3.jpg" target="_blank" title="虾哥 Mini C3">
<img src="docs/v1/xmini-c3.jpg" width="240" />
</a>
<a href="docs/v1/movecall-cuican-esp32s3.jpg" target="_blank" title="CuiCan">
<img src="docs/v1/movecall-cuican-esp32s3.jpg" width="240" />
</a>
<a href="docs/v1/wmnologo_xingzhi_1.54.jpg" target="_blank" title="无名科技Nologo-星智-1.54">
<img src="docs/v1/wmnologo_xingzhi_1.54.jpg" width="240" />
</a>
<a href="docs/v1/sensecap_watcher.jpg" target="_blank" title="SenseCAP Watcher">
<img src="docs/v1/sensecap_watcher.jpg" width="240" />
</a>
<a href="docs/v1/esp-hi.jpg" target="_blank" title="ESP-HI 超低成本机器狗">
<img src="docs/v1/esp-hi.jpg" width="240" />
</a>
</div>
## 软件
### 固件烧录
新手第一次操作建议先不要搭建开发环境,直接使用免开发环境烧录的固件。
固件默认接入 [xiaozhi.me](https://xiaozhi.me) 官方服务器,个人用户注册账号可以免费使用 Qwen 实时模型。
👉 [新手烧录固件教程](https://ccnphfhqs21z.feishu.cn/wiki/Zpz4wXBtdimBrLk25WdcXzxcnNS)
### 开发环境
- Cursor 或 VSCode
- 安装 ESP-IDF 插件,选择 SDK 版本 5.4 或以上
- Linux 比 Windows 更好,编译速度快,也免去驱动问题的困扰
- 本项目使用 Google C++ 代码风格,提交代码时请确保符合规范
### 开发者文档
- [自定义开发板指南](docs/custom-board.md) - 学习如何为小智 AI 创建自定义开发板
- [MCP 协议物联网控制用法说明](docs/mcp-usage.md) - 了解如何通过 MCP 协议控制物联网设备
- [MCP 协议交互流程](docs/mcp-protocol.md) - 设备端 MCP 协议的实现方式
- [MQTT + UDP 混合通信协议文档](docs/mqtt-udp.md)
- [一份详细的 WebSocket 通信协议文档](docs/websocket.md)
## 大模型配置
如果你已经拥有一个小智 AI 聊天机器人设备,并且已接入官方服务器,可以登录 [xiaozhi.me](https://xiaozhi.me) 控制台进行配置。
👉 [后台操作视频教程(旧版界面)](https://www.bilibili.com/video/BV1jUCUY2EKM/)
## 相关开源项目
在个人电脑上部署服务器,可以参考以下第三方开源的项目:
- [xinnan-tech/xiaozhi-esp32-server](https://github.com/xinnan-tech/xiaozhi-esp32-server) Python 服务器
- [joey-zhou/xiaozhi-esp32-server-java](https://github.com/joey-zhou/xiaozhi-esp32-server-java) Java 服务器
- [AnimeAIChat/xiaozhi-server-go](https://github.com/AnimeAIChat/xiaozhi-server-go) Golang 服务器
- [hackers365/xiaozhi-esp32-server-golang](https://github.com/hackers365/xiaozhi-esp32-server-golang) Golang 服务器
使用小智通信协议的第三方客户端项目:
- [huangjunsen0406/py-xiaozhi](https://github.com/huangjunsen0406/py-xiaozhi) Python 客户端
- [TOM88812/xiaozhi-android-client](https://github.com/TOM88812/xiaozhi-android-client) Android 客户端
- [100askTeam/xiaozhi-linux](http://github.com/100askTeam/xiaozhi-linux) 百问科技提供的 Linux 客户端
- [78/xiaozhi-sf32](https://github.com/78/xiaozhi-sf32) 思澈科技的蓝牙芯片固件
- [QuecPython/solution-xiaozhiAI](https://github.com/QuecPython/solution-xiaozhiAI) 移远提供的 QuecPython 固件
## 关于项目
这是一个由虾哥开源的 ESP32 项目,以 MIT 许可证发布,允许任何人免费使用,修改或用于商业用途。
我们希望通过这个项目,能够帮助大家了解 AI 硬件开发,将当下飞速发展的大语言模型应用到实际的硬件设备中。
如果你有任何想法或建议,请随时提出 Issues 或加入 [Discord](https://discord.gg/C759fGMBcZ) 或 QQ 群:1011329060
## Star History
<a href="https://star-history.com/#78/xiaozhi-esp32&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=78/xiaozhi-esp32&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=78/xiaozhi-esp32&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=78/xiaozhi-esp32&type=Date" />
</picture>
</a>
================================================
FILE: docs/blufi.md
================================================
# BluFi 配网(集成 esp-wifi-connect)
本文档说明如何在小智固件中启用和使用 BluFi(BLE Wi‑Fi 配网),并结合项目内置的 `esp-wifi-connect` 组件完成 Wi‑Fi 连接与存储。官方
BluFi
协议说明请参考 [Espressif 文档](https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/ble/blufi.html)。
## 前置条件
- 需要支持 BLE 的芯片与固件配置。
- 在 `idf.py menuconfig` 中启用 `WiFi Configuration Method -> Esp Blufi`(`CONFIG_USE_ESP_BLUFI_WIFI_PROVISIONING=y`
)。如果想使用 BluFi,必须关闭同一菜单下的 Hotspot 选项,否则默认使用 Hotspot 配网模式。
- 保持默认的 NVS 与事件循环初始化(项目的 `app_main` 已处理)。
- CONFIG_BT_BLUEDROID_ENABLED、CONFIG_BT_NIMBLE_ENABLED这两个宏应二选一,不能同时启用。
## 工作流程
1) 手机端通过 BluFi(如官方 EspBlufi App 或自研客户端)连接设备,发送 Wi‑Fi SSID/密码,手机端可以通过blufi协议获取设备端扫描到的WiFi列表。
2) 设备侧在 `ESP_BLUFI_EVENT_REQ_CONNECT_TO_AP` 中将凭据写入 `SsidManager`(存储到 NVS,属于 `esp-wifi-connect` 组件)。
3) 随后启动 `WifiStation` 扫描并连接;状态通过 BluFi 返回。
4) 配网成功后设备会自动连接新 Wi‑Fi;失败则返回失败状态。
## 使用步骤
1. 配置:在 menuconfig 开启 `Esp Blufi`。编译并烧录固件。
2. 触发配网:设备首次启动且没有已保存的 Wi‑Fi 时会自动进入配网。
3. 手机端操作:打开 EspBlufi App(或其他 BluFi 客户端),搜索并连接设备,可以选择是否加密,按提示输入 Wi‑Fi SSID/密码并发送。
4. 观察结果:
- 成功:BluFi 报告连接成功,设备自动连接 Wi‑Fi。
- 失败:BluFi 返回失败状态,可重新发送或检查路由器。
## 注意事项
- BluFi 配网不支持与热点配网同时开启。如果热点配网已经启动,则默认使用热点配网。请在 menuconfig 中只保留一种配网方式。
- 若多次测试,建议清除或覆盖存储的 SSID(`wifi` 命名空间),避免旧配置干扰。
- 如果使用自定义 BluFi 客户端,需遵循官方协议帧格式,参考上文官方文档链接。
- 官方文档中已提供EspBlufi APP下载地址
- 由于IDF5.5.2的blufi接口发生变化,5.5.2版本编译后蓝牙名称为"Xiaozhi-Blufi",5.5.1版本中蓝牙名称为"BLUFI_DEVICE"
================================================
FILE: docs/code_style.md
================================================
# 代码风格指南
## 代码格式化工具
本项目使用 clang-format 工具来统一代码风格。我们已经在项目根目录下提供了 `.clang-format` 配置文件,该配置基于 Google C++ 风格指南,并做了一些自定义调整。
### 安装 clang-format
在使用之前,请确保你已经安装了 clang-format 工具:
- **Windows**:
```powershell
winget install LLVM
# 或者使用 Chocolatey
choco install llvm
```
- **Linux**:
```bash
sudo apt install clang-format # Ubuntu/Debian
sudo dnf install clang-tools-extra # Fedora
```
- **macOS**:
```bash
brew install clang-format
```
### 使用方法
1. **格式化单个文件**:
```bash
clang-format -i path/to/your/file.cpp
```
2. **格式化整个项目**:
```bash
# 在项目根目录下执行
find main -iname *.h -o -iname *.cc | xargs clang-format -i
```
3. **在提交代码前检查格式**:
```bash
# 检查文件格式是否符合规范(不修改文件)
clang-format --dry-run -Werror path/to/your/file.cpp
```
### IDE 集成
- **Visual Studio Code**:
1. 安装 C/C++ 扩展
2. 在设置中启用 `C_Cpp.formatting` 为 `clang-format`
3. 可以设置保存时自动格式化:`editor.formatOnSave: true`
- **CLion**:
1. 在设置中选择 `Editor > Code Style > C/C++`
2. 将 `Formatter` 设置为 `clang-format`
3. 选择使用项目中的 `.clang-format` 配置文件
### 主要格式规则
- 缩进使用 4 个空格
- 行宽限制为 100 字符
- 大括号采用 Attach 风格(与控制语句在同一行)
- 指针和引用符号靠左对齐
- 自动排序头文件包含
- 类访问修饰符缩进为 -4 空格
### 注意事项
1. 提交代码前请确保代码已经过格式化
2. 不要手动调整已格式化的代码对齐
3. 如果某段代码不希望被格式化,可以使用以下注释包围:
```cpp
// clang-format off
// 你的代码
// clang-format on
```
### 常见问题
1. **格式化失败**:
- 检查 clang-format 版本是否过低
- 确认文件编码为 UTF-8
- 验证 .clang-format 文件语法是否正确
2. **与期望格式不符**:
- 检查是否使用了项目根目录下的 .clang-format 配置
- 确认没有其他位置的 .clang-format 文件被优先使用
如有任何问题或建议,欢迎提出 issue 或 pull request。
================================================
FILE: docs/custom-board.md
================================================
# 自定义开发板指南
本指南介绍如何为小智AI语音聊天机器人项目定制一个新的开发板初始化程序。小智AI支持70多种ESP32系列开发板,每个开发板的初始化代码都放在对应的目录下。
## 重要提示
> **警告**: 对于自定义开发板,当IO配置与原有开发板不同时,切勿直接覆盖原有开发板的配置编译固件。必须创建新的开发板类型,或者通过config.json文件中的builds配置不同的name和sdkconfig宏定义来区分。使用 `python scripts/release.py [开发板目录名字]` 来编译打包固件。
>
> 如果直接覆盖原有配置,将来OTA升级时,您的自定义固件可能会被原有开发板的标准固件覆盖,导致您的设备无法正常工作。每个开发板有唯一的标识和对应的固件升级通道,保持开发板标识的唯一性非常重要。
## 目录结构
每个开发板的目录结构通常包含以下文件:
- `xxx_board.cc` - 主要的板级初始化代码,实现了板子相关的初始化和功能
- `config.h` - 板级配置文件,定义了硬件管脚映射和其他配置项
- `config.json` - 编译配置,指定目标芯片和特殊的编译选项
- `README.md` - 开发板相关的说明文档
## 定制开发板步骤
### 1. 创建新的开发板目录
首先在`boards/`目录下创建一个新的目录,命名方式应使用 `[品牌名]-[开发板类型]` 的形式,例如 `m5stack-tab5`:
```bash
mkdir main/boards/my-custom-board
```
### 2. 创建配置文件
#### config.h
在`config.h`中定义所有的硬件配置,包括:
- 音频采样率和I2S引脚配置
- 音频编解码芯片地址和I2C引脚配置
- 按钮和LED引脚配置
- 显示屏参数和引脚配置
参考示例(来自lichuang-c3-dev):
```c
#ifndef _BOARD_CONFIG_H_
#define _BOARD_CONFIG_H_
#include <driver/gpio.h>
// 音频配置
#define AUDIO_INPUT_SAMPLE_RATE 24000
#define AUDIO_OUTPUT_SAMPLE_RATE 24000
#define AUDIO_I2S_GPIO_MCLK GPIO_NUM_10
#define AUDIO_I2S_GPIO_WS GPIO_NUM_12
#define AUDIO_I2S_GPIO_BCLK GPIO_NUM_8
#define AUDIO_I2S_GPIO_DIN GPIO_NUM_7
#define AUDIO_I2S_GPIO_DOUT GPIO_NUM_11
#define AUDIO_CODEC_PA_PIN GPIO_NUM_13
#define AUDIO_CODEC_I2C_SDA_PIN GPIO_NUM_0
#define AUDIO_CODEC_I2C_SCL_PIN GPIO_NUM_1
#define AUDIO_CODEC_ES8311_ADDR ES8311_CODEC_DEFAULT_ADDR
// 按钮配置
#define BOOT_BUTTON_GPIO GPIO_NUM_9
// 显示屏配置
#define DISPLAY_SPI_SCK_PIN GPIO_NUM_3
#define DISPLAY_SPI_MOSI_PIN GPIO_NUM_5
#define DISPLAY_DC_PIN GPIO_NUM_6
#define DISPLAY_SPI_CS_PIN GPIO_NUM_4
#define DISPLAY_WIDTH 320
#define DISPLAY_HEIGHT 240
#define DISPLAY_MIRROR_X true
#define DISPLAY_MIRROR_Y false
#define DISPLAY_SWAP_XY true
#define DISPLAY_OFFSET_X 0
#define DISPLAY_OFFSET_Y 0
#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_2
#define DISPLAY_BACKLIGHT_OUTPUT_INVERT true
#endif // _BOARD_CONFIG_H_
```
#### config.json
在`config.json`中定义编译配置,这个文件用于 `scripts/release.py` 脚本自动化编译:
```json
{
"target": "esp32s3", // 目标芯片型号: esp32, esp32s3, esp32c3, esp32c6, esp32p4等
"builds": [
{
"name": "my-custom-board", // 开发板名称,用于生成固件包
"sdkconfig_append": [
// 特别 Flash 大小配置
"CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y",
// 特别分区表配置
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\""
]
}
]
}
```
**配置项说明:**
- `target`: 目标芯片型号,必须与硬件匹配
- `name`: 编译输出的固件包名称,建议与目录名一致
- `sdkconfig_append`: 额外的 sdkconfig 配置项数组,会追加到默认配置中
**常用的 sdkconfig_append 配置:**
```json
// Flash 大小
"CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y" // 4MB Flash
"CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y" // 8MB Flash
"CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y" // 16MB Flash
// 分区表
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/4m.csv\"" // 4MB 分区表
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"" // 8MB 分区表
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/16m.csv\"" // 16MB 分区表
// 语言配置
"CONFIG_LANGUAGE_EN_US=y" // 英语
"CONFIG_LANGUAGE_ZH_CN=y" // 简体中文
// 唤醒词配置
"CONFIG_USE_DEVICE_AEC=y" // 启用设备端 AEC
"CONFIG_WAKE_WORD_DISABLED=y" // 禁用唤醒词
```
### 3. 编写板级初始化代码
创建一个`my_custom_board.cc`文件,实现开发板的所有初始化逻辑。
一个基本的开发板类定义包含以下几个部分:
1. **类定义**:继承自`WifiBoard`或`Ml307Board`
2. **初始化函数**:包括I2C、显示屏、按钮、IoT等组件的初始化
3. **虚函数重写**:如`GetAudioCodec()`、`GetDisplay()`、`GetBacklight()`等
4. **注册开发板**:使用`DECLARE_BOARD`宏注册开发板
```cpp
#include "wifi_board.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "mcp_server.h"
#include <esp_log.h>
#include <driver/i2c_master.h>
#include <driver/spi_common.h>
#define TAG "MyCustomBoard"
class MyCustomBoard : public WifiBoard {
private:
i2c_master_bus_handle_t codec_i2c_bus_;
Button boot_button_;
LcdDisplay* display_;
// I2C初始化
void InitializeI2c() {
i2c_master_bus_config_t i2c_bus_cfg = {
.i2c_port = I2C_NUM_0,
.sda_io_num = AUDIO_CODEC_I2C_SDA_PIN,
.scl_io_num = AUDIO_CODEC_I2C_SCL_PIN,
.clk_source = I2C_CLK_SRC_DEFAULT,
.glitch_ignore_cnt = 7,
.intr_priority = 0,
.trans_queue_depth = 0,
.flags = {
.enable_internal_pullup = 1,
},
};
ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &codec_i2c_bus_));
}
// SPI初始化(用于显示屏)
void InitializeSpi() {
spi_bus_config_t buscfg = {};
buscfg.mosi_io_num = DISPLAY_SPI_MOSI_PIN;
buscfg.miso_io_num = GPIO_NUM_NC;
buscfg.sclk_io_num = DISPLAY_SPI_SCK_PIN;
buscfg.quadwp_io_num = GPIO_NUM_NC;
buscfg.quadhd_io_num = GPIO_NUM_NC;
buscfg.max_transfer_sz = DISPLAY_WIDTH * DISPLAY_HEIGHT * sizeof(uint16_t);
ESP_ERROR_CHECK(spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO));
}
// 按钮初始化
void InitializeButtons() {
boot_button_.OnClick([this]() {
auto& app = Application::GetInstance();
if (app.GetDeviceState() == kDeviceStateStarting) {
EnterWifiConfigMode();
return;
}
app.ToggleChatState();
});
}
// 显示屏初始化(以ST7789为例)
void InitializeDisplay() {
esp_lcd_panel_io_handle_t panel_io = nullptr;
esp_lcd_panel_handle_t panel = nullptr;
esp_lcd_panel_io_spi_config_t io_config = {};
io_config.cs_gpio_num = DISPLAY_SPI_CS_PIN;
io_config.dc_gpio_num = DISPLAY_DC_PIN;
io_config.spi_mode = 2;
io_config.pclk_hz = 80 * 1000 * 1000;
io_config.trans_queue_depth = 10;
io_config.lcd_cmd_bits = 8;
io_config.lcd_param_bits = 8;
ESP_ERROR_CHECK(esp_lcd_new_panel_io_spi(SPI2_HOST, &io_config, &panel_io));
esp_lcd_panel_dev_config_t panel_config = {};
panel_config.reset_gpio_num = GPIO_NUM_NC;
panel_config.rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB;
panel_config.bits_per_pixel = 16;
ESP_ERROR_CHECK(esp_lcd_new_panel_st7789(panel_io, &panel_config, &panel));
esp_lcd_panel_reset(panel);
esp_lcd_panel_init(panel);
esp_lcd_panel_invert_color(panel, true);
esp_lcd_panel_swap_xy(panel, DISPLAY_SWAP_XY);
esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y);
// 创建显示屏对象
display_ = new SpiLcdDisplay(panel_io, panel,
DISPLAY_WIDTH, DISPLAY_HEIGHT,
DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y,
DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY);
}
// MCP Tools 初始化
void InitializeTools() {
// 参考 MCP 文档
}
public:
// 构造函数
MyCustomBoard() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c();
InitializeSpi();
InitializeDisplay();
InitializeButtons();
InitializeTools();
GetBacklight()->SetBrightness(100);
}
// 获取音频编解码器
virtual AudioCodec* GetAudioCodec() override {
static Es8311AudioCodec audio_codec(
codec_i2c_bus_,
I2C_NUM_0,
AUDIO_INPUT_SAMPLE_RATE,
AUDIO_OUTPUT_SAMPLE_RATE,
AUDIO_I2S_GPIO_MCLK,
AUDIO_I2S_GPIO_BCLK,
AUDIO_I2S_GPIO_WS,
AUDIO_I2S_GPIO_DOUT,
AUDIO_I2S_GPIO_DIN,
AUDIO_CODEC_PA_PIN,
AUDIO_CODEC_ES8311_ADDR);
return &audio_codec;
}
// 获取显示屏
virtual Display* GetDisplay() override {
return display_;
}
// 获取背光控制
virtual Backlight* GetBacklight() override {
static PwmBacklight backlight(DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT);
return &backlight;
}
};
// 注册开发板
DECLARE_BOARD(MyCustomBoard);
```
### 4. 添加构建系统配置
#### 在 Kconfig.projbuild 中添加开发板选项
打开 `main/Kconfig.projbuild` 文件,在 `choice BOARD_TYPE` 部分添加新的开发板配置项:
```kconfig
choice BOARD_TYPE
prompt "Board Type"
default BOARD_TYPE_BREAD_COMPACT_WIFI
help
Board type. 开发板类型
# ... 其他开发板选项 ...
config BOARD_TYPE_MY_CUSTOM_BOARD
bool "My Custom Board (我的自定义开发板)"
depends on IDF_TARGET_ESP32S3 # 根据你的目标芯片修改
endchoice
```
**注意事项:**
- `BOARD_TYPE_MY_CUSTOM_BOARD` 是配置项名称,需要全大写,使用下划线分隔
- `depends on` 指定了目标芯片类型(如 `IDF_TARGET_ESP32S3`、`IDF_TARGET_ESP32C3` 等)
- 描述文字可以使用中英文
#### 在 CMakeLists.txt 中添加开发板配置
打开 `main/CMakeLists.txt` 文件,在开发板类型判断部分添加新的配置:
```cmake
# 在 elseif 链中添加你的开发板配置
elseif(CONFIG_BOARD_TYPE_MY_CUSTOM_BOARD)
set(BOARD_TYPE "my-custom-board") # 与目录名一致
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4) # 根据屏幕大小选择合适的字体
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64) # 可选,如果需要表情显示
endif()
```
**字体和表情配置说明:**
根据屏幕分辨率选择合适的字体大小:
- 小屏幕(128x64 OLED):`font_puhui_basic_14_1` / `font_awesome_14_1`
- 中小屏幕(240x240):`font_puhui_basic_16_4` / `font_awesome_16_4`
- 中等屏幕(240x320):`font_puhui_basic_20_4` / `font_awesome_20_4`
- 大屏幕(480x320+):`font_puhui_basic_30_4` / `font_awesome_30_4`
表情集合选项:
- `twemoji_32` - 32x32 像素表情(小屏幕)
- `twemoji_64` - 64x64 像素表情(大屏幕)
### 5. 配置和编译
#### 方法一:使用 idf.py 手动配置
1. **设置目标芯片**(首次配置或更换芯片时):
```bash
# 对于 ESP32-S3
idf.py set-target esp32s3
# 对于 ESP32-C3
idf.py set-target esp32c3
# 对于 ESP32
idf.py set-target esp32
```
2. **清理旧配置**:
```bash
idf.py fullclean
```
3. **进入配置菜单**:
```bash
idf.py menuconfig
```
在菜单中导航到:`Xiaozhi Assistant` -> `Board Type`,选择你的自定义开发板。
4. **编译和烧录**:
```bash
idf.py build
idf.py flash monitor
```
#### 方法二:使用 release.py 脚本(推荐)
如果你的开发板目录下有 `config.json` 文件,可以使用此脚本自动完成配置和编译:
```bash
python scripts/release.py my-custom-board
```
此脚本会自动:
- 读取 `config.json` 中的 `target` 配置并设置目标芯片
- 应用 `sdkconfig_append` 中的编译选项
- 完成编译并打包固件
### 6. 创建README.md
在README.md中说明开发板的特性、硬件要求、编译和烧录步骤:
## 常见开发板组件
### 1. 显示屏
项目支持多种显示屏驱动,包括:
- ST7789 (SPI)
- ILI9341 (SPI)
- SH8601 (QSPI)
- 等...
### 2. 音频编解码器
支持的编解码器包括:
- ES8311 (常用)
- ES7210 (麦克风阵列)
- AW88298 (功放)
- 等...
### 3. 电源管理
一些开发板使用电源管理芯片:
- AXP2101
- 其他可用的PMIC
### 4. MCP设备控制
可以添加各种MCP工具,让AI能够使用:
- Speaker (扬声器控制)
- Screen (屏幕亮度调节)
- Battery (电池电量读取)
- Light (灯光控制)
- 等...
## 开发板类继承关系
- `Board` - 基础板级类
- `WifiBoard` - Wi-Fi连接的开发板
- `Ml307Board` - 使用4G模块的开发板
- `DualNetworkBoard` - 支持Wi-Fi与4G网络切换的开发板
## 开发技巧
1. **参考相似的开发板**:如果您的新开发板与现有开发板有相似之处,可以参考现有实现
2. **分步调试**:先实现基础功能(如显示),再添加更复杂的功能(如音频)
3. **管脚映射**:确保在config.h中正确配置所有管脚映射
4. **检查硬件兼容性**:确认所有芯片和驱动程序的兼容性
## 可能遇到的问题
1. **显示屏不正常**:检查SPI配置、镜像设置和颜色反转设置
2. **音频无输出**:检查I2S配置、PA使能引脚和编解码器地址
3. **无法连接网络**:检查Wi-Fi凭据和网络配置
4. **无法与服务器通信**:检查MQTT或WebSocket配置
## 参考资料
- ESP-IDF 文档: https://docs.espressif.com/projects/esp-idf/
- LVGL 文档: https://docs.lvgl.io/
- ESP-SR 文档: https://github.com/espressif/esp-sr
================================================
FILE: docs/mcp-protocol.md
================================================
# MCP (Model Context Protocol) 交互流程
NOTICE: AI 辅助生成, 在实现后台服务时, 请参照代码确认细节!!
本项目中的 MCP 协议用于后台 API(MCP 客户端)与 ESP32 设备(MCP 服务器)之间的通信,以便后台能够发现和调用设备提供的功能(工具)。
## 协议格式
根据代码 (`main/protocols/protocol.cc`, `main/mcp_server.cc`),MCP 消息是封装在基础通信协议(如 WebSocket 或 MQTT)的消息体中的。其内部结构遵循 [JSON-RPC 2.0](https://www.jsonrpc.org/specification) 规范。
整体消息结构示例:
```json
{
"session_id": "...", // 会话 ID
"type": "mcp", // 消息类型,固定为 "mcp"
"payload": { // JSON-RPC 2.0 负载
"jsonrpc": "2.0",
"method": "...", // 方法名 (如 "initialize", "tools/list", "tools/call")
"params": { ... }, // 方法参数 (对于 request)
"id": ..., // 请求 ID (对于 request 和 response)
"result": { ... }, // 方法执行结果 (对于 success response)
"error": { ... } // 错误信息 (对于 error response)
}
}
```
其中,`payload` 部分是标准的 JSON-RPC 2.0 消息:
- `jsonrpc`: 固定的字符串 "2.0"。
- `method`: 要调用的方法名称 (对于 Request)。
- `params`: 方法的参数,一个结构化值,通常为对象 (对于 Request)。
- `id`: 请求的标识符,客户端发送请求时提供,服务器响应时原样返回。用于匹配请求和响应。
- `result`: 方法成功执行时的结果 (对于 Success Response)。
- `error`: 方法执行失败时的错误信息 (对于 Error Response)。
## 交互流程及发送时机
MCP 的交互主要围绕客户端(后台 API)发现和调用设备上的“工具”(Tool)进行。
1. **连接建立与能力通告**
- **时机:** 设备启动并成功连接到后台 API 后。
- **发送方:** 设备。
- **消息:** 设备发送基础协议的 "hello" 消息给后台 API,消息中包含设备支持的能力列表,例如通过支持 MCP 协议 (`"mcp": true`)。
- **示例 (非 MCP 负载,而是基础协议消息):**
```json
{
"type": "hello",
"version": ...,
"features": {
"mcp": true,
...
},
"transport": "websocket", // 或 "mqtt"
"audio_params": { ... },
"session_id": "..." // 设备收到服务器hello后可能设置
}
```
2. **初始化 MCP 会话**
- **时机:** 后台 API 收到设备 "hello" 消息,确认设备支持 MCP 后,通常作为 MCP 会话的第一个请求发送。
- **发送方:** 后台 API (客户端)。
- **方法:** `initialize`
- **消息 (MCP payload):**
```json
{
"jsonrpc": "2.0",
"method": "initialize",
"params": {
"capabilities": {
// 客户端能力,可选
// 摄像头视觉相关
"vision": {
"url": "...", //摄像头: 图片处理地址(必须是http地址, 不是websocket地址)
"token": "..." // url token
}
// ... 其他客户端能力
}
},
"id": 1 // 请求 ID
}
```
- **设备响应时机:** 设备收到 `initialize` 请求并处理后。
- **设备响应消息 (MCP payload):**
```json
{
"jsonrpc": "2.0",
"id": 1, // 匹配请求 ID
"result": {
"protocolVersion": "2024-11-05",
"capabilities": {
"tools": {} // 这里的 tools 似乎不列出详细信息,需要 tools/list
},
"serverInfo": {
"name": "...", // 设备名称 (BOARD_NAME)
"version": "..." // 设备固件版本
}
}
}
```
3. **发现设备工具列表**
- **时机:** 后台 API 需要获取设备当前支持的具体功能(工具)列表及其调用方式时。
- **发送方:** 后台 API (客户端)。
- **方法:** `tools/list`
- **消息 (MCP payload):**
```json
{
"jsonrpc": "2.0",
"method": "tools/list",
"params": {
"cursor": "" // 用于分页,首次请求为空字符串
},
"id": 2 // 请求 ID
}
```
- **设备响应时机:** 设备收到 `tools/list` 请求并生成工具列表后。
- **设备响应消息 (MCP payload):**
```json
{
"jsonrpc": "2.0",
"id": 2, // 匹配请求 ID
"result": {
"tools": [ // 工具对象列表
{
"name": "self.get_device_status",
"description": "...",
"inputSchema": { ... } // 参数 schema
},
{
"name": "self.audio_speaker.set_volume",
"description": "...",
"inputSchema": { ... } // 参数 schema
}
// ... 更多工具
],
"nextCursor": "..." // 如果列表很大需要分页,这里会包含下一个请求的 cursor 值
}
}
```
- **分页处理:** 如果 `nextCursor` 字段非空,客户端需要再次发送 `tools/list` 请求,并在 `params` 中带上这个 `cursor` 值以获取下一页工具。
4. **调用设备工具**
- **时机:** 后台 API 需要执行设备上的某个具体功能时。
- **发送方:** 后台 API (客户端)。
- **方法:** `tools/call`
- **消息 (MCP payload):**
```json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "self.audio_speaker.set_volume", // 要调用的工具名称
"arguments": {
// 工具参数,对象格式
"volume": 50 // 参数名及其值
}
},
"id": 3 // 请求 ID
}
```
- **设备响应时机:** 设备收到 `tools/call` 请求,执行相应的工具函数后。
- **设备成功响应消息 (MCP payload):**
```json
{
"jsonrpc": "2.0",
"id": 3, // 匹配请求 ID
"result": {
"content": [
// 工具执行结果内容
{ "type": "text", "text": "true" } // 示例:set_volume 返回 bool
],
"isError": false // 表示成功
}
}
```
- **设备失败响应消息 (MCP payload):**
```json
{
"jsonrpc": "2.0",
"id": 3, // 匹配请求 ID
"error": {
"code": -32601, // JSON-RPC 错误码,例如 Method not found (-32601)
"message": "Unknown tool: self.non_existent_tool" // 错误描述
}
}
```
5. **设备主动发送消息 (Notifications)**
- **时机:** 设备内部发生需要通知后台 API 的事件时(例如,状态变化,虽然代码示例中没有明确的工具发送此类消息,但 `Application::SendMcpMessage` 的存在暗示了设备可能主动发送 MCP 消息)。
- **发送方:** 设备 (服务器)。
- **方法:** 可能是以 `notifications/` 开头的方法名,或者其他自定义方法。
- **消息 (MCP payload):** 遵循 JSON-RPC Notification 格式,没有 `id` 字段。
```json
{
"jsonrpc": "2.0",
"method": "notifications/state_changed", // 示例方法名
"params": {
"newState": "idle",
"oldState": "connecting"
}
// 没有 id 字段
}
```
- **后台 API 处理:** 接收到 Notification 后,后台 API 进行相应的处理,但不回复。
## 交互图
下面是一个简化的交互序列图,展示了主要的 MCP 消息流程:
```mermaid
sequenceDiagram
participant Device as ESP32 Device
participant BackendAPI as 后台 API (Client)
Note over Device, BackendAPI: 建立 WebSocket / MQTT 连接
Device->>BackendAPI: Hello Message (包含 "mcp": true)
BackendAPI->>Device: MCP Initialize Request
Note over BackendAPI: method: initialize
Note over BackendAPI: params: { capabilities: ... }
Device->>BackendAPI: MCP Initialize Response
Note over Device: result: { protocolVersion: ..., serverInfo: ... }
BackendAPI->>Device: MCP Get Tools List Request
Note over BackendAPI: method: tools/list
Note over BackendAPI: params: { cursor: "" }
Device->>BackendAPI: MCP Get Tools List Response
Note over Device: result: { tools: [...], nextCursor: ... }
loop Optional Pagination
BackendAPI->>Device: MCP Get Tools List Request
Note over BackendAPI: method: tools/list
Note over BackendAPI: params: { cursor: "..." }
Device->>BackendAPI: MCP Get Tools List Response
Note over Device: result: { tools: [...], nextCursor: "" }
end
BackendAPI->>Device: MCP Call Tool Request
Note over BackendAPI: method: tools/call
Note over BackendAPI: params: { name: "...", arguments: { ... } }
alt Tool Call Successful
Device->>BackendAPI: MCP Tool Call Success Response
Note over Device: result: { content: [...], isError: false }
else Tool Call Failed
Device->>BackendAPI: MCP Tool Call Error Response
Note over Device: error: { code: ..., message: ... }
end
opt Device Notification
Device->>BackendAPI: MCP Notification
Note over Device: method: notifications/...
Note over Device: params: { ... }
end
```
这份文档概述了该项目中 MCP 协议的主要交互流程。具体的参数细节和工具功能需要参考 `main/mcp_server.cc` 中 `McpServer::AddCommonTools` 以及各个工具的实现。
================================================
FILE: docs/mcp-usage.md
================================================
# MCP 协议物联网控制用法说明
> 本文档介绍如何基于 MCP 协议实现 ESP32 设备的物联网控制。详细协议流程请参考 [`mcp-protocol.md`](./mcp-protocol.md)。
## 简介
MCP(Model Context Protocol)是新一代推荐用于物联网控制的协议,通过标准 JSON-RPC 2.0 格式在后台与设备间发现和调用"工具"(Tool),实现灵活的设备控制。
## 典型使用流程
1. 设备启动后通过基础协议(如 WebSocket/MQTT)与后台建立连接。
2. 后台通过 MCP 协议的 `initialize` 方法初始化会话。
3. 后台通过 `tools/list` 获取设备支持的所有工具(功能)及参数说明。
4. 后台通过 `tools/call` 调用具体工具,实现对设备的控制。
详细协议格式与交互请见 [`mcp-protocol.md`](./mcp-protocol.md)。
## 设备端工具注册方法说明
设备通过 `McpServer::AddTool` 方法注册可被后台调用的"工具"。其常用函数签名如下:
```cpp
void AddTool(
const std::string& name, // 工具名称,建议唯一且有层次感,如 self.dog.forward
const std::string& description, // 工具描述,简明说明功能,便于大模型理解
const PropertyList& properties, // 输入参数列表(可为空),支持类型:布尔、整数、字符串
std::function<ReturnValue(const PropertyList&)> callback // 工具被调用时的回调实现
);
```
- name:工具唯一标识,建议用"模块.功能"命名风格。
- description:自然语言描述,便于 AI/用户理解。
- properties:参数列表,支持类型有布尔、整数、字符串,可指定范围和默认值。
- callback:收到调用请求时的实际执行逻辑,返回值可为 bool/int/string。
## 典型注册示例(以 ESP-Hi 为例)
```cpp
void InitializeTools() {
auto& mcp_server = McpServer::GetInstance();
// 例1:无参数,控制机器人前进
mcp_server.AddTool("self.dog.forward", "机器人向前移动", PropertyList(), [this](const PropertyList&) -> ReturnValue {
servo_dog_ctrl_send(DOG_STATE_FORWARD, NULL);
return true;
});
// 例2:带参数,设置灯光 RGB 颜色
mcp_server.AddTool("self.light.set_rgb", "设置RGB颜色", PropertyList({
Property("r", kPropertyTypeInteger, 0, 255),
Property("g", kPropertyTypeInteger, 0, 255),
Property("b", kPropertyTypeInteger, 0, 255)
}), [this](const PropertyList& properties) -> ReturnValue {
int r = properties["r"].value<int>();
int g = properties["g"].value<int>();
int b = properties["b"].value<int>();
led_on_ = true;
SetLedColor(r, g, b);
return true;
});
}
```
## 常见工具调用 JSON-RPC 示例
### 1. 获取工具列表
```json
{
"jsonrpc": "2.0",
"method": "tools/list",
"params": { "cursor": "" },
"id": 1
}
```
### 2. 控制底盘前进
```json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "self.chassis.go_forward",
"arguments": {}
},
"id": 2
}
```
### 3. 切换灯光模式
```json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "self.chassis.switch_light_mode",
"arguments": { "light_mode": 3 }
},
"id": 3
}
```
### 4. 摄像头翻转
```json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "self.camera.set_camera_flipped",
"arguments": {}
},
"id": 4
}
```
## 备注
- 工具名称、参数及返回值请以设备端 `AddTool` 注册为准。
- 推荐所有新项目统一采用 MCP 协议进行物联网控制。
- 详细协议与进阶用法请查阅 [`mcp-protocol.md`](./mcp-protocol.md)。
================================================
FILE: docs/mqtt-udp.md
================================================
# MQTT + UDP 混合通信协议文档
基于代码实现整理的 MQTT + UDP 混合通信协议文档,概述设备端与服务器之间如何通过 MQTT 进行控制消息传输,通过 UDP 进行音频数据传输的交互方式。
---
## 1. 协议概览
本协议采用混合传输方式:
- **MQTT**:用于控制消息、状态同步、JSON 数据交换
- **UDP**:用于实时音频数据传输,支持加密
### 1.1 协议特点
- **双通道设计**:控制与数据分离,确保实时性
- **加密传输**:UDP 音频数据使用 AES-CTR 加密
- **序列号保护**:防止数据包重放和乱序
- **自动重连**:MQTT 连接断开时自动重连
---
## 2. 总体流程概览
```mermaid
sequenceDiagram
participant Device as ESP32 设备
participant MQTT as MQTT 服务器
participant UDP as UDP 服务器
Note over Device, UDP: 1. 建立 MQTT 连接
Device->>MQTT: MQTT Connect
MQTT->>Device: Connected
Note over Device, UDP: 2. 请求音频通道
Device->>MQTT: Hello Message (type: "hello", transport: "udp")
MQTT->>Device: Hello Response (UDP 连接信息 + 加密密钥)
Note over Device, UDP: 3. 建立 UDP 连接
Device->>UDP: UDP Connect
UDP->>Device: Connected
Note over Device, UDP: 4. 音频数据传输
loop 音频流传输
Device->>UDP: 加密音频数据 (Opus)
UDP->>Device: 加密音频数据 (Opus)
end
Note over Device, UDP: 5. 控制消息交换
par 控制消息
Device->>MQTT: Listen/TTS/MCP 消息
MQTT->>Device: STT/TTS/MCP 响应
end
Note over Device, UDP: 6. 关闭连接
Device->>MQTT: Goodbye Message
Device->>UDP: Disconnect
```
---
## 3. MQTT 控制通道
### 3.1 连接建立
设备通过 MQTT 连接到服务器,连接参数包括:
- **Endpoint**:MQTT 服务器地址和端口
- **Client ID**:设备唯一标识符
- **Username/Password**:认证凭据
- **Keep Alive**:心跳间隔(默认240秒)
### 3.2 Hello 消息交换
#### 3.2.1 设备端发送 Hello
```json
{
"type": "hello",
"version": 3,
"transport": "udp",
"features": {
"mcp": true
},
"audio_params": {
"format": "opus",
"sample_rate": 16000,
"channels": 1,
"frame_duration": 60
}
}
```
#### 3.2.2 服务器响应 Hello
```json
{
"type": "hello",
"transport": "udp",
"session_id": "xxx",
"audio_params": {
"format": "opus",
"sample_rate": 24000,
"channels": 1,
"frame_duration": 60
},
"udp": {
"server": "192.168.1.100",
"port": 8888,
"key": "0123456789ABCDEF0123456789ABCDEF",
"nonce": "0123456789ABCDEF0123456789ABCDEF"
}
}
```
**字段说明:**
- `udp.server`:UDP 服务器地址
- `udp.port`:UDP 服务器端口
- `udp.key`:AES 加密密钥(十六进制字符串)
- `udp.nonce`:AES 加密随机数(十六进制字符串)
### 3.3 JSON 消息类型
#### 3.3.1 设备端→服务器
1. **Listen 消息**
```json
{
"session_id": "xxx",
"type": "listen",
"state": "start",
"mode": "manual"
}
```
2. **Abort 消息**
```json
{
"session_id": "xxx",
"type": "abort",
"reason": "wake_word_detected"
}
```
3. **MCP 消息**
```json
{
"session_id": "xxx",
"type": "mcp",
"payload": {
"jsonrpc": "2.0",
"id": 1,
"result": {...}
}
}
```
4. **Goodbye 消息**
```json
{
"session_id": "xxx",
"type": "goodbye"
}
```
#### 3.3.2 服务器→设备端
支持的消息类型与 WebSocket 协议一致,包括:
- **STT**:语音识别结果
- **TTS**:语音合成控制
- **LLM**:情感表达控制
- **MCP**:物联网控制
- **System**:系统控制
- **Custom**:自定义消息(可选)
---
## 4. UDP 音频通道
### 4.1 连接建立
设备收到 MQTT Hello 响应后,使用其中的 UDP 连接信息建立音频通道:
1. 解析 UDP 服务器地址和端口
2. 解析加密密钥和随机数
3. 初始化 AES-CTR 加密上下文
4. 建立 UDP 连接
### 4.2 音频数据格式
#### 4.2.1 加密音频包结构
```
|type 1byte|flags 1byte|payload_len 2bytes|ssrc 4bytes|timestamp 4bytes|sequence 4bytes|
|payload payload_len bytes|
```
**字段说明:**
- `type`:数据包类型,固定为 0x01
- `flags`:标志位,当前未使用
- `payload_len`:负载长度(网络字节序)
- `ssrc`:同步源标识符
- `timestamp`:时间戳(网络字节序)
- `sequence`:序列号(网络字节序)
- `payload`:加密的 Opus 音频数据
#### 4.2.2 加密算法
使用 **AES-CTR** 模式加密:
- **密钥**:128位,由服务器提供
- **随机数**:128位,由服务器提供
- **计数器**:包含时间戳和序列号信息
### 4.3 序列号管理
- **发送端**:`local_sequence_` 单调递增
- **接收端**:`remote_sequence_` 验证连续性
- **防重放**:拒绝序列号小于期望值的数据包
- **容错处理**:允许轻微的序列号跳跃,记录警告
### 4.4 错误处理
1. **解密失败**:记录错误,丢弃数据包
2. **序列号异常**:记录警告,但仍处理数据包
3. **数据包格式错误**:记录错误,丢弃数据包
---
## 5. 状态管理
### 5.1 连接状态
```mermaid
stateDiagram
direction TB
[*] --> Disconnected
Disconnected --> MqttConnecting: StartMqttClient()
MqttConnecting --> MqttConnected: MQTT Connected
MqttConnecting --> Disconnected: Connect Failed
MqttConnected --> RequestingChannel: OpenAudioChannel()
RequestingChannel --> ChannelOpened: Hello Exchange Success
RequestingChannel --> MqttConnected: Hello Timeout/Failed
ChannelOpened --> UdpConnected: UDP Connect Success
UdpConnected --> AudioStreaming: Start Audio Transfer
AudioStreaming --> UdpConnected: Stop Audio Transfer
UdpConnected --> ChannelOpened: UDP Disconnect
ChannelOpened --> MqttConnected: CloseAudioChannel()
MqttConnected --> Disconnected: MQTT Disconnect
```
### 5.2 状态检查
设备通过以下条件判断音频通道是否可用:
```cpp
bool IsAudioChannelOpened() const {
return udp_ != nullptr && !error_occurred_ && !IsTimeout();
}
```
---
## 6. 配置参数
### 6.1 MQTT 配置
从设置中读取的配置项:
- `endpoint`:MQTT 服务器地址
- `client_id`:客户端标识符
- `username`:用户名
- `password`:密码
- `keepalive`:心跳间隔(默认240秒)
- `publish_topic`:发布主题
### 6.2 音频参数
- **格式**:Opus
- **采样率**:16000 Hz(设备端)/ 24000 Hz(服务器端)
- **声道数**:1(单声道)
- **帧时长**:60ms
---
## 7. 错误处理与重连
### 7.1 MQTT 重连机制
- 连接失败时自动重试
- 支持错误上报控制
- 断线时触发清理流程
### 7.2 UDP 连接管理
- 连接失败时不自动重试
- 依赖 MQTT 通道重新协商
- 支持连接状态查询
### 7.3 超时处理
基类 `Protocol` 提供超时检测:
- 默认超时时间:120 秒
- 基于最后接收时间计算
- 超时时自动标记为不可用
---
## 8. 安全考虑
### 8.1 传输加密
- **MQTT**:支持 TLS/SSL 加密(端口8883)
- **UDP**:使用 AES-CTR 加密音频数据
### 8.2 认证机制
- **MQTT**:用户名/密码认证
- **UDP**:通过 MQTT 通道分发密钥
### 8.3 防重放攻击
- 序列号单调递增
- 拒绝过期数据包
- 时间戳验证
---
## 9. 性能优化
### 9.1 并发控制
使用互斥锁保护 UDP 连接:
```cpp
std::lock_guard<std::mutex> lock(channel_mutex_);
```
### 9.2 内存管理
- 动态创建/销毁网络对象
- 智能指针管理音频数据包
- 及时释放加密上下文
### 9.3 网络优化
- UDP 连接复用
- 数据包大小优化
- 序列号连续性检查
---
## 10. 与 WebSocket 协议的比较
| 特性 | MQTT + UDP | WebSocket |
|------|------------|-----------|
| 控制通道 | MQTT | WebSocket |
| 音频通道 | UDP (加密) | WebSocket (二进制) |
| 实时性 | 高 (UDP) | 中等 |
| 可靠性 | 中等 | 高 |
| 复杂度 | 高 | 低 |
| 加密 | AES-CTR | TLS |
| 防火墙友好度 | 低 | 高 |
---
## 11. 部署建议
### 11.1 网络环境
- 确保 UDP 端口可达
- 配置防火墙规则
- 考虑 NAT 穿透
### 11.2 服务器配置
- MQTT Broker 配置
- UDP 服务器部署
- 密钥管理系统
### 11.3 监控指标
- 连接成功率
- 音频传输延迟
- 数据包丢失率
- 解密失败率
---
## 12. 总结
MQTT + UDP 混合协议通过以下设计实现高效的音视频通信:
- **分离式架构**:控制与数据通道分离,各司其职
- **加密保护**:AES-CTR 确保音频数据安全传输
- **序列化管理**:防止重放攻击和数据乱序
- **自动恢复**:支持连接断开后的自动重连
- **性能优化**:UDP 传输保证音频数据的实时性
该协议适用于对实时性要求较高的语音交互场景,但需要在网络复杂度和传输性能之间做出权衡。
================================================
FILE: docs/websocket.md
================================================
以下是一份基于代码实现整理的 WebSocket 通信协议文档,概述设备端与服务器之间如何通过 WebSocket 进行交互。
该文档仅基于所提供的代码推断,实际部署时可能需要结合服务器端实现进行进一步确认或补充。
---
## 1. 总体流程概览
1. **设备端初始化**
- 设备上电、初始化 `Application`:
- 初始化音频编解码器、显示屏、LED 等
- 连接网络
- 创建并初始化实现 `Protocol` 接口的 WebSocket 协议实例(`WebsocketProtocol`)
- 进入主循环等待事件(音频输入、音频输出、调度任务等)。
2. **建立 WebSocket 连接**
- 当设备需要开始语音会话时(例如用户唤醒、手动按键触发等),调用 `OpenAudioChannel()`:
- 根据配置获取 WebSocket URL
- 设置若干请求头(`Authorization`, `Protocol-Version`, `Device-Id`, `Client-Id`)
- 调用 `Connect()` 与服务器建立 WebSocket 连接
3. **设备端发送 "hello" 消息**
- 连接成功后,设备会发送一条 JSON 消息,示例结构如下:
```json
{
"type": "hello",
"version": 1,
"features": {
"mcp": true
},
"transport": "websocket",
"audio_params": {
"format": "opus",
"sample_rate": 16000,
"channels": 1,
"frame_duration": 60
}
}
```
- 其中 `features` 字段为可选,内容根据设备编译配置自动生成。例如:`"mcp": true` 表示支持 MCP 协议。
- `frame_duration` 的值对应 `OPUS_FRAME_DURATION_MS`(例如 60ms)。
4. **服务器回复 "hello"**
- 设备等待服务器返回一条包含 `"type": "hello"` 的 JSON 消息,并检查 `"transport": "websocket"` 是否匹配。
- 服务器可选下发 `session_id` 字段,设备端收到后会自动记录。
- 示例:
```json
{
"type": "hello",
"transport": "websocket",
"session_id": "xxx",
"audio_params": {
"format": "opus",
"sample_rate": 24000,
"channels": 1,
"frame_duration": 60
}
}
```
- 如果匹配,则认为服务器已就绪,标记音频通道打开成功。
- 如果在超时时间(默认 10 秒)内未收到正确回复,认为连接失败并触发网络错误回调。
5. **后续消息交互**
- 设备端和服务器端之间可发送两种主要类型的数据:
1. **二进制音频数据**(Opus 编码)
2. **文本 JSON 消息**(用于传输聊天状态、TTS/STT 事件、MCP 协议消息等)
- 在代码里,接收回调主要分为:
- `OnData(...)`:
- 当 `binary` 为 `true` 时,认为是音频帧;设备会将其当作 Opus 数据进行解码。
- 当 `binary` 为 `false` 时,认为是 JSON 文本,需要在设备端用 cJSON 进行解析并做相应业务逻辑处理(如聊天、TTS、MCP 协议消息等)。
- 当服务器或网络出现断连,回调 `OnDisconnected()` 被触发:
- 设备会调用 `on_audio_channel_closed_()`,并最终回到空闲状态。
6. **关闭 WebSocket 连接**
- 设备在需要结束语音会话时,会调用 `CloseAudioChannel()` 主动断开连接,并回到空闲状态。
- 或者如果服务器端主动断开,也会引发同样的回调流程。
---
## 2. 通用请求头
在建立 WebSocket 连接时,代码示例中设置了以下请求头:
- `Authorization`: 用于存放访问令牌,形如 `"Bearer <token>"`
- `Protocol-Version`: 协议版本号,与 hello 消息体内的 `version` 字段保持一致
- `Device-Id`: 设备物理网卡 MAC 地址
- `Client-Id`: 软件生成的 UUID(擦除 NVS 或重新烧录完整固件会重置)
这些头会随着 WebSocket 握手一起发送到服务器,服务器可根据需求进行校验、认证等。
---
## 3. 二进制协议版本
设备支持多种二进制协议版本,通过配置中的 `version` 字段指定:
### 3.1 版本1(默认)
直接发送 Opus 音频数据,无额外元数据。Websocket 协议会区分 text 与 binary。
### 3.2 版本2
使用 `BinaryProtocol2` 结构:
```c
struct BinaryProtocol2 {
uint16_t version; // 协议版本
uint16_t type; // 消息类型 (0: OPUS, 1: JSON)
uint32_t reserved; // 保留字段
uint32_t timestamp; // 时间戳(毫秒,用于服务器端AEC)
uint32_t payload_size; // 负载大小(字节)
uint8_t payload[]; // 负载数据
} __attribute__((packed));
```
### 3.3 版本3
使用 `BinaryProtocol3` 结构:
```c
struct BinaryProtocol3 {
uint8_t type; // 消息类型
uint8_t reserved; // 保留字段
uint16_t payload_size; // 负载大小
uint8_t payload[]; // 负载数据
} __attribute__((packed));
```
---
## 4. JSON 消息结构
WebSocket 文本帧以 JSON 方式传输,以下为常见的 `"type"` 字段及其对应业务逻辑。若消息里包含未列出的字段,可能为可选或特定实现细节。
### 4.1 设备端→服务器
1. **Hello**
- 连接成功后,由设备端发送,告知服务器基本参数。
- 例:
```json
{
"type": "hello",
"version": 1,
"features": {
"mcp": true
},
"transport": "websocket",
"audio_params": {
"format": "opus",
"sample_rate": 16000,
"channels": 1,
"frame_duration": 60
}
}
```
2. **Listen**
- 表示设备端开始或停止录音监听。
- 常见字段:
- `"session_id"`:会话标识
- `"type": "listen"`
- `"state"`:`"start"`, `"stop"`, `"detect"`(唤醒检测已触发)
- `"mode"`:`"auto"`, `"manual"` 或 `"realtime"`,表示识别模式。
- 例:开始监听
```json
{
"session_id": "xxx",
"type": "listen",
"state": "start",
"mode": "manual"
}
```
3. **Abort**
- 终止当前说话(TTS 播放)或语音通道。
- 例:
```json
{
"session_id": "xxx",
"type": "abort",
"reason": "wake_word_detected"
}
```
- `reason` 值可为 `"wake_word_detected"` 或其他。
4. **Wake Word Detected**
- 用于设备端向服务器告知检测到唤醒词。
- 在发送该消息之前,可提前发送唤醒词的 Opus 音频数据,用于服务器进行声纹检测。
- 例:
```json
{
"session_id": "xxx",
"type": "listen",
"state": "detect",
"text": "你好小明"
}
```
5. **MCP**
- 推荐用于物联网控制的新一代协议。所有设备能力发现、工具调用等均通过 type: "mcp" 的消息进行,payload 内部为标准 JSON-RPC 2.0(详见 [MCP 协议文档](./mcp-protocol.md))。
- **设备端到服务器发送 result 的例子:**
```json
{
"session_id": "xxx",
"type": "mcp",
"payload": {
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{ "type": "text", "text": "true" }
],
"isError": false
}
}
}
```
---
### 4.2 服务器→设备端
1. **Hello**
- 服务器端返回的握手确认消息。
- 必须包含 `"type": "hello"` 和 `"transport": "websocket"`。
- 可能会带有 `audio_params`,表示服务器期望的音频参数,或与设备端对齐的配置。
- 服务器可选下发 `session_id` 字段,设备端收到后会自动记录。
- 成功接收后设备端会设置事件标志,表示 WebSocket 通道就绪。
2. **STT**
- `{"session_id": "xxx", "type": "stt", "text": "..."}`
- 表示服务器端识别到了用户语音。(例如语音转文本结果)
- 设备可能将此文本显示到屏幕上,后续再进入回答等流程。
3. **LLM**
- `{"session_id": "xxx", "type": "llm", "emotion": "happy", "text": "😀"}`
- 服务器指示设备调整表情动画 / UI 表达。
4. **TTS**
- `{"session_id": "xxx", "type": "tts", "state": "start"}`:服务器准备下发 TTS 音频,设备端进入 "speaking" 播放状态。
- `{"session_id": "xxx", "type": "tts", "state": "stop"}`:表示本次 TTS 结束。
- `{"session_id": "xxx", "type": "tts", "state": "sentence_start", "text": "..."}`
- 让设备在界面上显示当前要播放或朗读的文本片段(例如用于显示给用户)。
5. **MCP**
- 服务器通过 type: "mcp" 的消息下发物联网相关的控制指令或返回调用结果,payload 结构同上。
- **服务器到设备端发送 tools/call 的例子:**
```json
{
"session_id": "xxx",
"type": "mcp",
"payload": {
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "self.light.set_rgb",
"arguments": { "r": 255, "g": 0, "b": 0 }
},
"id": 1
}
}
```
6. **System**
- 系统控制命令,常用于远程升级更新。
- 例:
```json
{
"session_id": "xxx",
"type": "system",
"command": "reboot"
}
```
- 支持的命令:
- `"reboot"`:重启设备
7. **Custom**(可选)
- 自定义消息,当 `CONFIG_RECEIVE_CUSTOM_MESSAGE` 启用时支持。
- 例:
```json
{
"session_id": "xxx",
"type": "custom",
"payload": {
"message": "自定义内容"
}
}
```
8. **音频数据:二进制帧**
- 当服务器发送音频二进制帧(Opus 编码)时,设备端解码并播放。
- 若设备端正在处于 "listening" (录音)状态,收到的音频帧会被忽略或清空以防冲突。
---
## 5. 音频编解码
1. **设备端发送录音数据**
- 音频输入经过可能的回声消除、降噪或音量增益后,通过 Opus 编码打包为二进制帧发送给服务器。
- 根据协议版本,可能直接发送 Opus 数据(版本1)或使用带元数据的二进制协议(版本2/3)。
2. **设备端播放收到的音频**
- 收到服务器的二进制帧时,同样认定是 Opus 数据。
- 设备端会进行解码,然后交由音频输出接口播放。
- 如果服务器的音频采样率与设备不一致,会在解码后再进行重采样。
---
## 6. 常见状态流转
以下为常见设备端关键状态流转,与 WebSocket 消息对应:
1. **Idle** → **Connecting**
- 用户触发或唤醒后,设备调用 `OpenAudioChannel()` → 建立 WebSocket 连接 → 发送 `"type":"hello"`。
2. **Connecting** → **Listening**
- 成功建立连接后,若继续执行 `SendStartListening(...)`,则进入录音状态。此时设备会持续编码麦克风数据并发送到服务器。
3. **Listening** → **Speaking**
- 收到服务器 TTS Start 消息 (`{"type":"tts","state":"start"}`) → 停止录音并播放接收到的音频。
4. **Speaking** → **Idle**
- 服务器 TTS Stop (`{"type":"tts","state":"stop"}`) → 音频播放结束。若未继续进入自动监听,则返回 Idle;如果配置了自动循环,则再度进入 Listening。
5. **Listening** / **Speaking** → **Idle**(遇到异常或主动中断)
- 调用 `SendAbortSpeaking(...)` 或 `CloseAudioChannel()` → 中断会话 → 关闭 WebSocket → 状态回到 Idle。
### 自动模式状态流转图
```mermaid
stateDiagram
direction TB
[*] --> kDeviceStateUnknown
kDeviceStateUnknown --> kDeviceStateStarting:初始化
kDeviceStateStarting --> kDeviceStateWifiConfiguring:配置WiFi
kDeviceStateStarting --> kDeviceStateActivating:激活设备
kDeviceStateActivating --> kDeviceStateUpgrading:检测到新版本
kDeviceStateActivating --> kDeviceStateIdle:激活完成
kDeviceStateIdle --> kDeviceStateConnecting:开始连接
kDeviceStateConnecting --> kDeviceStateIdle:连接失败
kDeviceStateConnecting --> kDeviceStateListening:连接成功
kDeviceStateListening --> kDeviceStateSpeaking:开始说话
kDeviceStateSpeaking --> kDeviceStateListening:结束说话
kDeviceStateListening --> kDeviceStateIdle:手动终止
kDeviceStateSpeaking --> kDeviceStateIdle:自动终止
```
### 手动模式状态流转图
```mermaid
stateDiagram
direction TB
[*] --> kDeviceStateUnknown
kDeviceStateUnknown --> kDeviceStateStarting:初始化
kDeviceStateStarting --> kDeviceStateWifiConfiguring:配置WiFi
kDeviceStateStarting --> kDeviceStateActivating:激活设备
kDeviceStateActivating --> kDeviceStateUpgrading:检测到新版本
kDeviceStateActivating --> kDeviceStateIdle:激活完成
kDeviceStateIdle --> kDeviceStateConnecting:开始连接
kDeviceStateConnecting --> kDeviceStateIdle:连接失败
kDeviceStateConnecting --> kDeviceStateListening:连接成功
kDeviceStateIdle --> kDeviceStateListening:开始监听
kDeviceStateListening --> kDeviceStateIdle:停止监听
kDeviceStateIdle --> kDeviceStateSpeaking:开始说话
kDeviceStateSpeaking --> kDeviceStateIdle:结束说话
```
---
## 7. 错误处理
1. **连接失败**
- 如果 `Connect(url)` 返回失败或在等待服务器 "hello" 消息时超时,触发 `on_network_error_()` 回调。设备会提示"无法连接到服务"或类似错误信息。
2. **服务器断开**
- 如果 WebSocket 异常断开,回调 `OnDisconnected()`:
- 设备回调 `on_audio_channel_closed_()`
- 切换到 Idle 或其他重试逻辑。
---
## 8. 其它注意事项
1. **鉴权**
- 设备通过设置 `Authorization: Bearer <token>` 提供鉴权,服务器端需验证是否有效。
- 如果令牌过期或无效,服务器可拒绝握手或在后续断开。
2. **会话控制**
- 代码中部分消息包含 `session_id`,用于区分独立的对话或操作。服务端可根据需要对不同会话做分离处理。
3. **音频负载**
- 代码里默认使用 Opus 格式,并设置 `sample_rate = 16000`,单声道。帧时长由 `OPUS_FRAME_DURATION_MS` 控制,一般为 60ms。可根据带宽或性能做适当调整。为了获得更好的音乐播放效果,服务器下行音频可能使用 24000 采样率。
4. **协议版本配置**
- 通过设置中的 `version` 字段配置二进制协议版本(1、2 或 3)
- 版本1:直接发送 Opus 数据
- 版本2:使用带时间戳的二进制协议,适用于服务器端 AEC
- 版本3:使用简化的二进制协议
5. **物联网控制推荐 MCP 协议**
- 设备与服务器之间的物联网能力发现、状态同步、控制指令等,建议全部通过 MCP 协议(type: "mcp")实现。原有的 type: "iot" 方案已废弃。
- MCP 协议可在 WebSocket、MQTT 等多种底层协议上传输,具备更好的扩展性和标准化能力。
- 详细用法请参考 [MCP 协议文档](./mcp-protocol.md) 及 [MCP 物联网控制用法](./mcp-usage.md)。
6. **错误或异常 JSON**
- 当 JSON 中缺少必要字段,例如 `{"type": ...}`,设备端会记录错误日志(`ESP_LOGE(TAG, "Missing message type, data: %s", data);`),不会执行任何业务。
---
## 9. 消息示例
下面给出一个典型的双向消息示例(流程简化示意):
1. **设备端 → 服务器**(握手)
```json
{
"type": "hello",
"version": 1,
"features": {
"mcp": true
},
"transport": "websocket",
"audio_params": {
"format": "opus",
"sample_rate": 16000,
"channels": 1,
"frame_duration": 60
}
}
```
2. **服务器 → 设备端**(握手应答)
```json
{
"type": "hello",
"transport": "websocket",
"session_id": "xxx",
"audio_params": {
"format": "opus",
"sample_rate": 16000
}
}
```
3. **设备端 → 服务器**(开始监听)
```json
{
"session_id": "xxx",
"type": "listen",
"state": "start",
"mode": "auto"
}
```
同时设备端开始发送二进制帧(Opus 数据)。
4. **服务器 → 设备端**(ASR 结果)
```json
{
"session_id": "xxx",
"type": "stt",
"text": "用户说的话"
}
```
5. **服务器 → 设备端**(TTS开始)
```json
{
"session_id": "xxx",
"type": "tts",
"state": "start"
}
```
接着服务器发送二进制音频帧给设备端播放。
6. **服务器 → 设备端**(TTS结束)
```json
{
"session_id": "xxx",
"type": "tts",
"state": "stop"
}
```
设备端停止播放音频,若无更多指令,则回到空闲状态。
---
## 10. 总结
本协议通过在 WebSocket 上层传输 JSON 文本与二进制音频帧,完成功能包括音频流上传、TTS 音频播放、语音识别与状态管理、MCP 指令下发等。其核心特征:
- **握手阶段**:发送 `"type":"hello"`,等待服务器返回。
- **音频通道**:采用 Opus 编码的二进制帧双向传输语音流,支持多种协议版本。
- **JSON 消息**:使用 `"type"` 为核心字段标识不同业务逻辑,包括 TTS、STT、MCP、WakeWord、System、Custom 等。
- **扩展性**:可根据实际需求在 JSON 消息中添加字段,或在 headers 里进行额外鉴权。
服务器与设备端需提前约定各类消息的字段含义、时序逻辑以及错误处理规则,方能保证通信顺畅。上述信息可作为基础文档,便于后续对接、开发或扩展。
================================================
FILE: main/CMakeLists.txt
================================================
# 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"
"audio/codecs/es8374_audio_codec.cc"
"audio/codecs/es8388_audio_codec.cc"
"audio/codecs/es8389_audio_codec.cc"
"audio/codecs/dummy_audio_codec.cc"
"audio/processors/audio_debugger.cc"
"led/single_led.cc"
"led/circular_strip.cc"
"led/gpio_led.cc"
"display/display.cc"
"display/lcd_display.cc"
"display/oled_display.cc"
"display/lvgl_display/lvgl_display.cc"
"display/emote_display.cc"
"display/lvgl_display/emoji_collection.cc"
"display/lvgl_display/lvgl_theme.cc"
"display/lvgl_display/lvgl_font.cc"
"display/lvgl_display/lvgl_image.cc"
"display/lvgl_display/gif/lvgl_gif.cc"
"display/lvgl_display/gif/gifdec.c"
"display/lvgl_display/jpg/image_to_jpeg.cpp"
"display/lvgl_display/jpg/jpeg_to_image.c"
"protocols/protocol.cc"
"protocols/mqtt_protocol.cc"
"protocols/websocket_protocol.cc"
"mcp_server.cc"
"system_info.cc"
"application.cc"
"ota.cc"
"settings.cc"
"device_state_machine.cc"
"assets.cc"
"main.cc"
)
set(INCLUDE_DIRS "." "display" "display/lvgl_display" "display/lvgl_display/jpg" "audio" "audio/demuxer" "protocols")
# Add board common files
list(APPEND SOURCES
"boards/common/board.cc"
"boards/common/wifi_board.cc"
"boards/common/ml307_board.cc"
"boards/common/nt26_board.cc"
"boards/common/dual_network_board.cc"
"boards/common/adc_battery_monitor.cc"
"boards/common/afsk_demod.cc"
"boards/common/axp2101.cc"
"boards/common/backlight.cc"
"boards/common/button.cc"
"boards/common/i2c_device.cc"
"boards/common/knob.cc"
"boards/common/power_save_timer.cc"
"boards/common/press_to_talk_mcp_tool.cc"
"boards/common/sleep_timer.cc"
"boards/common/sy6970.cc"
"boards/common/system_reset.cc"
)
list(APPEND INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/boards/common)
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)
foreach(COMPONENT ${build_components})
if(COMPONENT MATCHES "${PATTERN}")
set(${COMPONENT_VAR} ${COMPONENT} PARENT_SCOPE)
idf_component_get_property(COMPONENT_PATH ${COMPONENT} COMPONENT_DIR)
set(${PATH_VAR} "${COMPONENT_PATH}" PARENT_SCOPE)
break()
endif()
endforeach()
endfunction()
# Set default BUILTIN_TEXT_FONT and BUILTIN_ICON_FONT
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_BREAD_COMPACT_WIFI)
set(BOARD_TYPE "bread-compact-wifi")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_ML307)
set(BOARD_TYPE "bread-compact-ml307")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_NT26)
set(BOARD_TYPE "bread-compact-nt26")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_ESP32)
set(BOARD_TYPE "bread-compact-esp32")
elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_ESP32_LCD)
set(BOARD_TYPE "bread-compact-esp32-lcd")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_DF_K10)
set(BOARD_TYPE "df-k10")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_DF_S3_AI_CAM)
set(BOARD_TYPE "df-s3-ai-cam")
elseif(CONFIG_BOARD_TYPE_ESP_BOX_3)
set(BOARD_TYPE "esp-box-3")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
set(EMOTE_RESOLUTION "320_240")
elseif(CONFIG_BOARD_TYPE_ESP_BOX)
set(BOARD_TYPE "esp-box")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
set(EMOTE_RESOLUTION "320_240")
elseif(CONFIG_BOARD_TYPE_ESP_BOX_LITE)
set(BOARD_TYPE "esp-box-lite")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_KEVIN_BOX_2)
set(BOARD_TYPE "kevin-box-2")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_KEVIN_C3)
set(BOARD_TYPE "kevin-c3")
elseif(CONFIG_BOARD_TYPE_KEVIN_SP_V3_DEV)
set(BOARD_TYPE "kevin-sp-v3-dev")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_KEVIN_SP_V4_DEV)
set(BOARD_TYPE "kevin-sp-v4-dev")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_KEVIN_YUYING_313LCD)
set(BOARD_TYPE "kevin-yuying-313lcd")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_LICHUANG_DEV_S3)
set(BOARD_TYPE "lichuang-dev")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_LICHUANG_DEV_C3)
set(BOARD_TYPE "lichuang-c3-dev")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_EDA_TV_PRO)
set(MANUFACTURER "lceda-course-examples")
set(BOARD_TYPE "eda-tv-pro")
elseif(CONFIG_BOARD_TYPE_EDA_ROBOT_PRO)
set(MANUFACTURER "lceda-course-examples")
set(BOARD_TYPE "eda-robot-pro")
set(BUILTIN_TEXT_FONT font_puhui_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
elseif(CONFIG_BOARD_TYPE_EDA_SUPER_BEAR)
set(MANUFACTURER "lceda-course-examples")
set(BOARD_TYPE "eda-super-bear")
elseif(CONFIG_BOARD_TYPE_MAGICLICK_S3_2P4)
set(BOARD_TYPE "magiclick-2p4")
set(BUILTIN_TEXT_FONT font_noto_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_64)
elseif(CONFIG_BOARD_TYPE_MAGICLICK_S3_2P5)
set(BOARD_TYPE "magiclick-2p5")
set(BUILTIN_TEXT_FONT font_noto_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_64)
elseif(CONFIG_BOARD_TYPE_MAGICLICK_C3)
set(BOARD_TYPE "magiclick-c3")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_MAGICLICK_C3_V2)
set(BOARD_TYPE "magiclick-c3-v2")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_M5STACK_CORE_S3)
set(BOARD_TYPE "m5stack-core-s3")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_M5STACK_CORE_TAB5)
set(BOARD_TYPE "m5stack-tab5")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_M5STACK_ATOM_S3_ECHO_BASE)
set(BOARD_TYPE "atoms3-echo-base")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_M5STACK_ATOM_S3R_ECHO_BASE)
set(BOARD_TYPE "atoms3r-echo-base")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_M5STACK_ATOM_S3R_CAM_M12_ECHO_BASE)
set(BOARD_TYPE "atoms3r-cam-m12-echo-base")
elseif(CONFIG_BOARD_TYPE_M5STACK_ATOM_ECHOS3R)
set(BOARD_TYPE "atom-echos3r")
elseif(CONFIG_BOARD_TYPE_M5STACK_CARDPUTER_ADV)
set(BOARD_TYPE "m5stack-cardputer-adv")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_M5STACK_ATOM_MATRIX_ECHO_BASE)
set(BOARD_TYPE "atommatrix-echo-base")
elseif(CONFIG_BOARD_TYPE_XMINI_C3_V3)
set(BOARD_TYPE "xmini-c3-v3")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_XMINI_C3_4G)
set(BOARD_TYPE "xmini-c3-4g")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_XMINI_C3)
set(BOARD_TYPE "xmini-c3")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_ESP_KORVO2_V3)
set(BOARD_TYPE "esp32s3-korvo2-v3")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_ESP_KORVO2_V3_RNDIS)
set(BOARD_TYPE "esp32s3-korvo2-v3-rndis")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_ESP_SPARKBOT)
set(BOARD_TYPE "esp-sparkbot")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_ESP_SPOT_S3)
set(BOARD_TYPE "esp-spot")
elseif(CONFIG_BOARD_TYPE_ESP_SPOT_C5)
set(BOARD_TYPE "esp-spot")
elseif(CONFIG_BOARD_TYPE_ESP_HI)
set(BOARD_TYPE "esp-hi")
# Set ESP_HI emoji directory for DEFAULT_ASSETS_EXTRA_FILES
set(DEFAULT_ASSETS_EXTRA_FILES "${CMAKE_BINARY_DIR}/emoji")
elseif(CONFIG_BOARD_TYPE_ESP_VOCAT)
set(BOARD_TYPE "esp-vocat")
set(BUILTIN_TEXT_FONT font_puhui_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
set(EMOTE_RESOLUTION "360_360")
# set(EMOTE_EXTERNAL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/boards/esp-vocat/assets")
elseif(CONFIG_BOARD_TYPE_ESP_SENSAIRSHUTTLE)
set(BOARD_TYPE "esp-sensairshuttle")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_TOUCH_LCD_3_5)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-touch-lcd-3.5")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_AUDIO_BOARD)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-audio-board")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_1_8)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-amoled-1.8")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_C6_TOUCH_AMOLED_1_8)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-c6-touch-amoled-1.8")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_2_06)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-amoled-2.06")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_C6_TOUCH_AMOLED_2_06)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-c6-touch-amoled-2.06")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_4B)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-lcd-4b")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_4_3C)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-lcd-4.3c")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_1_75)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-amoled-1.75")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_1_75C)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-amoled-1.75")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_1_83)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-lcd-1.83")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_1_85C)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-lcd-1.85c")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_1_85)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-lcd-1.85")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_1_46)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-lcd-1.46")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_3_5)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-lcd-3.5")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_3_5B)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-lcd-3.5b")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_ePaper_1_54_v1)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-epaper-1.54")
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_ePaper_1_54_v2)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-epaper-1.54")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_ePaper_3_97)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-epaper-3.97")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_RLCD_4_2)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-rlcd-4.2")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_LCD_3_49)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-lcd-3.49")
set(LVGL_TEXT_FONT font_puhui_basic_30_4)
set(LVGL_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_C6_LCD_1_69)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-c6-lcd-1.69")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_C6_TOUCH_LCD_1_83)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-c6-touch-lcd-1.83")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_C6_TOUCH_AMOLED_1_43)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-c6-touch-amoled-1.43")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_C6_TOUCH_AMOLED_1_32)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-c6-touch-amoled-1.32")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_S3_TOUCH_AMOLED_1_32)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-s3-touch-amoled-1.32")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_P4_NANO)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-p4-nano")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_4B)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-p4-wifi6-touch-lcd")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_4_3)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-p4-wifi6-touch-lcd")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_7B)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-p4-wifi6-touch-lcd")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_3_4C)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-p4-wifi6-touch-lcd")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_4C)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-p4-wifi6-touch-lcd")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_7)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-p4-wifi6-touch-lcd")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_8)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-p4-wifi6-touch-lcd")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WAVESHARE_ESP32_P4_WIFI6_TOUCH_LCD_10_1)
set(MANUFACTURER "waveshare")
set(BOARD_TYPE "esp32-p4-wifi6-touch-lcd")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_ESP_P4_FUNCTION_EV_BOARD)
set(BOARD_TYPE "esp-p4-function-ev-board")
elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_WIFI_LCD)
set(BOARD_TYPE "bread-compact-wifi-lcd")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_TUDOUZI)
set(BOARD_TYPE "tudouzi")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_LILYGO_T_CIRCLE_S3)
set(BOARD_TYPE "lilygo-t-circle-s3")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_LILYGO_T_CAMERAPLUS_S3_V1_0_V1_1)
set(BOARD_TYPE "lilygo-t-cameraplus-s3")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_LILYGO_T_CAMERAPLUS_S3_V1_2)
set(BOARD_TYPE "lilygo-t-cameraplus-s3")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_LILYGO_T_DISPLAY_S3_PRO_MVSRLORA)
set(BOARD_TYPE "lilygo-t-display-s3-pro-mvsrlora")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_LILYGO_T_DISPLAY_S3_PRO_MVSRLORA_NO_BATTERY)
set(BOARD_TYPE "lilygo-t-display-s3-pro-mvsrlora")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_LILYGO_T_DISPLAY_P4)
set(BOARD_TYPE "lilygo-t-display-p4")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_MOVECALL_MOJI_ESP32S3)
set(BOARD_TYPE "movecall-moji-esp32s3")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_MOVECALL_MOJI2_ESP32C5)
set(BOARD_TYPE "movecall-moji2-esp32c5")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_MOVECALL_CUICAN_ESP32S3)
set(BOARD_TYPE "movecall-cuican-esp32s3")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3)
set(BOARD_TYPE "atk-dnesp32s3")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX)
set(BOARD_TYPE "atk-dnesp32s3-box")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX0)
set(BOARD_TYPE "atk-dnesp32s3-box0")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX2_WIFI)
set(BOARD_TYPE "atk-dnesp32s3-box2-wifi")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX2_4G)
set(BOARD_TYPE "atk-dnesp32s3-box2-4g")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3M_WIFI)
set(BOARD_TYPE "atk-dnesp32s3m-wifi")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_ATK_DNESP32S3M_4G)
set(BOARD_TYPE "atk-dnesp32s3m-4g")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_DU_CHATX)
set(BOARD_TYPE "du-chatx")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_TAIJI_PI_S3)
set(BOARD_TYPE "taiji-pi-s3")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_XINGZHI_CUBE_0_85TFT_WIFI)
set(BOARD_TYPE "xingzhi-cube-0.85tft-wifi")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_XINGZHI_CUBE_0_85TFT_ML307)
set(BOARD_TYPE "xingzhi-cube-0.85tft-ml307")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_XINGZHI_CUBE_0_96OLED_WIFI)
set(BOARD_TYPE "xingzhi-cube-0.96oled-wifi")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_XINGZHI_CUBE_0_96OLED_ML307)
set(BOARD_TYPE "xingzhi-cube-0.96oled-ml307")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_XINGZHI_CUBE_1_54TFT_WIFI)
set(BOARD_TYPE "xingzhi-cube-1.54tft-wifi")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_XINGZHI_CUBE_1_54TFT_ML307)
set(BOARD_TYPE "xingzhi-cube-1.54tft-ml307")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_XINGZHI_METAL_1_54_WIFI)
set(BOARD_TYPE "xingzhi-metal-1.54-wifi")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_XINGZHI_ABS_2_0)
set(BOARD_TYPE "xingzhi-abs-2.0")
set(BUILTIN_TEXT_FONT font_noto_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_SEEED_STUDIO_SENSECAP_WATCHER)
set(BOARD_TYPE "sensecap-watcher")
set(BUILTIN_TEXT_FONT font_noto_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION noto-emoji_128)
elseif(CONFIG_BOARD_TYPE_DOIT_S3_AIBOX)
set(BOARD_TYPE "doit-s3-aibox")
elseif(CONFIG_BOARD_TYPE_MIXGO_NOVA)
set(BOARD_TYPE "mixgo-nova")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_GENJUTECH_S3_1_54TFT)
set(BOARD_TYPE "genjutech-s3-1.54tft")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_CGC)
set(BOARD_TYPE "esp32-cgc")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_CGC_144)
set(BOARD_TYPE "esp32-cgc-144")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
elseif(CONFIG_BOARD_TYPE_ESP_S3_LCD_EV_Board)
set(BOARD_TYPE "esp-s3-lcd-ev-board")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_ESP_S3_LCD_EV_Board_2)
set(BOARD_TYPE "esp-s3-lcd-ev-board-2")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_ZHENGCHEN_1_54TFT_WIFI)
set(BOARD_TYPE "zhengchen-1.54tft-wifi")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_MINSI_K08_DUAL)
set(BOARD_TYPE "minsi-k08-dual")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_ZHENGCHEN_1_54TFT_ML307)
set(BOARD_TYPE "zhengchen-1.54tft-ml307")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_ZHENGCHEN_CAM)
set(BOARD_TYPE "zhengchen-cam")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_ZHENGCHEN_CAM_ML307)
set(BOARD_TYPE "zhengchen-cam-ml307")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_SPOTPEAR_ESP32_S3_1_54_MUMA)
set(BOARD_TYPE "sp-esp32-s3-1.54-muma")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_SPOTPEAR_ESP32_S3_1_28_BOX)
set(BOARD_TYPE "sp-esp32-s3-1.28-box")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_OTTO_ROBOT)
set(BOARD_TYPE "otto-robot")
set(BUILTIN_TEXT_FONT font_puhui_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION otto-gif)
elseif(CONFIG_BOARD_TYPE_ELECTRON_BOT)
set(BOARD_TYPE "electron-bot")
set(BUILTIN_TEXT_FONT font_puhui_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION otto-gif)
elseif(CONFIG_BOARD_TYPE_BREAD_COMPACT_WIFI_CAM)
set(BOARD_TYPE "bread-compact-wifi-s3cam")
set(BUILTIN_TEXT_FONT font_puhui_basic_16_4)
set(BUILTIN_ICON_FONT font_awesome_16_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_JIUCHUAN)
set(BOARD_TYPE "jiuchuan-s3")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_LABPLUS_MPYTHON_V3)
set(BOARD_TYPE "labplus-mpython-v3")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_LABPLUS_LEDONG_V2)
set(BOARD_TYPE "labplus-ledong-v2")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_SURFER_C3_1_14TFT)
set(BOARD_TYPE "surfer-c3-1.14tft")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_YUNLIAO_S3)
set(BOARD_TYPE "yunliao-s3")
set(BUILTIN_TEXT_FONT font_puhui_basic_20_4)
set(BUILTIN_ICON_FONT font_awesome_20_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_WIRELESS_TAG_WTP4C5MP07S)
set(BOARD_TYPE "wireless-tag-wtp4c5mp07s")
set(BUILTIN_TEXT_FONT font_puhui_basic_30_4)
set(BUILTIN_ICON_FONT font_awesome_30_4)
set(DEFAULT_EMOJI_COLLECTION twemoji_64)
elseif(CONFIG_BOARD_TYPE_AIPI_LITE)
set(BOARD_TYPE "aipi-lite")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
set(DEFAULT_EMOJI_COLLECTION twemoji_32)
elseif(CONFIG_BOARD_TYPE_HU_087)
set(BOARD_TYPE "hu-087")
set(BUILTIN_TEXT_FONT font_puhui_basic_14_1)
set(BUILTIN_ICON_FONT font_awesome_14_1)
endif()
if(MANUFACTURER)
file(GLOB BOARD_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/boards/${MANUFACTURER}/${BOARD_TYPE}/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/boards/${MANUFACTURER}/${BOARD_TYPE}/*.c
)
else()
file(GLOB BOARD_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.c
)
endif()
list(APPEND SOURCES ${BOARD_SOURCES})
# Select audio processor according to Kconfig
if(CONFIG_USE_AUDIO_PROCESSOR)
list(APPEND SOURCES "audio/processors/afe_audio_processor.cc")
else()
list(APPEND SOURCES "audio/processors/no_audio_processor.cc")
endif()
if(CONFIG_IDF_TARGET_ESP32S3 OR CONFIG_IDF_TARGET_ESP32P4)
list(APPEND SOURCES "audio/wake_words/afe_wake_word.cc")
list(APPEND SOURCES "audio/wake_words/custom_wake_word.cc")
else()
list(APPEND SOURCES "audio/wake_words/esp_wake_word.cc")
endif()
# Auto Select Additional Sources
if (CONFIG_USE_ESP_BLUFI_WIFI_PROVISIONING)
list(APPEND SOURCES "boards/common/blufi.cpp")
endif ()
# Select language directory according to Kconfig
if(CONFIG_LANGUAGE_ZH_CN)
set(LANG_DIR "zh-CN")
elseif(CONFIG_LANGUAGE_ZH_TW)
set(LANG_DIR "zh-TW")
elseif(CONFIG_LANGUAGE_EN_US)
set(LANG_DIR "en-US")
elseif(CONFIG_LANGUAGE_JA_JP)
set(LANG_DIR "ja-JP")
elseif(CONFIG_LANGUAGE_KO_KR)
set(LANG_DIR "ko-KR")
elseif(CONFIG_LANGUAGE_VI_VN)
set(LANG_DIR "vi-VN")
elseif(CONFIG_LANGUAGE_TH_TH)
set(LANG_DIR "th-TH")
elseif(CONFIG_LANGUAGE_DE_DE)
set(LANG_DIR "de-DE")
elseif(CONFIG_LANGUAGE_FR_FR)
set(LANG_DIR "fr-FR")
elseif(CONFIG_LANGUAGE_ES_ES)
set(LANG_DIR "es-ES")
elseif(CONFIG_LANGUAGE_IT_IT)
set(LANG_DIR "it-IT")
elseif(CONFIG_LANGUAGE_RU_RU)
set(LANG_DIR "ru-RU")
elseif(CONFIG_LANGUAGE_AR_SA)
set(LANG_DIR "ar-SA")
elseif(CONFIG_LANGUAGE_HI_IN)
set(LANG_DIR "hi-IN")
elseif(CONFIG_LANGUAGE_PT_PT)
set(LANG_DIR "pt-PT")
elseif(CONFIG_LANGUAGE_PL_PL)
set(LANG_DIR "pl-PL")
elseif(CONFIG_LANGUAGE_CS_CZ)
set(LANG_DIR "cs-CZ")
elseif(CONFIG_LANGUAGE_FI_FI)
set(LANG_DIR "fi-FI")
elseif(CONFIG_LANGUAGE_TR_TR)
set(LANG_DIR "tr-TR")
elseif(CONFIG_LANGUAGE_ID_ID)
set(LANG_DIR "id-ID")
elseif(CONFIG_LANGUAGE_UK_UA)
set(LANG_DIR "uk-UA")
elseif(CONFIG_LANGUAGE_RO_RO)
set(LANG_DIR "ro-RO")
elseif(CONFIG_LANGUAGE_BG_BG)
set(LANG_DIR "bg-BG")
elseif(CONFIG_LANGUAGE_CA_ES)
set(LANG_DIR "ca-ES")
elseif(CONFIG_LANGUAGE_DA_DK)
set(LANG_DIR "da-DK")
elseif(CONFIG_LANGUAGE_EL_GR)
set(LANG_DIR "el-GR")
elseif(CONFIG_LANGUAGE_FA_IR)
set(LANG_DIR "fa-IR")
elseif(CONFIG_LANGUAGE_FIL_PH)
set(LANG_DIR "fil-PH")
elseif(CONFIG_LANGUAGE_HE_IL)
set(LANG_DIR "he-IL")
elseif(CONFIG_LANGUAGE_HR_HR)
set(LANG_DIR "hr-HR")
elseif(CONFIG_LANGUAGE_HU_HU)
set(LANG_DIR "hu-HU")
elseif(CONFIG_LANGUAGE_MS_MY)
set(LANG_DIR "ms-MY")
elseif(CONFIG_LANGUAGE_NB_NO)
set(LANG_DIR "nb-NO")
elseif(CONFIG_LANGUAGE_NL_NL)
set(LANG_DIR "nl-NL")
elseif(CONFIG_LANGUAGE_SK_SK)
set(LANG_DIR "sk-SK")
elseif(CONFIG_LANGUAGE_SL_SI)
set(LANG_DIR "sl-SI")
elseif(CONFIG_LANGUAGE_SV_SE)
set(LANG_DIR "sv-SE")
elseif(CONFIG_LANGUAGE_SR_RS)
set(LANG_DIR "sr-RS")
endif()
# Define generation path
set(LANG_JSON "${CMAKE_CURRENT_SOURCE_DIR}/assets/locales/${LANG_DIR}/language.json")
set(LANG_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/assets/lang_config.h")
# Collect current language audio files
file(GLOB LANG_SOUNDS ${CMAKE_CURRENT_SOURCE_DIR}/assets/locales/${LANG_DIR}/*.ogg)
# If not en-US, collect en-US audio files as fallback for missing files
if(NOT LANG_DIR STREQUAL "en-US")
file(GLOB EN_US_SOUNDS ${CMAKE_CURRENT_SOURCE_DIR}/assets/locales/en-US/*.ogg)
# Extract filenames (without path) from current language
set(EXISTING_NAMES "")
foreach(SOUND_FILE ${LANG_SOUNDS})
get_filename_component(FILENAME ${SOUND_FILE} NAME)
list(APPEND EXISTING_NAMES ${FILENAME})
endforeach()
# Only add en-US audio files that are missing in current language
foreach(EN_SOUND ${EN_US_SOUNDS})
get_filename_component(FILENAME ${EN_SOUND} NAME)
if(NOT ${FILENAME} IN_LIST EXISTING_NAMES)
list(APPEND LANG_SOUNDS ${EN_SOUND})
message(STATUS "Using en-US fallback for missing audio: ${FILENAME}")
endif()
endforeach()
endif()
file(GLOB COMMON_SOUNDS ${CMAKE_CURRENT_SOURCE_DIR}/assets/common/*.ogg)
# If target chip is ESP32, exclude specific files to avoid build errors
if(CONFIG_IDF_TARGET_ESP32)
list(REMOVE_ITEM SOURCES "audio/codecs/box_audio_codec.cc"
"audio/codecs/es8388_audio_codec.cc"
"audio/codecs/es8389_audio_codec.cc"
"led/gpio_led.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 "boards/common/esp_video.cc"
"boards/common/rndis_board.cc"
)
endif()
# Include Esp32Camera if target is ESP32S3
if(CONFIG_IDF_TARGET_ESP32S3)
list(APPEND SOURCES "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
)
# Use target_compile_definitions to define BOARD_TYPE, BOARD_NAME
# If BOARD_NAME is empty, use BOARD_TYPE
if(NOT BOARD_NAME)
set(BOARD_NAME ${BOARD_TYPE})
endif()
target_compile_definitions(${COMPONENT_LIB}
PRIVATE BOARD_TYPE=\"${BOARD_TYPE}\" BOARD_NAME=\"${BOARD_NAME}\"
PRIVATE BUILTIN_TEXT_FONT=${BUILTIN_TEXT_FONT} BUILTIN_ICON_FONT=${BUILTIN_ICON_FONT}
)
# Add generation rules
add_custom_command(
OUTPUT ${LANG_HEADER}
COMMAND python ${PROJECT_DIR}/scripts/gen_lang.py
--language "${LANG_DIR}"
--output "${LANG_HEADER}"
DEPENDS
${LANG_JSON}
${PROJECT_DIR}/scripts/gen_lang.py
COMMENT "Generating ${LANG_DIR} language config"
)
# Force build generation dependencies
add_custom_target(lang_header ALL
DEPENDS ${LANG_HEADER}
)
# Find ESP-SR component dynamically
find_component_by_pattern("espressif__esp-sr" ESP_SR_COMPONENT ESP_SR_COMPONENT_PATH)
if(ESP_SR_COMPONENT_PATH)
set(ESP_SR_MODEL_PATH "${ESP_SR_COMPONENT_PATH}/model")
endif()
# Find xiaozhi-fonts component dynamically
find_component_by_pattern("xiaozhi-fonts" XIAOZHI_FONTS_COMPONENT XIAOZHI_FONTS_COMPONENT_PATH)
if(XIAOZHI_FONTS_COMPONENT_PATH)
set(XIAOZHI_FONTS_PATH "${XIAOZHI_FONTS_COMPONENT_PATH}")
endif()
if(CONFIG_BOARD_TYPE_ESP_HI)
set(URL "https://github.com/espressif2022/image_player/raw/main/test_apps/test_8bit")
set(EMOJI_DIR "${CMAKE_BINARY_DIR}/emoji")
file(MAKE_DIRECTORY ${EMOJI_DIR})
# List all files to download
set(FILES_TO_DOWNLOAD "")
list(APPEND FILES_TO_DOWNLOAD "Anger_enter.aaf" "Anger_loop.aaf" "Anger_return.aaf")
list(APPEND FILES_TO_DOWNLOAD "happy_enter.aaf" "happy_loop.aaf" "happ_return.aaf")
list(APPEND FILES_TO_DOWNLOAD "sad_enter.aaf" "sad_loop.aaf" "sad_return.aaf")
list(APPEND FILES_TO_DOWNLOAD "scorn_enter.aaf" "scorn_loop.aaf" "scorn_return.aaf")
list(APPEND FILES_TO_DOWNLOAD "left_enter.aaf" "left_loop.aaf" "left_return.aaf")
list(APPEND FILES_TO_DOWNLOAD "right_enter.aaf" "right_loop.aaf" "right_return.aaf")
list(APPEND FILES_TO_DOWNLOAD "asking.aaf" "blink_once.aaf" "blink_quick.aaf")
list(APPEND FILES_TO_DOWNLOAD "connecting.aaf" "panic_enter.aaf" "panic_loop.aaf")
list(APPEND FILES_TO_DOWNLOAD "panic_return.aaf" "wake.aaf")
foreach(FILENAME IN LISTS FILES_TO_DOWNLOAD)
set(REMOTE_FILE "${URL}/${FILENAME}")
set(LOCAL_FILE "${EMOJI_DIR}/${FILENAME}")
# Check if local file exists
if(EXISTS ${LOCAL_FILE})
message(STATUS "File ${FILENAME} already exists, skipping download")
else()
message(STATUS "Downloading ${FILENAME}")
file(DOWNLOAD ${REMOTE_FILE} ${LOCAL_FILE}
STATUS DOWNLOAD_STATUS)
list(GET DOWNLOAD_STATUS 0 STATUS_CODE)
if(NOT STATUS_CODE EQUAL 0)
message(FATAL_ERROR "Failed to download ${FILENAME} from ${URL}")
endif()
endif()
endforeach()
endif()
# Function to build default assets based on configuration
function(build_default_assets_bin)
# Set output path for generated assets.bin
set(GENERATED_ASSETS_BIN "${CMAKE_BINARY_DIR}/generated_assets.bin")
# Prepare arguments for build script
set(BUILD_ARGS
"--sdkconfig" "${SDKCONFIG}"
"--output" "${GENERATED_ASSETS_BIN}"
)
# Add builtin text font if defined
if(BUILTIN_TEXT_FONT)
list(APPEND BUILD_ARGS "--builtin_text_font" "${BUILTIN_TEXT_FONT}")
endif()
# Add default emoji collection if defined
if(DEFAULT_EMOJI_COLLECTION)
list(APPEND BUILD_ARGS "--emoji_collection" "${DEFAULT_EMOJI_COLLECTION}")
endif()
# Add default assets extra files if defined
if(DEFAULT_ASSETS_EXTRA_FILES)
list(APPEND BUILD_ARGS "--extra_files" "${DEFAULT_ASSETS_EXTRA_FILES}")
endif()
list(APPEND BUILD_ARGS "--esp_sr_model_path" "${ESP_SR_MODEL_PATH}")
list(APPEND BUILD_ARGS "--xiaozhi_fonts_path" "${XIAOZHI_FONTS_PATH}")
# Create custom command to build assets
add_custom_command(
OUTPUT ${GENERATED_ASSETS_BIN}
COMMAND python ${PROJECT_DIR}/scripts/build_default_assets.py ${BUILD_ARGS}
DEPENDS
${SDKCONFIG}
${PROJECT_DIR}/scripts/build_default_assets.py
COMMENT "Building default assets.bin based on configuration"
VERBATIM
)
# Create target for generated assets
add_custom_target(generated_default_assets ALL
DEPENDS ${GENERATED_ASSETS_BIN}
)
# Set the generated file path in parent scope
set(GENERATED_ASSETS_LOCAL_FILE ${GENERATED_ASSETS_BIN} PARENT_SCOPE)
message(STATUS "Default assets build configured: ${GENERATED_ASSETS_BIN}")
endfunction()
# Function to get local assets file path (handles both URL and local file)
function(get_assets_local_file assets_source assets_local_file_var)
# Check if it's a URL (starts with http:// or https://)
if(assets_source MATCHES "^https?://")
# It's a URL, download it
get_filename_component(ASSETS_FILENAME "${assets_source}" NAME)
set(ASSETS_LOCAL_FILE "${CMAKE_BINARY_DIR}/${ASSETS_FILENAME}")
set(ASSETS_TEMP_FILE "${CMAKE_BINARY_DIR}/${ASSETS_FILENAME}.tmp")
# Check if local file exists
if(EXISTS ${ASSETS_LOCAL_FILE})
message(STATUS "Assets file ${ASSETS_FILENAME} already exists, skipping download")
else()
message(STATUS "Downloading ${ASSETS_FILENAME}")
# Clean up any existing temp file
if(EXISTS ${ASSETS_TEMP_FILE})
file(REMOVE ${ASSETS_TEMP_FILE})
endif()
# Download to temporary file first
file(DOWNLOAD ${assets_source} ${ASSETS_TEMP_FILE}
STATUS DOWNLOAD_STATUS)
list(GET DOWNLOAD_STATUS 0 STATUS_CODE)
if(NOT STATUS_CODE EQUAL 0)
# Clean up temp file on failure
if(EXISTS ${ASSETS_TEMP_FILE})
file(REMOVE ${ASSETS_TEMP_FILE})
endif()
message(FATAL_ERROR "Failed to download ${ASSETS_FILENAME} from ${assets_source}")
endif()
# Move temp file to final location (atomic operation)
file(RENAME ${ASSETS_TEMP_FILE} ${ASSETS_LOCAL_FILE})
message(STATUS "Successfully downloaded ${ASSETS_FILENAME}")
endif()
else()
# It's a local file path
if(IS_ABSOLUTE "${assets_source}")
set(ASSETS_LOCAL_FILE "${assets_source}")
else()
set(ASSETS_LOCAL_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${assets_source}")
endif()
# Check if local file exists
if(NOT EXISTS ${ASSETS_LOCAL_FILE})
message(FATAL_ERROR "Assets file not found: ${ASSETS_LOCAL_FILE}")
endif()
message(STATUS "Using assets file: ${ASSETS_LOCAL_FILE}")
endif()
set(${assets_local_file_var} ${ASSETS_LOCAL_FILE} PARENT_SCOPE)
endfunction()
partition_table_get_partition_info(size "--partition-name assets" "size")
partition_table_get_partition_info(offset "--partition-name assets" "offset")
if ("${size}" AND "${offset}")
# Flash assets based on configuration
if(CONFIG_FLASH_DEFAULT_ASSETS)
# Build default assets based on configuration
build_default_assets_bin()
esptool_py_flash_to_partition(flash "assets" "${GENERATED_ASSETS_LOCAL_FILE}")
message(STATUS "Generated default assets flash configured: ${GENERATED_ASSETS_LOCAL_FILE} -> assets partition")
elseif(CONFIG_FLASH_CUSTOM_ASSETS)
# Flash custom assets
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()
else()
message(STATUS "Assets partition not found, using v1 partition table")
endif()
================================================
FILE: main/Kconfig.projbuild
================================================
menu "Xiaozhi Assistant"
config OTA_URL
string "Default OTA URL"
default "https://api.tenclass.net/xiaozhi/ota/"
help
The application will access this URL to check for new firmwares and server address.
choice
prompt "Flash 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.
config FLASH_NONE_ASSETS
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
depends on FLASH_CUSTOM_ASSETS
string "Custom Assets File"
default "assets.bin"
help
The custom assets file to flash.
It can be a local file relative to the project directory or a remote url.
choice
prompt "Default Language"
default LANGUAGE_ZH_CN
help
Select device display language
config LANGUAGE_ZH_CN
bool "Chinese"
config LANGUAGE_ZH_TW
bool "Chinese Traditional"
config LANGUAGE_EN_US
bool "English"
config LANGUAGE_JA_JP
bool "Japanese"
config LANGUAGE_KO_KR
bool "Korean"
config LANGUAGE_VI_VN
bool "Vietnamese"
config LANGUAGE_TH_TH
bool "Thai"
config LANGUAGE_DE_DE
bool "German"
config LANGUAGE_FR_FR
bool "French"
config LANGUAGE_ES_ES
bool "Spanish"
config LANGUAGE_IT_IT
bool "Italian"
config LANGUAGE_RU_RU
bool "Russian"
config LANGUAGE_AR_SA
bool "Arabic"
config LANGUAGE_HI_IN
bool "Hindi"
config LANGUAGE_PT_PT
bool "Portuguese"
config LANGUAGE_PL_PL
bool "Polish"
config LANGUAGE_CS_CZ
bool "Czech"
config LANGUAGE_FI_FI
bool "Finnish"
config LANGUAGE_TR_TR
bool "Turkish"
config LANGUAGE_ID_ID
bool "Indonesian"
config LANGUAGE_UK_UA
bool "Ukrainian"
config LANGUAGE_RO_RO
bool "Romanian"
config LANGUAGE_BG_BG
bool "Bulgarian"
config LANGUAGE_CA_ES
bool "Catalan"
config LANGUAGE_DA_DK
bool "Danish"
config LANGUAGE_EL_GR
bool "Greek"
config LANGUAGE_FA_IR
bool "Persian"
config LANGUAGE_FIL_PH
bool "Filipino"
config LANGUAGE_HE_IL
bool "Hebrew"
config LANGUAGE_HR_HR
bool "Croatian"
config LANGUAGE_HU_HU
bool "Hungarian"
config LANGUAGE_MS_MY
bool "Malay"
config LANGUAGE_NB_NO
bool "Norwegian"
config LANGUAGE_NL_NL
bool "Dutch"
config LANGUAGE_SK_SK
bool "Slovak"
config LANGUAGE_SL_SI
bool "Slovenian"
config LANGUAGE_SV_SE
bool "Swedish"
config LANGUAGE_SR_RS
bool "Serbian"
endchoice
choice BOARD_TYPE
prompt "Board Type"
default BOARD_TYPE_BREAD_COMPACT_WIFI
help
Board type. 开发板类型
config BOARD_TYPE_BREAD_COMPACT_WIFI
bool "Bread Compact WiFi (面包板)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_BREAD_COMPACT_WIFI_LCD
bool "Bread Compact WiFi + LCD (面包板)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_BREAD_COMPACT_WIFI_CAM
bool "Bread Compact WiFi + LCD + Camera (面包板)"
depends on IDF_TARGET_ESP32S3
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
config BOARD_TYPE_BREAD_COMPACT_ESP32_LCD
bool "Bread Compact ESP32 DevKit + LCD (面包板)"
depends on IDF_TARGET_ESP32
config BOARD_TYPE_XMINI_C3_V3
bool "Xmini C3 V3"
depends on IDF_TARGET_ESP32C3
config BOARD_TYPE_XMINI_C3_4G
bool "Xmini C3 4G"
depends on IDF_TARGET_ESP32C3
config BOARD_TYPE_XMINI_C3
bool "Xmini C3"
depends on IDF_TARGET_ESP32C3
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
config BOARD_TYPE_ESP_SPOT_C5
bool "Espressif Spot-C5"
depends on IDF_TARGET_ESP32C5
config BOARD_TYPE_ESP_HI
bool "Espressif ESP-HI"
depends on IDF_TARGET_ESP32C3
config BOARD_TYPE_ESP_BOX_3
bool "Espressif ESP-BOX-3"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ESP_BOX
bool "Espressif ESP-BOX"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ESP_BOX_LITE
bool "Espressif ESP-BOX-Lite"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ESP_P4_FUNCTION_EV_BOARD
bool "Espressif ESP-P4-Function-EV-Board"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_ESP_VOCAT
bool "Espressif ESP-VoCat"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_KEVIN_BOX_2
bool "Kevin Box 2"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_KEVIN_C3
bool "Kevin C3"
depends on IDF_TARGET_ESP32C3
config BOARD_TYPE_KEVIN_SP_V3_DEV
bool "Kevin SP V3"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_KEVIN_SP_V4_DEV
bool "Kevin SP V4"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_KEVIN_YUYING_313LCD
bool "鱼鹰科技 3.13LCD"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_CGC
bool "CGC"
depends on IDF_TARGET_ESP32
config BOARD_TYPE_CGC_144
bool "CGC 144"
depends on IDF_TARGET_ESP32
config BOARD_TYPE_LICHUANG_DEV_S3
bool "立创·实战派 ESP32-S3"
depends on IDF_TARGET_ESP32S3
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
config BOARD_TYPE_DF_S3_AI_CAM
bool "DFRobot ESP32-S3 AI智能摄像头模块"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_MAGICLICK_S3_2P4
bool "神奇按钮 Magiclick_2.4"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_MAGICLICK_S3_2P5
bool "神奇按钮 Magiclick_2.5"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_MAGICLICK_C3
bool "神奇按钮 Magiclick_C3"
depends on IDF_TARGET_ESP32C3
config BOARD_TYPE_MAGICLICK_C3_V2
bool "神奇按钮 Magiclick_C3_v2"
depends on IDF_TARGET_ESP32C3
config BOARD_TYPE_M5STACK_CORE_S3
bool "M5Stack CoreS3"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_M5STACK_CORE_TAB5
bool "M5Stack Tab5"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_M5STACK_ATOM_S3_ECHO_BASE
bool "M5Stack AtomS3 + Echo Base"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_M5STACK_ATOM_S3R_ECHO_BASE
bool "M5Stack AtomS3R + Echo Base"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_M5STACK_ATOM_S3R_CAM_M12_ECHO_BASE
bool "M5Stack AtomS3R CAM/M12 + Echo Base"
depends on IDF_TARGET_ESP32S3
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_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_ESP32_S3_TOUCH_AMOLED_1_8
bool "Waveshare ESP32-S3-Touch-AMOLED-1.8"
depends on IDF_TARGET_ESP32S3
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_ESP32_C6_TOUCH_AMOLED_2_06
bool "Waveshare ESP32-C6-Touch-AMOLED-2.06"
depends on IDF_TARGET_ESP32C6
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_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_ESP32_S3_TOUCH_LCD_4B
bool "Waveshare ESP32-S3-Touch-LCD-4B"
depends on IDF_TARGET_ESP32S3
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_ESP32_S3_TOUCH_LCD_1_85
bool "Waveshare ESP32-S3-Touch-LCD-1.85"
depends on IDF_TARGET_ESP32S3
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_ESP32_C6_LCD_1_69
bool "Waveshare ESP32-C6-LCD-1.69"
depends on IDF_TARGET_ESP32C6
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_ESP32_C6_TOUCH_AMOLED_1_43
bool "Waveshare ESP32-C6-Touch-AMOLOED-1.43"
depends on IDF_TARGET_ESP32C6
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_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_ESP32_S3_TOUCH_LCD_3_49
bool "Waveshare ESP32-S3-Touch-LCD-3.49"
depends on IDF_TARGET_ESP32S3
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_ESP32_S3_ePaper_1_54_v1
bool "Waveshare ESP32-S3-ePaper-1.54_v1"
depends on IDF_TARGET_ESP32S3
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_ePaper_3_97
bool "Waveshare ESP32-S3-ePaper-3.97"
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_ESP32_P4_NANO
bool "Waveshare ESP32-P4-NANO"
depends on IDF_TARGET_ESP32P4
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_ESP32_P4_WIFI6_TOUCH_LCD_4_3
bool "Waveshare ESP32-P4-WIFI6-Touch-LCD-4.3"
depends on IDF_TARGET_ESP32P4
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_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 "土豆子"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_LILYGO_T_CIRCLE_S3
bool "LILYGO T-Circle-S3"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_LILYGO_T_CAMERAPLUS_S3_V1_0_V1_1
bool "LILYGO T-CameraPlus-S3_V1_0_V1_1"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_LILYGO_T_CAMERAPLUS_S3_V1_2
bool "LILYGO T-CameraPlus-S3_V1_2"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_LILYGO_T_DISPLAY_S3_PRO_MVSRLORA
bool "LILYGO T-Display-S3-Pro-MVSRLora"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_LILYGO_T_DISPLAY_S3_PRO_MVSRLORA_NO_BATTERY
bool "LILYGO T-Display-S3-Pro-MVSRLora_No_Battery"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_LILYGO_T_DISPLAY_P4
bool "LILYGO T-Display-P4"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_MOVECALL_MOJI_ESP32S3
bool "Movecall Moji 小智AI衍生版"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_MOVECALL_MOJI2_ESP32C5
bool "Movecall Moji2.0 小智AI衍生版"
depends on IDF_TARGET_ESP32C5
config BOARD_TYPE_MOVECALL_CUICAN_ESP32S3
bool "Movecall CuiCan 璀璨·AI吊坠"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ATK_DNESP32S3
bool "正点原子DNESP32S3开发板"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ATK_DNESP32S3_BOX
bool "正点原子DNESP32S3-BOX"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ATK_DNESP32S3_BOX0
bool "正点原子DNESP32S3-BOX0"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ATK_DNESP32S3_BOX2_WIFI
bool "正点原子DNESP32S3-BOX2-WIFI"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ATK_DNESP32S3_BOX2_4G
bool "正点原子DNESP32S3-BOX2-4G"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ATK_DNESP32S3M_WIFI
bool "正点原子DNESP32S3M-WIFI"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ATK_DNESP32S3M_4G
bool "正点原子DNESP32S3M-4G"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_DU_CHATX
bool "嘟嘟开发板CHATX(wifi)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_TAIJI_PI_S3
bool "太极小派esp32s3"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_XINGZHI_CUBE_0_85TFT_WIFI
bool "无名科技星智0.85(WIFI)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_XINGZHI_CUBE_0_85TFT_ML307
bool "无名科技星智0.85(ML307)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_XINGZHI_CUBE_0_96OLED_WIFI
bool "无名科技星智0.96(WIFI)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_XINGZHI_CUBE_0_96OLED_ML307
bool "无名科技星智0.96(ML307)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_XINGZHI_CUBE_1_54TFT_WIFI
bool "无名科技星智1.54(WIFI)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_XINGZHI_CUBE_1_54TFT_ML307
bool "无名科技星智1.54(ML307)"
depends on IDF_TARGET_ESP32S3
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
config BOARD_TYPE_DOIT_S3_AIBOX
bool "四博智联AI陪伴盒子"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_MIXGO_NOVA
bool "元控·青春"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_GENJUTECH_S3_1_54TFT
bool "亘具科技1.54(s3)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ESP_S3_LCD_EV_Board
bool "乐鑫ESP S3 LCD EV Board开发板"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ESP_S3_LCD_EV_Board_2
bool "乐鑫ESP S3 LCD EV Board 2开发板"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ZHENGCHEN_1_54TFT_WIFI
bool "征辰科技1.54(WIFI)"
depends on IDF_TARGET_ESP32S3
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
config BOARD_TYPE_SPOTPEAR_ESP32_S3_1_54_MUMA
bool "Spotpear ESP32-S3-1.54-MUMA"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_SPOTPEAR_ESP32_S3_1_28_BOX
bool "Spotpear ESP32-S3-1.28-BOX"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_OTTO_ROBOT
bool "ottoRobot"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ELECTRON_BOT
bool "electronBot"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_JIUCHUAN
bool "九川智能"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_LABPLUS_MPYTHON_V3
bool "labplus mpython_v3 board"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_LABPLUS_LEDONG_V2
bool "labplus ledong_v2 board"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_SURFER_C3_1_14TFT
bool "Surfer-C3-1.14TFT"
depends on IDF_TARGET_ESP32C3
config BOARD_TYPE_YUNLIAO_S3
bool "小智云聊-S3"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_WIRELESS_TAG_WTP4C5MP07S
bool "Wireless-Tag WTP4C5MP07S"
depends on IDF_TARGET_ESP32P4
config BOARD_TYPE_AIPI_LITE
bool "AIPI-Lite"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_HU_087
bool "HU-087"
depends on IDF_TARGET_ESP32S3
endchoice
choice
depends on BOARD_TYPE_LILYGO_T_DISPLAY_P4
prompt "Select the screen type"
default SCREEN_TYPE_HI8561
config SCREEN_TYPE_HI8561
bool "HI8561"
config SCREEN_TYPE_RM69A10
bool "RM69A10"
endchoice
choice
depends on BOARD_TYPE_LILYGO_T_DISPLAY_P4
prompt "Select the color format of the screen"
default SCREEN_PIXEL_FORMAT_RGB565
config SCREEN_PIXEL_FORMAT_RGB565
bool "RGB565"
config SCREEN_PIXEL_FORMAT_RGB888
bool "RGB888"
endchoice
choice ESP_S3_LCD_EV_Board_Version_TYPE
depends on BOARD_TYPE_ESP_S3_LCD_EV_Board
prompt "EV_BOARD Type"
default ESP_S3_LCD_EV_Board_1p4
config ESP_S3_LCD_EV_Board_1p4
bool "乐鑫ESP32_S3_LCD_EV_Board-MB_V1.4"
config ESP_S3_LCD_EV_Board_1p5
bool "乐鑫ESP32_S3_LCD_EV_Board-MB_V1.5"
endchoice
choice DISPLAY_OLED_TYPE
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
OLED Monochrome Display Type
config OLED_SSD1306_128X32
bool "SSD1306 128*32"
config OLED_SSD1306_128X64
bool "SSD1306 128*64"
config OLED_SH1106_128X64
bool "SH1106 128*64"
endchoice
choice DISPLAY_LCD_TYPE
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
LCD Display Type
config LCD_ST7789_240X320
bool "ST7789 240*320, IPS"
config LCD_ST7789_240X320_NO_IPS
bool "ST7789 240*320, Non-IPS"
config LCD_ST7789_170X320
bool "ST7789 170*320"
config LCD_ST7789_172X320
bool "ST7789 172*320"
config LCD_ST7789_240X280
bool "ST7789 240*280"
config LCD_ST7789_240X240
bool "ST7789 240*240"
config LCD_ST7789_240X240_7PIN
bool "ST7789 240*240, 7PIN"
config LCD_ST7789_240X135
bool "ST7789 240*135"
config LCD_ST7735_128X160
bool "ST7735 128*160"
config LCD_ST7735_128X128
bool "ST7735 128*128"
config LCD_ST7796_320X480
bool "ST7796 320*480 IPS"
config LCD_ST7796_320X480_NO_IPS
bool "ST7796 320*480, Non-IPS"
config LCD_ILI9341_240X320
bool "ILI9341 240*320"
config LCD_ILI9341_240X320_NO_IPS
bool "ILI9341 240*320, Non-IPS"
config LCD_GC9A01_240X240
bool "GC9A01 240*240 Circle"
config LCD_CUSTOM
bool "Custom LCD (自定义屏幕参数)"
endchoice
choice DISPLAY_ESP32S3_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
LCD Display Type
config ESP32S3_KORVO2_V3_LCD_ST7789
bool "ST7789 240*280"
config ESP32S3_KORVO2_V3_LCD_ILI9341
bool "ILI9341 240*320"
endchoice
choice DISPLAY_ESP32S3_AUDIO_BOARD
depends on BOARD_TYPE_WAVESHARE_ESP32_S3_AUDIO_BOARD
prompt "ESP32S3_AUDIO_BOARD LCD Type"
default AUDIO_BOARD_LCD_JD9853
help
LCD Display Type
config AUDIO_BOARD_LCD_JD9853
bool "JD9853 320*172"
config AUDIO_BOARD_LCD_ST7789
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
help
Select display style for Xiaozhi device
config USE_DEFAULT_MESSAGE_STYLE
bool "Enable default message style"
config USE_WECHAT_MESSAGE_STYLE
bool "Enable WeChat Message Style"
config USE_EMOTE_MESSAGE_STYLE
bool "Emote animation style"
depends on BOARD_TYPE_ESP_BOX || BOARD_TYPE_ESP_BOX_3 \
|| BOARD_TYPE_ESP_VOCAT || 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
default WAKE_WORD_DISABLED
help
Choose the type of wake word implementation to use
config WAKE_WORD_DISABLED
bool "Disabled"
help
Disable wake word detection
config USE_ESP_WAKE_WORD
bool "Wakenet model without AFE"
depends on IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32C5 || IDF_TARGET_ESP32C6 || (IDF_TARGET_ESP32 && SPIRAM)
help
Support ESP32 C3、ESP32 C5 与 ESP32 C6, and (ESP32 with PSRAM)
config USE_AFE_WAKE_WORD
bool "Wakenet model with AFE"
depends on (IDF_TARGET_ESP32S3 || IDF_TARGET_ESP32P4) && SPIRAM
help
Support AEC if available, requires ESP32 S3 and PSRAM
config USE_CUSTOM_WAKE_WORD
bool "Multinet model (Custom Wake Word)"
depends on (IDF_TARGET_ESP32S3 || IDF_TARGET_ESP32P4) && SPIRAM
help
Requires ESP32 S3 and PSRAM
endchoice
config CUSTOM_WAKE_WORD
string "Custom Wake Word"
default "xiao tu dou"
depends on USE_CUSTOM_WAKE_WORD
help
Custom Wake Word, use pinyin for Chinese, separated by spaces
config CUSTOM_WAKE_WORD_DISPLAY
string "Custom Wake Word Display"
default "小土豆"
depends on USE_CUSTOM_WAKE_WORD
help
Greeting sent to the server after wake word detection
config CUSTOM_WAKE_WORD_THRESHOLD
int "Custom Wake Word Threshold (%)"
default 20
range 1 99
depends on USE_CUSTOM_WAKE_WORD
help
Custom Wake Word Threshold, range 1-99, the smaller the more sensitive, default 20
config SEND_WAKE_WORD_DATA
bool "Send Wake Word Data"
default y
depends on USE_AFE_WAKE_WORD || USE_CUSTOM_WAKE_WORD
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
depends on (IDF_TARGET_ESP32S3 || IDF_TARGET_ESP32P4) && SPIRAM
help
Requires ESP32 S3 and PSRAM
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_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_4_3 \
|| 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_ESP_VOCAT || 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.
config USE_SERVER_AEC
bool "Enable Server-Side AEC (Unstable)"
default n
depends on USE_AUDIO_PROCESSOR
help
To work perperly, server-side AEC requires server support
config USE_AUDIO_DEBUGGER
bool "Enable Audio Debugger"
default n
help
Enable audio debugger, send audio data through UDP to the host machine
menu "WiFi Configuration Method"
help
WiFi Configuration Method Selection
config USE_HOTSPOT_WIFI_PROVISIONING
bool "Hotspot"
default y
help
Use WiFi Hotspot to transmit WiFi configuration data
config USE_ACOUSTIC_WIFI_PROVISIONING
bool "Acoustic"
help
Use audio signal to transmit WiFi configuration data
config USE_ESP_BLUFI_WIFI_PROVISIONING
bool "Esp Blufi"
help
Use esp blufi protocol to transmit WiFi configuration data
select BT_ENABLED
select BT_BLE_42_FEATURES_SUPPORTED
select BT_BLE_BLUFI_ENABLE
select MBEDTLS_DHM_C
endmenu
config AUDIO_DEBUG_UDP_SERVER
string "Audio Debug UDP Server Address"
default "192.168.2.100:8000"
depends on USE_AUDIO_DEBUGGER
help
UDP server address, format: IP:PORT, used to receive audio debugging data
config RECEIVE_CUSTOM_MESSAGE
bool "Enable Custom Message Reception"
default n
help
Enable custom message reception, allow the device to receive custom messages from the server (preferably through the MQTT protocol)
menu "Camera Configuration"
depends on !IDF_TARGET_ESP32
comment "Warning: Please read the help text before modifying these settings."
config XIAOZHI_CAMERA_ALLOW_JPEG_INPUT
bool "Allow JPEG Input"
default n
help
Allow JPEG Input format for the camera.
This option may need to be enabled when using a USB camera.
Not currently supported when used simultaneously with XIAOZHI_ENABLE_ROTATE_CAMERA_IMAGE.
config XIAOZHI_ENABLE_HARDWARE_JPEG_ENCODER
bool "Enable Hardware JPEG Encoder"
default y
depends on SOC_JPEG_ENCODE_SUPPORTED
help
Use hardware JPEG encoder on ESP32-P4 to encode image to JPEG.
See https://docs.espressif.com/projects/esp-idf/en/stable/esp32p4/api-reference/peripherals/jpeg.html for more details.
config XIAOZHI_ENABLE_HARDWARE_JPEG_DECODER
bool "Enable Hardware JPEG Decoder"
default n
depends on SOC_JPEG_DECODE_SUPPORTED && XIAOZHI_CAMERA_ALLOW_JPEG_INPUT
help
Use hardware JPEG decoder on ESP32-P4 to decode JPEG to image.
See https://docs.espressif.com/projects/esp-idf/en/stable/esp32p4/api-reference/peripherals/jpeg.html for more details.
config XIAOZHI_ENABLE_CAMERA_DEBUG_MODE
bool "Enable Camera Debug Mode"
default n
help
Enable camera debug mode, print camera debug information to the console.
Only works on boards that support camera.
config XIAOZHI_ENABLE_CAMERA_ENDIANNESS_SWAP
bool "Enable software camera buffer endianness swapping"
default n
depends on !CAMERA_SENSOR_SWAP_PIXEL_BYTE_ORDER
help
This option treats the camera buffer as a uint16_t[] array and performs byte-swapping (endianness conversion) on each element.
Should only be modified by development board integration engineers.
**Incorrect usage may result in incorrect image colors!**
ATTENTION: If the option CAMERA_SENSOR_SWAP_PIXEL_BYTE_ORDER is available for your sensor, please use that instead.
menuconfig XIAOZHI_ENABLE_ROTATE_CAMERA_IMAGE
bool "Enable Camera Image Rotation"
default n
depends on !XIAOZHI_CAMERA_ALLOW_JPEG_INPUT
help
Enable camera image rotation, rotate the camera image to the correct orientation.
- On ESP32-P4, rotation is handled by PPA hardware.
- On other chips, rotation is done in software with performance cost.
- For 180° rotation, use HFlip + VFlip instead of this option.
Not currently supported when used simultaneously with XIAOZHI_CAMERA_ALLOW_JPEG_INPUT.
if XIAOZHI_ENABLE_ROTATE_CAMERA_IMAGE
choice XIAOZHI_CAMERA_IMAGE_ROTATION_ANGLE
prompt "Camera Image Rotation Angle (clockwise)"
default XIAOZHI_CAMERA_IMAGE_ROTATION_ANGLE_90
help
Camera image rotation angle.
config XIAOZHI_CAMERA_IMAGE_ROTATION_ANGLE_90
bool "90°"
config XIAOZHI_CAMERA_IMAGE_ROTATION_ANGLE_270
bool "270°"
comment "For 180° rotation, use HFlip + VFlip instead of this option"
endchoice
endif
endmenu
menu "TAIJIPAI_S3_CONFIG"
depends on BOARD_TYPE_TAIJI_PI_S3
choice I2S_TYPE_TAIJIPI_S3
prompt "taiji-pi-S3 I2S Type"
default TAIJIPAI_I2S_TYPE_STD
help
I2S 类型选择
config TAIJIPAI_I2S_TYPE_STD
bool "I2S Type STD"
config TAIJIPAI_I2S_TYPE_PDM
bool "I2S Type PDM"
endchoice
config I2S_USE_2SLOT
bool "Enable I2S 2 Slot"
default y
help
启动双声道
endmenu
endmenu
================================================
FILE: main/application.cc
================================================
#include "application.h"
#include "board.h"
#include "display.h"
#include "system_info.h"
#include "audio_codec.h"
#include "mqtt_protocol.h"
#include "websocket_protocol.h"
#include "assets/lang_config.h"
#include "mcp_server.h"
#include "assets.h"
#include "settings.h"
#include <cstring>
#include <esp_log.h>
#include <cJSON.h>
#include <driver/gpio.h>
#include <arpa/inet.h>
#include <font_awesome.h>
#define TAG "Application"
Application::Application() {
event_group_ = xEventGroupCreate();
#if CONFIG_USE_DEVICE_AEC && CONFIG_USE_SERVER_AEC
#error "CONFIG_USE_DEVICE_AEC and CONFIG_USE_SERVER_AEC cannot be enabled at the same time"
#elif CONFIG_USE_DEVICE_AEC
aec_mode_ = kAecOnDeviceSide;
#elif CONFIG_USE_SERVER_AEC
aec_mode_ = kAecOnServerSide;
#else
aec_mode_ = kAecOff;
#endif
esp_timer_create_args_t clock_timer_args = {
.callback = [](void* arg) {
Application* app = (Application*)arg;
xEventGroupSetBits(app->event_group_, MAIN_EVENT_CLOCK_TICK);
},
.arg = this,
.dispatch_method = ESP_TIMER_TASK,
.name = "clock_timer",
.skip_unhandled_events = true
};
esp_timer_create(&clock_timer_args, &clock_timer_handle_);
}
Application::~Application() {
if (clock_timer_handle_ != nullptr) {
esp_timer_stop(clock_timer_handle_);
esp_timer_delete(clock_timer_handle_);
}
vEventGroupDelete(event_group_);
}
bool Application::SetDeviceState(DeviceState state) {
return state_machine_.TransitionTo(state);
}
void Application::Initialize() {
auto& board = Board::GetInstance();
SetDeviceState(kDeviceStateStarting);
// Setup the display
auto display = board.GetDisplay();
display->SetupUI();
// Print board name/version info
display->SetChatMessage("system", SystemInfo::GetUserAgent().c_str());
// Setup the audio service
auto codec = board.GetAudioCodec();
audio_service_.Initialize(codec);
audio_service_.Start();
AudioServiceCallbacks callbacks;
callbacks.on_send_queue_available = [this]() {
xEventGroupSetBits(event_group_, MAIN_EVENT_SEND_AUDIO);
};
callbacks.on_wake_word_detected = [this](const std::string& wake_word) {
xEventGroupSetBits(event_group_, MAIN_EVENT_WAKE_WORD_DETECTED);
};
callbacks.on_vad_change = [this](bool speaking) {
xEventGroupSetBits(event_group_, MAIN_EVENT_VAD_CHANGE);
};
audio_service_.SetCallbacks(callbacks);
// Add state change listeners
state_machine_.AddStateChangeListener([this](DeviceState old_state, DeviceState new_state) {
xEventGroupSetBits(event_group_, MAIN_EVENT_STATE_CHANGED);
});
// Start the clock timer to update the status bar
esp_timer_start_periodic(clock_timer_handle_, 1000000);
// Add MCP common tools (only once during initialization)
auto& mcp_server = McpServer::GetInstance();
mcp_server.AddCommonTools();
mcp_server.AddUserOnlyTools();
// Set network event callback for UI updates and network state handling
board.SetNetworkEventCallback([this](NetworkEvent event, const std::string& data) {
auto display = Board::GetInstance().GetDisplay();
switch (event) {
case NetworkEvent::Scanning:
display->ShowNotification(Lang::Strings::SCANNING_WIFI, 30000);
xEventGroupSetBits(event_group_, MAIN_EVENT_NETWORK_DISCONNECTED);
break;
case NetworkEvent::Connecting: {
if (data.empty()) {
// Cellular network - registering without carrier info yet
display->SetStatus(Lang::Strings::REGISTERING_NETWORK);
} else {
// WiFi or cellular with carrier info
std::string msg = Lang::Strings::CONNECT_TO;
msg += data;
msg += "...";
display->ShowNotification(msg.c_str(), 30000);
}
break;
}
case NetworkEvent::Connected: {
std::string msg = Lang::Strings::CONNECTED_TO;
msg += data;
display->ShowNotification(msg.c_str(), 30000);
xEventGroupSetBits(event_group_, MAIN_EVENT_NETWORK_CONNECTED);
break;
}
case NetworkEvent::Disconnected:
xEventGroupSetBits(event_group_, MAIN_EVENT_NETWORK_DISCONNECTED);
break;
case NetworkEvent::WifiConfigModeEnter:
// WiFi config mode enter is handled by WifiBoard internally
break;
case NetworkEvent::WifiConfigModeExit:
// WiFi config mode exit is handled by WifiBoard internally
break;
// Cellular modem specific events
case NetworkEvent::ModemDetecting:
display->SetStatus(Lang::Strings::DETECTING_MODULE);
break;
case NetworkEvent::ModemErrorNoSim:
Alert(Lang::Strings::ERROR, Lang::Strings::PIN_ERROR, "triangle_exclamation", Lang::Sounds::OGG_ERR_PIN);
break;
case NetworkEvent::ModemErrorRegDenied:
Alert(Lang::Strings::ERROR, Lang::Strings::REG_ERROR, "triangle_exclamation", Lang::Sounds::OGG_ERR_REG);
break;
case NetworkEvent::ModemErrorInitFailed:
Alert(Lang::Strings::ERROR, Lang::Strings::MODEM_INIT_ERROR, "triangle_exclamation", Lang::Sounds::OGG_EXCLAMATION);
break;
case NetworkEvent::ModemErrorTimeout:
display->SetStatus(Lang::Strings::REGISTERING_NETWORK);
break;
}
});
// Start network asynchronously
board.StartNetwork();
// Update the status bar immediately to show the network state
display->UpdateStatusBar(true);
}
void Application::Run() {
// Set the priority of the main task to 10
vTaskPrioritySet(nullptr, 10);
const EventBits_t ALL_EVENTS =
MAIN_EVENT_SCHEDULE |
MAIN_EVENT_SEND_AUDIO |
MAIN_EVENT_WAKE_WORD_DETECTED |
MAIN_EVENT_VAD_CHANGE |
MAIN_EVENT_CLOCK_TICK |
MAIN_EVENT_ERROR |
MAIN_EVENT_NETWORK_CONNECTED |
MAIN_EVENT_NETWORK_DISCONNECTED |
MAIN_EVENT_TOGGLE_CHAT |
MAIN_EVENT_START_LISTENING |
MAIN_EVENT_STOP_LISTENING |
MAIN_EVENT_ACTIVATION_DONE |
MAIN_EVENT_STATE_CHANGED;
while (true) {
auto bits = xEventGroupWaitBits(event_group_, ALL_EVENTS, pdTRUE, pdFALSE, portMAX_DELAY);
if (bits & MAIN_EVENT_ERROR) {
SetDeviceState(kDeviceStateIdle);
Alert(Lang::Strings::ERROR, last_error_message_.c_str(), "circle_xmark", Lang::Sounds::OGG_EXCLAMATION);
}
if (bits & MAIN_EVENT_NETWORK_CONNECTED) {
HandleNetworkConnectedEvent();
}
if (bits & MAIN_EVENT_NETWORK_DISCONNECTED) {
HandleNetworkDisconnectedEvent();
}
if (bits & MAIN_EVENT_ACTIVATION_DONE) {
HandleActivationDoneEvent();
}
if (bits & MAIN_EVENT_STATE_CHANGED) {
HandleStateChangedEvent();
}
if (bits & MAIN_EVENT_TOGGLE_CHAT) {
HandleToggleChatEvent();
}
if (bits & MAIN_EVENT_START_LISTENING) {
HandleStartListeningEvent();
}
if (bits & MAIN_EVENT_STOP_LISTENING) {
HandleStopListeningEvent();
}
if (bits & MAIN_EVENT_SEND_AUDIO) {
while (auto packet = audio_service_.PopPacketFromSendQueue()) {
if (protocol_ && !protocol_->SendAudio(std::move(packet))) {
break;
}
}
}
if (bits & MAIN_EVENT_WAKE_WORD_DETECTED) {
HandleWakeWordDetectedEvent();
}
if (bits & MAIN_EVENT_VAD_CHANGE) {
if (GetDeviceState() == kDeviceStateListening) {
auto led = Board::GetInstance().GetLed();
led->OnStateChanged();
}
}
if (bits & MAIN_EVENT_SCHEDULE) {
std::unique_lock<std::mutex> lock(mutex_);
auto tasks = std::move(main_tasks_);
lock.unlock();
for (auto& task : tasks) {
task();
}
}
if (bits & MAIN_EVENT_CLOCK_TICK) {
clock_ticks_++;
auto display = Board::GetInstance().GetDisplay();
display->UpdateStatusBar();
// Print debug info every 10 seconds
if (clock_ticks_ % 10 == 0) {
SystemInfo::PrintHeapStats();
}
}
}
}
void Application::HandleNetworkConnectedEvent() {
ESP_LOGI(TAG, "Network connected");
auto state = GetDeviceState();
if (state == kDeviceStateStarting || state == kDeviceStateWifiConfiguring) {
// Network is ready, start activation
SetDeviceState(kDeviceStateActivating);
if (activation_task_handle_ != nullptr) {
ESP_LOGW(TAG, "Activation task already running");
return;
}
xTaskCreate([](void* arg) {
Application* app = static_cast<Application*>(arg);
app->ActivationTask();
app->activation_task_handle_ = nullptr;
vTaskDelete(NULL);
}, "activation", 4096 * 2, this, 2, &activation_task_handle_);
}
// Update the status bar immediately to show the network state
auto display = Board::GetInstance().GetDisplay();
display->UpdateStatusBar(true);
}
void Application::HandleNetworkDisconnectedEvent() {
// Close current conversation when network disconnected
auto state = GetDeviceState();
if (state == kDeviceStateConnecting || state == kDeviceStateListening || state == kDeviceStateSpeaking) {
ESP_LOGI(TAG, "Closing audio channel due to network disconnection");
protocol_->CloseAudioChannel();
}
// Update the status bar immediately to show the network state
auto display = Board::GetInstance().GetDisplay();
display->UpdateStatusBar(true);
}
void Application::HandleActivationDoneEvent() {
ESP_LOGI(TAG, "Activation done");
SystemInfo::PrintHeapStats();
SetDeviceState(kDeviceStateIdle);
has_server_time_ = ota_->HasServerTime();
auto display = Board::GetInstance().GetDisplay();
std::string message = std::string(Lang::Strings::VERSION) + ota_->GetCurrentVersion();
display->ShowNotification(message.c_str());
display->SetChatMessage("system", "");
// Release OTA object after activation is complete
ota_.reset();
auto& board = Board::GetInstance();
board.SetPowerSaveLevel(PowerSaveLevel::LOW_POWER);
Schedule([this]() {
// Play the success sound to indicate the device is ready
audio_service_.PlaySound(Lang::Sounds::OGG_SUCCESS);
});
}
void Application::ActivationTask() {
// Create OTA object for activation process
ota_ = std::make_unique<Ota>();
// Check for new assets version
CheckAssetsVersion();
// Check for new firmware version
CheckNewVersion();
// Initialize the protocol
InitializeProtocol();
// Signal completion to main loop
xEventGroupSetBits(event_group_, MAIN_EVENT_ACTIVATION_DONE);
}
void Application::CheckAssetsVersion() {
// Only allow CheckAssetsVersion to be called once
if (assets_version_checked_) {
return;
}
assets_version_checked_ = true;
auto& board = Board::GetInstance();
auto display = board.GetDisplay();
auto& assets = Assets::GetInstance();
if (!assets.partition_valid()) {
ESP_LOGW(TAG, "Assets partition is disabled for board %s", BOARD_NAME);
return;
}
Settings settings("assets", true);
// Check if there is a new assets need to be downloaded
std::string download_url = settings.GetString("download_url");
if (!download_url.empty()) {
settings.EraseKey("download_url");
char message[256];
snprintf(message, sizeof(message), Lang::Strings::FOUND_NEW_ASSETS, download_url.c_str());
Alert(Lang::Strings::LOADING_ASSETS, message, "cloud_arrow_down", Lang::Sounds::OGG_UPGRADE);
// Wait for the audio service to be idle for 3 seconds
vTaskDelay(pdMS_TO_TICKS(3000));
SetDeviceState(kDeviceStateUpgrading);
board.SetPowerSaveLevel(PowerSaveLevel::PERFORMANCE);
display->SetChatMessage("system", Lang::Strings::PLEASE_WAIT);
bool success = assets.Download(download_url, [this, display](int progress, size_t speed) -> void {
char buffer[32];
snprintf(buffer, sizeof(buffer), "%d%% %uKB/s", progress, speed / 1024);
Schedule([display, message = std::string(buffer)]() {
display->SetChatMessage("system", message.c_str());
});
});
board.SetPowerSaveLevel(PowerSaveLevel::LOW_POWER);
vTaskDelay(pdMS_TO_TICKS(1000));
if (!success) {
Alert(Lang::Strings::ERROR, Lang::Strings::DOWNLOAD_ASSETS_FAILED, "circle_xmark", Lang::Sounds::OGG_EXCLAMATION);
vTaskDelay(pdMS_TO_TICKS(2000));
SetDeviceState(kDeviceStateActivating);
return;
}
}
// Apply assets
assets.Apply();
display->SetChatMessage("system", "");
display->SetEmotion("microchip_ai");
}
void Application::CheckNewVersion() {
const int MAX_RETRY = 10;
int retry_count = 0;
int retry_delay = 10; // Initial retry delay in seconds
auto& board = Board::GetInstance();
while (true) {
auto display = board.GetDisplay();
display->SetStatus(Lang::Strings::CHECKING_NEW_VERSION);
esp_err_t err = ota_->CheckVersion();
if (err != ESP_OK) {
retry_count++;
if (retry_count >= MAX_RETRY) {
ESP_LOGE(TAG, "Too many retries, exit version check");
return;
}
char error_message[128];
snprintf(error_message, sizeof(error_message), "code=%d, url=%s", err, ota_->GetCheckVersionUrl().c_str());
char buffer[256];
snprintf(buffer, sizeof(buffer), Lang::Strings::CHECK_NEW_VERSION_FAILED, retry_delay, error_message);
Alert(Lang::Strings::ERROR, buffer, "cloud_slash", Lang::Sounds::OGG_EXCLAMATION);
ESP_LOGW(TAG, "Check new version failed, retry in %d seconds (%d/%d)", retry_delay, retry_count, MAX_RETRY);
for (int i = 0; i < retry_delay; i++) {
vTaskDelay(pdMS_TO_TICKS(1000));
if (GetDeviceState() == kDeviceStateIdle) {
break;
}
}
retry_delay *= 2; // Double the retry delay
continue;
}
retry_count = 0;
retry_delay = 10; // Reset retry delay
if (ota_->HasNewVersion()) {
if (UpgradeFirmware(ota_->GetFirmwareUrl(), ota_->GetFirmwareVersion())) {
return; // This line will never be reached after reboot
}
// If upgrade failed, continue to normal operation
}
// No new version, mark the current version as valid
ota_->MarkCurrentVersionValid();
if (!ota_->HasActivationCode() && !ota_->HasActivationChallenge()) {
// Exit the loop if done checking new version
break;
}
display->SetStatus(Lang::Strings::ACTIVATION);
// Activation code is shown to the user and waiting for the user to input
if (ota_->HasActivationCode()) {
ShowActivationCode(ota_->GetActivationCode(), ota_->GetActivationMessage());
}
// This will block the loop until the activation is done or timeout
for (int i = 0; i < 10; ++i) {
ESP_LOGI(TAG, "Activating... %d/%d", i + 1, 10);
esp_err_t err = ota_->Activate();
if (err == ESP_OK) {
break;
} else if (err == ESP_ERR_TIMEOUT) {
vTaskDelay(pdMS_TO_TICKS(3000));
} else {
vTaskDelay(pdMS_TO_TICKS(10000));
}
if (GetDeviceState() == kDeviceStateIdle) {
break;
}
}
}
}
void Application::InitializeProtocol() {
auto& board = Board::GetInstance();
auto display = board.GetDisplay();
auto codec = board.GetAudioCodec();
display->SetStatus(Lang::Strings::LOADING_PROTOCOL);
if (ota_->HasMqttConfig()) {
protocol_ = std::make_unique<MqttProtocol>();
} else if (ota_->HasWebsocketConfig()) {
protocol_ = std::make_unique<WebsocketProtocol>();
} else {
ESP_LOGW(TAG, "No protocol specified in the OTA config, using MQTT");
protocol_ = std::make_unique<MqttProtocol>();
}
protocol_->OnConnected([this]() {
DismissAlert();
});
protocol_->OnNetworkError([this](const std::string& message) {
last_error_message_ = message;
xEventGroupSetBits(event_group_, MAIN_EVENT_ERROR);
});
protocol_->OnIncomingAudio([this](std::unique_ptr<AudioStreamPacket> packet) {
if (GetDeviceState() == kDeviceStateSpeaking) {
audio_service_.PushPacketToDecodeQueue(std::move(packet));
}
});
protocol_->OnAudioChannelOpened([this, codec, &board]() {
board.SetPowerSaveLevel(PowerSaveLevel::PERFORMANCE);
if (protocol_->server_sample_rate() != codec->output_sample_rate()) {
ESP_LOGW(TAG, "Server sample rate %d does not match device output sample rate %d, resampling may cause distortion",
protocol_->server_sample_rate(), codec->output_sample_rate());
}
});
protocol_->OnAudioChannelClosed([this, &board]() {
board.SetPowerSaveLevel(PowerSaveLevel::LOW_POWER);
Schedule([this]() {
auto display = Board::GetInstance().GetDisplay();
display->SetChatMessage("system", "");
SetDeviceState(kDeviceStateIdle);
});
});
protocol_->OnIncomingJson([this, display](const cJSON* root) {
// Parse JSON data
auto type = cJSON_GetObjectItem(root, "type");
if (strcmp(type->valuestring, "tts") == 0) {
auto state = cJSON_GetObjectItem(root, "state");
if (strcmp(state->valuestring, "start") == 0) {
Schedule([this]() {
aborted_ = false;
SetDeviceState(kDeviceStateSpeaking);
});
} else if (strcmp(state->valuestring, "stop") == 0) {
Schedule([this]() {
if (GetDeviceState() == kDeviceStateSpeaking) {
if (listening_mode_ == kListeningModeManualStop) {
SetDeviceState(kDeviceStateIdle);
} else {
SetDeviceState(kDeviceStateListening);
}
}
});
} else if (strcmp(state->valuestring, "sentence_start") == 0) {
auto text = cJSON_GetObjectItem(root, "text");
if (cJSON_IsString(text)) {
ESP_LOGI(TAG, "<< %s", text->valuestring);
Schedule([display, message = std::string(text->valuestring)]() {
display->SetChatMessage("assistant", message.c_str());
});
}
}
} else if (strcmp(type->valuestring, "stt") == 0) {
auto text = cJSON_GetObjectItem(root, "text");
if (cJSON_IsString(text)) {
ESP_LOGI(TAG, ">> %s", text->valuestring);
Schedule([display, message = std::string(text->valuestring)]() {
display->SetChatMessage("user", message.c_str());
});
}
} else if (strcmp(type->valuestring, "llm") == 0) {
auto emotion = cJSON_GetObjectItem(root, "emotion");
if (cJSON_IsString(emotion)) {
Schedule([display, emotion_str = std::string(emotion->valuestring)]() {
display->SetEmotion(emotion_str.c_str());
});
}
} else if (strcmp(type->valuestring, "mcp") == 0) {
auto payload = cJSON_GetObjectItem(root, "payload");
if (cJSON_IsObject(payload)) {
McpServer::GetInstance().ParseMessage(payload);
}
} else if (strcmp(type->valuestring, "system") == 0) {
auto command = cJSON_GetObjectItem(root, "command");
if (cJSON_IsString(command)) {
ESP_LOGI(TAG, "System command: %s", command->valuestring);
if (strcmp(command->valuestring, "reboot") == 0) {
// Do a reboot if user requests a OTA update
Schedule([this]() {
Reboot();
});
} else {
ESP_LOGW(TAG, "Unknown system command: %s", command->valuestring);
}
}
} else if (strcmp(type->valuestring, "alert") == 0) {
auto status = cJSON_GetObjectItem(root, "status");
auto message = cJSON_GetObjectItem(root, "message");
auto emotion = cJSON_GetObjectItem(root, "emotion");
if (cJSON_IsString(status) && cJSON_IsString(message) && cJSON_IsString(emotion)) {
Alert(status->valuestring, message->valuestring, emotion->valuestring, Lang::Sounds::OGG_VIBRATION);
} else {
ESP_LOGW(TAG, "Alert command requires status, message and emotion");
}
#if CONFIG_RECEIVE_CUSTOM_MESSAGE
} else if (strcmp(type->valuestring, "custom") == 0) {
auto payload = cJSON_GetObjectItem(root, "payload");
ESP_LOGI(TAG, "Received custom message: %s", cJSON_PrintUnformatted(root));
if (cJSON_IsObject(payload)) {
Schedule([this, display, payload_str = std::string(cJSON_PrintUnformatted(payload))]() {
display->SetChatMessage("system", payload_str.c_str());
});
} else {
ESP_LOGW(TAG, "Invalid custom message format: missing payload");
}
#endif
} else {
ESP_LOGW(TAG, "Unknown message type: %s", type->valuestring);
}
});
protocol_->Start();
}
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);
}
}
}
void Application::Alert(const char* status, const char* message, const char* emotion, const std::string_view& sound) {
ESP_LOGW(TAG, "Alert [%s] %s: %s", emotion, status, message);
auto display = Board::GetInstance().GetDisplay();
display->SetStatus(status);
display->SetEmotion(emotion);
display->SetChatMessage("system", message);
if (!sound.empty()) {
audio_service_.PlaySound(sound);
}
}
void Application::DismissAlert() {
if (GetDeviceState() == kDeviceStateIdle) {
auto display = Board::GetInstance().GetDisplay();
display->SetStatus(Lang::Strings::STANDBY);
display->SetEmotion("neutral");
display->SetChatMessage("system", "");
}
}
void Application::ToggleChatState() {
xEventGroupSetBits(event_group_, MAIN_EVENT_TOGGLE_CHAT);
}
void Application::StartListening() {
xEventGroupSetBits(event_group_, MAIN_EVENT_START_LISTENING);
}
void Application::StopListening() {
xEventGroupSetBits(event_group_, MAIN_EVENT_STOP_LISTENING);
}
void Application::HandleToggleChatEvent() {
auto state = GetDeviceState();
if (state == kDeviceStateActivating) {
SetDeviceState(kDeviceStateIdle);
return;
} else if (state == kDeviceStateWifiConfiguring) {
audio_service_.EnableAudioTesting(true);
SetDeviceState(kDeviceStateAudioTesting);
return;
} else if (state == kDeviceStateAudioTesting) {
audio_service_.EnableAudioTesting(false);
SetDeviceState(kDeviceStateWifiConfiguring);
return;
}
if (!protocol_) {
ESP_LOGE(TAG, "Protocol not initialized");
return;
}
if (state == kDeviceStateIdle) {
ListeningMode mode = GetDefaultListeningMode();
if (!protocol_->IsAudioChannelOpened()) {
SetDeviceState(kDeviceStateConnecting);
// Schedule to let the state change be processed first (UI update)
Schedule([this, mode]() {
ContinueOpenAudioChannel(mode);
});
return;
}
SetListeningMode(mode);
} else if (state == kDeviceStateSpeaking) {
AbortSpeaking(kAbortReasonNone);
} else if (state == kDeviceStateListening) {
protocol_->CloseAudioChannel();
}
}
void Application::ContinueOpenAudioChannel(ListeningMode mode) {
// Check state again in case it was changed during scheduling
if (GetDeviceState() != kDeviceStateConnecting) {
return;
}
if (!protocol_->IsAudioChannelOpened()) {
if (!protocol_->OpenAudioChannel()) {
return;
}
}
SetListeningMode(mode);
}
void Application::HandleStartListeningEvent() {
auto state = GetDeviceState();
if (state == kDeviceStateActivating) {
SetDeviceState(kDeviceStateIdle);
return;
} else if (state == kDeviceStateWifiConfiguring) {
audio_service_.EnableAudioTesting(true);
SetDeviceState(kDeviceStateAudioTesting);
return;
}
if (!protocol_) {
ESP_LOGE(TAG, "Protocol not initialized");
return;
}
if (state == kDeviceStateIdle) {
if (!protocol_->IsAudioChannelOpened()) {
SetDeviceState(kDeviceStateConnecting);
// Schedule to let the state change be processed first (UI update)
Schedule([this]() {
ContinueOpenAudioChannel(kListeningModeManualStop);
});
return;
}
SetListeningMode(kListeningModeManualStop);
} else if (state == kDeviceStateSpeaking) {
AbortSpeaking(kAbortReasonNone);
SetListeningMode(kListeningModeManualStop);
}
}
void Application::HandleStopListeningEvent() {
auto state = GetDeviceState();
if (state == kDeviceStateAudioTesting) {
audio_service_.EnableAudioTesting(false);
SetDeviceState(kDeviceStateWifiConfiguring);
return;
} else if (state == kDeviceStateListening) {
if (protocol_) {
protocol_->SendStopListening();
}
SetDeviceState(kDeviceStateIdle);
}
}
void Application::HandleWakeWordDetectedEvent() {
if (!protocol_) {
return;
}
auto state = GetDeviceState();
auto wake_word = audio_service_.GetLastWakeWord();
ESP_LOGI(TAG, "Wake word detected: %s (state: %d)", wake_word.c_str(), (int)state);
if (state == kDeviceStateIdle) {
audio_service_.EncodeWakeWord();
auto wake_word = audio_service_.GetLastWakeWord();
if (!protocol_->IsAudioChannelOpened()) {
SetDeviceState(kDeviceStateConnecting);
// Schedule to let the state change be processed first (UI update),
// then continue with OpenAudioChannel which may block for ~1 second
Schedule([this, wake_word]() {
ContinueWakeWordInvoke(wake_word);
});
return;
}
// Channel already opened, continue directly
ContinueWakeWordInvoke(wake_word);
} else if (state == kDeviceStateSpeaking || state == kDeviceStateListening) {
AbortSpeaking(kAbortReasonWakeWordDetected);
// Clear send queue to avoid sending residues to server
while (audio_service_.PopPacketFromSendQueue());
if (state == kDeviceStateListening) {
protocol_->SendStartListening(GetDefaultListeningMode());
audio_service_.ResetDecoder();
audio_service_.PlaySound(Lang::Sounds::OGG_POPUP);
// Re-enable wake word detection as it was stopped by the detection itself
audio_service_.EnableWakeWordDetection(true);
} else {
// Play popup sound and start listening again
play_popup_on_listening_ = true;
SetListeningMode(GetDefaultListeningMode());
}
} else if (state == kDeviceStateActivating) {
// Restart the activation check if the wake word is detected during activation
SetDeviceState(kDeviceStateIdle);
}
}
void Application::ContinueWakeWordInvoke(const std::string& wake_word) {
// Check state again in case it was changed during scheduling
if (GetDeviceState() != kDeviceStateConnecting) {
return;
}
if (!protocol_->IsAudioChannelOpened()) {
if (!protocol_->OpenAudioChannel()) {
audio_service_.EnableWakeWordDetection(true);
return;
}
}
ESP_LOGI(TAG, "Wake word detected: %s", wake_word.c_str());
#if CONFIG_SEND_WAKE_WORD_DATA
// Encode and send the wake word data to the server
while (auto packet = audio_service_.PopWakeWordPacket()) {
protocol_->SendAudio(std::move(packet));
}
// Set the chat state to wake word detected
protocol_->SendWakeWordDetected(wake_word);
// Set flag to play popup sound after state changes to listening
play_popup_on_listening_ = true;
SetListeningMode(GetDefaultListeningMode());
#else
// Set flag to play popup sound after state changes to listening
// (PlaySound here would be cleared by ResetDecoder in EnableVoiceProcessing)
play_popup_on_listening_ = true;
SetListeningMode(GetDefaultListeningMode());
#endif
}
void Application::HandleStateChangedEvent() {
DeviceState new_state = state_machine_.GetState();
clock_ticks_ = 0;
auto& board = Board::GetInstance();
auto display = board.GetDisplay();
auto led = board.GetLed();
led->OnStateChanged();
switch (new_state) {
case kDeviceStateUnknown:
case kDeviceStateIdle:
display->SetStatus(Lang::Strings::STANDBY);
display->ClearChatMessages(); // Clear messages first
display->SetEmotion("neutral"); // Then set emotion (wechat mode checks child count)
audio_service_.EnableVoiceProcessing(false);
audio_service_.EnableWakeWordDetection(true);
break;
case kDeviceStateConnecting:
display->SetStatus(Lang::Strings::CONNECTING);
display->SetEmotion("neutral");
display->SetChatMessage("system", "");
break;
case kDeviceStateListening:
display->SetStatus(Lang::Strings::LISTENING);
display->SetEmotion("neutral");
// Make sure the audio processor is running
if (play_popup_on_listening_ || !audio_service_.IsAudioProcessorRunning()) {
// For auto mode, wait for playback queue to be empty before enabling voice processing
// This prevents audio truncation when STOP arrives late due to network jitter
if (listening_mode_ == kListeningModeAutoStop) {
audio_service_.WaitForPlaybackQueueEmpty();
}
// Send the start listening command
protocol_->SendStartListening(listening_mode_);
audio_service_.EnableVoiceProcessing(true);
}
#ifdef CONFIG_WAKE_WORD_DETECTION_IN_LISTENING
// Enable wake word detection in listening mode (configured via Kconfig)
audio_service_.EnableWakeWordDetection(audio_service_.IsAfeWakeWord());
#else
// Disable wake word detection in
gitextract_bwja74tq/ ├── .clang-format ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── 01_build_install_bug.yml │ │ ├── 02_runtime_bug.yml │ │ ├── 03_feature_request.yml │ │ └── config.yml │ └── workflows/ │ └── build.yml ├── .gitignore ├── CMakeLists.txt ├── LICENSE ├── README.md ├── README_ja.md ├── README_zh.md ├── docs/ │ ├── blufi.md │ ├── code_style.md │ ├── custom-board.md │ ├── mcp-protocol.md │ ├── mcp-usage.md │ ├── mqtt-udp.md │ └── websocket.md ├── main/ │ ├── CMakeLists.txt │ ├── Kconfig.projbuild │ ├── application.cc │ ├── application.h │ ├── assets/ │ │ ├── common/ │ │ │ ├── exclamation.ogg │ │ │ ├── low_battery.ogg │ │ │ ├── popup.ogg │ │ │ ├── success.ogg │ │ │ └── vibration.ogg │ │ └── locales/ │ │ ├── ar-SA/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── bg-BG/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── ca-ES/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── cs-CZ/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── da-DK/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── de-DE/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── el-GR/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── en-US/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── es-ES/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── fa-IR/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── fi-FI/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── fil-PH/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── fr-FR/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── he-IL/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── hi-IN/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── hr-HR/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── hu-HU/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── id-ID/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── it-IT/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── ja-JP/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── ko-KR/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── ms-MY/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── nb-NO/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── nl-NL/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── pl-PL/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── pt-PT/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── ro-RO/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── ru-RU/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── sk-SK/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── sl-SI/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── sr-RS/ │ │ │ └── language.json │ │ ├── sv-SE/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── th-TH/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── tr-TR/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── uk-UA/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── vi-VN/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ ├── zh-CN/ │ │ │ ├── 0.ogg │ │ │ ├── 1.ogg │ │ │ ├── 2.ogg │ │ │ ├── 3.ogg │ │ │ ├── 4.ogg │ │ │ ├── 5.ogg │ │ │ ├── 6.ogg │ │ │ ├── 7.ogg │ │ │ ├── 8.ogg │ │ │ ├── 9.ogg │ │ │ ├── activation.ogg │ │ │ ├── err_pin.ogg │ │ │ ├── err_reg.ogg │ │ │ ├── language.json │ │ │ ├── upgrade.ogg │ │ │ ├── welcome.ogg │ │ │ └── wificonfig.ogg │ │ └── zh-TW/ │ │ ├── 0.ogg │ │ ├── 1.ogg │ │ ├── 2.ogg │ │ ├── 3.ogg │ │ ├── 4.ogg │ │ ├── 5.ogg │ │ ├── 6.ogg │ │ ├── 7.ogg │ │ ├── 8.ogg │ │ ├── 9.ogg │ │ ├── activation.ogg │ │ ├── err_pin.ogg │ │ ├── err_reg.ogg │ │ ├── language.json │ │ ├── upgrade.ogg │ │ ├── welcome.ogg │ │ └── wificonfig.ogg │ ├── assets.cc │ ├── assets.h │ ├── audio/ │ │ ├── README.md │ │ ├── audio_codec.cc │ │ ├── audio_codec.h │ │ ├── audio_processor.h │ │ ├── audio_service.cc │ │ ├── audio_service.h │ │ ├── codecs/ │ │ │ ├── box_audio_codec.cc │ │ │ ├── box_audio_codec.h │ │ │ ├── dummy_audio_codec.cc │ │ │ ├── dummy_audio_codec.h │ │ │ ├── es8311_audio_codec.cc │ │ │ ├── es8311_audio_codec.h │ │ │ ├── es8374_audio_codec.cc │ │ │ ├── es8374_audio_codec.h │ │ │ ├── es8388_audio_codec.cc │ │ │ ├── es8388_audio_codec.h │ │ │ ├── es8389_audio_codec.cc │ │ │ ├── es8389_audio_codec.h │ │ │ ├── no_audio_codec.cc │ │ │ └── no_audio_codec.h │ │ ├── demuxer/ │ │ │ ├── ogg_demuxer.cc │ │ │ └── ogg_demuxer.h │ │ ├── processors/ │ │ │ ├── afe_audio_processor.cc │ │ │ ├── afe_audio_processor.h │ │ │ ├── audio_debugger.cc │ │ │ ├── audio_debugger.h │ │ │ ├── no_audio_processor.cc │ │ │ └── no_audio_processor.h │ │ ├── wake_word.h │ │ └── wake_words/ │ │ ├── afe_wake_word.cc │ │ ├── afe_wake_word.h │ │ ├── custom_wake_word.cc │ │ ├── custom_wake_word.h │ │ ├── esp_wake_word.cc │ │ └── esp_wake_word.h │ ├── boards/ │ │ ├── aipi-lite/ │ │ │ ├── README.md │ │ │ ├── README_en.md │ │ │ ├── aipi-lite.cc │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── config_en.json │ │ │ └── power_manager.h │ │ ├── atk-dnesp32s3/ │ │ │ ├── atk_dnesp32s3.cc │ │ │ ├── config.h │ │ │ └── config.json │ │ ├── atk-dnesp32s3-box/ │ │ │ ├── atk_dnesp32s3_box.cc │ │ │ ├── config.h │ │ │ └── config.json │ │ ├── atk-dnesp32s3-box0/ │ │ │ ├── atk_dnesp32s3_box0.cc │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── power_manager.h │ │ ├── atk-dnesp32s3-box2-4g/ │ │ │ ├── atk_dnesp32s3_box2.cc │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── power_manager.h │ │ ├── atk-dnesp32s3-box2-wifi/ │ │ │ ├── atk_dnesp32s3_box2.cc │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── power_manager.h │ │ ├── atk-dnesp32s3m-4g/ │ │ │ ├── atk_dnesp32s3m.cc │ │ │ └── config.h │ │ ├── atk-dnesp32s3m-wifi/ │ │ │ ├── atk_dnesp32s3m.cc │ │ │ └── config.h │ │ ├── atom-echos3r/ │ │ │ ├── README.md │ │ │ ├── atom_echos3r.cc │ │ │ ├── config.h │ │ │ └── config.json │ │ ├── atommatrix-echo-base/ │ │ │ ├── README.md │ │ │ ├── atommatrix_echo_base.cc │ │ │ ├── config.h │ │ │ └── config.json │ │ ├── atoms3-echo-base/ │ │ │ ├── README.md │ │ │ ├── atoms3_echo_base.cc │ │ │ ├── config.h │ │ │ └── config.json │ │ ├── atoms3r-cam-m12-echo-base/ │ │ │ ├── README.md │ │ │ ├── atoms3r_cam_m12_echo_base.cc │ │ │ ├── config.h │ │ │ └── config.json │ │ ├── atoms3r-echo-base/ │ │ │ ├── README.md │ │ │ ├── atoms3r_echo_base.cc │ │ │ ├── config.h │ │ │ └── config.json │ │ ├── bread-compact-esp32/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── esp32_bread_board.cc │ │ ├── bread-compact-esp32-lcd/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── esp32_bread_board_lcd.cc │ │ ├── bread-compact-ml307/ │ │ │ ├── compact_ml307_board.cc │ │ │ ├── config.h │ │ │ └── config.json │ │ ├── bread-compact-nt26/ │ │ │ ├── compact_nt26_board.cc │ │ │ ├── config.h │ │ │ └── config.json │ │ ├── bread-compact-wifi/ │ │ │ ├── compact_wifi_board.cc │ │ │ ├── config.h │ │ │ └── config.json │ │ ├── bread-compact-wifi-lcd/ │ │ │ ├── compact_wifi_board_lcd.cc │ │ │ └── config.h │ │ ├── bread-compact-wifi-s3cam/ │ │ │ ├── README.md │ │ │ ├── compact_wifi_board_s3cam.cc │ │ │ └── config.h │ │ ├── common/ │ │ │ ├── adc_battery_monitor.cc │ │ │ ├── adc_battery_monitor.h │ │ │ ├── afsk_demod.cc │ │ │ ├── afsk_demod.h │ │ │ ├── axp2101.cc │ │ │ ├── axp2101.h │ │ │ ├── backlight.cc │ │ │ ├── backlight.h │ │ │ ├── blufi.cpp │ │ │ ├── blufi.h │ │ │ ├── board.cc │ │ │ ├── board.h │ │ │ ├── button.cc │ │ │ ├── button.h │ │ │ ├── camera.h │ │ │ ├── dual_network_board.cc │ │ │ ├── dual_network_board.h │ │ │ ├── esp32_camera.cc │ │ │ ├── esp32_camera.h │ │ │ ├── esp_video.cc │ │ │ ├── esp_video.h │ │ │ ├── i2c_device.cc │ │ │ ├── i2c_device.h │ │ │ ├── knob.cc │ │ │ ├── knob.h │ │ │ ├── lamp_controller.h │ │ │ ├── ml307_board.cc │ │ │ ├── ml307_board.h │ │ │ ├── nt26_board.cc │ │ │ ├── nt26_board.h │ │ │ ├── power_save_timer.cc │ │ │ ├── power_save_timer.h │ │ │ ├── press_to_talk_mcp_tool.cc │ │ │ ├── press_to_talk_mcp_tool.h │ │ │ ├── rndis_board.cc │ │ │ ├── rndis_board.h │ │ │ ├── sleep_timer.cc │ │ │ ├── sleep_timer.h │ │ │ ├── sy6970.cc │ │ │ ├── sy6970.h │ │ │ ├── system_reset.cc │ │ │ ├── system_reset.h │ │ │ ├── wifi_board.cc │ │ │ └── wifi_board.h │ │ ├── df-k10/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── df_k10_board.cc │ │ │ ├── k10_audio_codec.cc │ │ │ ├── k10_audio_codec.h │ │ │ ├── led_control.cc │ │ │ └── led_control.h │ │ ├── df-s3-ai-cam/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── df_s3_ai_cam.cc │ │ ├── doit-s3-aibox/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── doit_s3_aibox.cc │ │ ├── du-chatx/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── du-chatx-wifi.cc │ │ │ └── power_manager.h │ │ ├── electron-bot/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── electron_bot.cc │ │ │ ├── electron_bot_controller.cc │ │ │ ├── electron_emoji_display.cc │ │ │ ├── electron_emoji_display.h │ │ │ ├── movements.cc │ │ │ ├── movements.h │ │ │ ├── oscillator.cc │ │ │ ├── oscillator.h │ │ │ ├── otto_icon_font.c │ │ │ └── power_manager.h │ │ ├── esp-box/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── esp_box_board.cc │ │ ├── esp-box-3/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── esp_box3_board.cc │ │ ├── esp-box-lite/ │ │ │ ├── box_audio_codec_lite.cc │ │ │ ├── box_audio_codec_lite.h │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── esp_box_lite_board.cc │ │ ├── esp-hi/ │ │ │ ├── README.md │ │ │ ├── adc_pdm_audio_codec.cc │ │ │ ├── adc_pdm_audio_codec.h │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── emoji_display.cc │ │ │ ├── emoji_display.h │ │ │ └── esp_hi.cc │ │ ├── esp-p4-function-ev-board/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── esp-p4-function-ev-board.cc │ │ ├── esp-s3-lcd-ev-board/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── esp-s3-lcd-ev-board.cc │ │ │ ├── esp_io_expander_tca9554.c │ │ │ ├── esp_io_expander_tca9554.h │ │ │ ├── esp_lcd_gc9503.c │ │ │ ├── esp_lcd_gc9503.h │ │ │ └── pin_config.h │ │ ├── esp-s3-lcd-ev-board-2/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── esp-s3-lcd-ev-board-2.cc │ │ │ ├── esp_lcd_gc9503.c │ │ │ ├── esp_lcd_gc9503.h │ │ │ └── pin_config.h │ │ ├── esp-sensairshuttle/ │ │ │ ├── README.md │ │ │ ├── adc_pdm_audio_codec.cc │ │ │ ├── adc_pdm_audio_codec.h │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── esp-sensairshuttle.cc │ │ ├── esp-sparkbot/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── esp_sparkbot_board.cc │ │ ├── esp-spot/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── esp_spot_board.cc │ │ ├── esp-vocat/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── esp_vocat.cc │ │ │ └── touch.h │ │ ├── esp32-cgc/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── esp32_cgc_board.cc │ │ ├── esp32-cgc-144/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── esp32_cgc_144_board.cc │ │ │ ├── power_manager.h │ │ │ └── power_manager_lite.h │ │ ├── esp32s3-korvo2-v3/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── esp32s3_korvo2_v3_board.cc │ │ │ └── power_manager.h │ │ ├── esp32s3-korvo2-v3-rndis/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── esp32s3_korvo2_v3_board.cc │ │ │ └── power_manager.h │ │ ├── genjutech-s3-1.54tft/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── genjutech-s3-1.54tft.cc │ │ │ └── power_manager.h │ │ ├── hu-087/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── hu_087_board.cc │ │ ├── jiuchuan-s3/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── esp_lcd_panel_gc9301.c │ │ │ ├── esp_lcd_panel_gc9301.h │ │ │ ├── gpio_manager.h │ │ │ ├── jiuchuan_dev_board.cc │ │ │ ├── power_controller.h │ │ │ └── power_manager.h │ │ ├── kevin-box-2/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── kevin_box_board.cc │ │ ├── kevin-c3/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── kevin_c3_board.cc │ │ │ ├── led_strip_control.cc │ │ │ └── led_strip_control.h │ │ ├── kevin-sp-v3-dev/ │ │ │ ├── config.h │ │ │ └── kevin-sp-v3_board.cc │ │ ├── kevin-sp-v4-dev/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── kevin-sp-v4_board.cc │ │ ├── kevin-yuying-313lcd/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── esp_lcd_gc9503.c │ │ │ ├── esp_lcd_gc9503.h │ │ │ ├── kevin_yuying_313lcd.cc │ │ │ └── pin_config.h │ │ ├── labplus-ledong-v2/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── labplus_ledong_v2.cc │ │ ├── labplus-mpython-v3/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── mpython_pro.cc │ │ ├── lceda-course-examples/ │ │ │ ├── eda-robot-pro/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── eda_dog_controller.cc │ │ │ │ ├── eda_dog_movements.cc │ │ │ │ ├── eda_dog_movements.h │ │ │ │ ├── eda_robot_pro.cc │ │ │ │ ├── oscillator.cc │ │ │ │ └── oscillator.h │ │ │ ├── eda-super-bear/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── eda_super_bear.cc │ │ │ │ ├── eda_super_bear_controller.cc │ │ │ │ ├── eda_super_bear_movements.cc │ │ │ │ ├── eda_super_bear_movements.h │ │ │ │ ├── oscillator.cc │ │ │ │ └── oscillator.h │ │ │ └── eda-tv-pro/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── eda-tv-pro.cc │ │ ├── lichuang-c3-dev/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── lichuang_c3_dev_board.cc │ │ ├── lichuang-dev/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── lichuang_dev_board.cc │ │ ├── lilygo-t-cameraplus-s3/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── ir_filter_controller.h │ │ │ ├── lilygo-t-cameraplus-s3.cc │ │ │ ├── pin_config.h │ │ │ ├── tcamerapluss3_audio_codec.cc │ │ │ └── tcamerapluss3_audio_codec.h │ │ ├── lilygo-t-circle-s3/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── esp_lcd_gc9d01n.c │ │ │ ├── esp_lcd_gc9d01n.h │ │ │ ├── lilygo-t-circle-s3.cc │ │ │ ├── pin_config.h │ │ │ ├── tcircles3_audio_codec.cc │ │ │ └── tcircles3_audio_codec.h │ │ ├── lilygo-t-display-p4/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── hi8561_driver.cc │ │ │ ├── hi8561_driver.h │ │ │ ├── lilygo-t-display-p4.cc │ │ │ ├── rm69a10_driver.cc │ │ │ ├── rm69a10_driver.h │ │ │ └── t_display_p4_config.h │ │ ├── lilygo-t-display-s3-pro-mvsrlora/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── lilygo-t-display-s3-pro-mvsrlora.cc │ │ │ ├── pin_config.h │ │ │ ├── tdisplays3promvsrlora_audio_codec.cc │ │ │ └── tdisplays3promvsrlora_audio_codec.h │ │ ├── m5stack-cardputer-adv/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── m5stack_cardputer_adv.cc │ │ ├── m5stack-core-s3/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── cores3_audio_codec.cc │ │ │ ├── cores3_audio_codec.h │ │ │ └── m5stack_core_s3.cc │ │ ├── m5stack-tab5/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── esp_lcd_st7123.c │ │ │ ├── esp_lcd_st7123.h │ │ │ ├── m5stack_tab5.cc │ │ │ ├── sdkconfig.tab5 │ │ │ ├── tab5_audio_codec.cc │ │ │ └── tab5_audio_codec.h │ │ ├── magiclick-2p4/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── magiclick_2p4_board.cc │ │ ├── magiclick-2p5/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── magiclick_2p5_board.cc │ │ │ └── power_manager.h │ │ ├── magiclick-c3/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── magiclick_c3_board.cc │ │ ├── magiclick-c3-v2/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── magiclick_c3_v2_board.cc │ │ ├── minsi-k08-dual/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── minsi_k08_dual.cc │ │ │ └── power_manager.h │ │ ├── mixgo-nova/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── mixgo-nova.cc │ │ ├── movecall-cuican-esp32s3/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── movecall_cuican_esp32s3.cc │ │ ├── movecall-moji-esp32s3/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── movecall_moji_esp32s3.cc │ │ ├── movecall-moji2-esp32c5/ │ │ │ ├── README.md │ │ │ ├── README_zh.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── movecall_moji2_esp32s3.cc │ │ ├── otto-robot/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── oscillator.cc │ │ │ ├── oscillator.h │ │ │ ├── otto_controller.cc │ │ │ ├── otto_emoji_display.cc │ │ │ ├── otto_emoji_display.h │ │ │ ├── otto_icon_font.c │ │ │ ├── otto_movements.cc │ │ │ ├── otto_movements.h │ │ │ ├── otto_robot.cc │ │ │ ├── power_manager.h │ │ │ ├── websocket_control_server.cc │ │ │ └── websocket_control_server.h │ │ ├── sensecap-watcher/ │ │ │ ├── README.md │ │ │ ├── README_en.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── config_en.json │ │ │ ├── sensecap_audio_codec.cc │ │ │ ├── sensecap_audio_codec.h │ │ │ ├── sensecap_watcher.cc │ │ │ ├── sscma_camera.cc │ │ │ └── sscma_camera.h │ │ ├── sp-esp32-s3-1.28-box/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── power_manager.h │ │ │ └── sp-esp32-s3-1.28-box.cc │ │ ├── sp-esp32-s3-1.54-muma/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── power_manager.h │ │ │ └── sp-esp32-s3-1.54-muma.cc │ │ ├── surfer-c3-1.14tft/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── power_manager.h │ │ │ └── surfer-c3-1.14tft.cc │ │ ├── taiji-pi-s3/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── taiji_pi_s3.cc │ │ ├── tudouzi/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── kevin_box_board.cc │ │ ├── waveshare/ │ │ │ ├── esp32-c6-lcd-1.69/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── esp32-c6-lcd-1.69.cc │ │ │ │ └── power_manager.h │ │ │ ├── esp32-c6-touch-amoled-1.32/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-c6-touch-amoled-1.32.cc │ │ │ ├── esp32-c6-touch-amoled-1.43/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-c6-touch-amoled-1.43.cc │ │ │ ├── esp32-c6-touch-amoled-1.8/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-c6-touch-amoled-1.8.cc │ │ │ ├── esp32-c6-touch-amoled-2.06/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-c6-touch-amoled-2.06.cc │ │ │ ├── esp32-c6-touch-lcd-1.83/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-c6-touch-lcd-1.83.cc │ │ │ ├── esp32-p4-nano/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── esp32-p4-nano.cc │ │ │ │ └── lcd_init_cmds.h │ │ │ ├── esp32-p4-wifi6-touch-lcd/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── esp32-p4-wifi6-touch-lcd.cc │ │ │ │ └── lcd_init_cmds.h │ │ │ ├── esp32-s3-audio-board/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── esp32-s3-audio_board.cc │ │ │ │ ├── esp_lcd_jd9853.c │ │ │ │ └── esp_lcd_jd9853.h │ │ │ ├── esp32-s3-epaper-1.54/ │ │ │ │ ├── README.md │ │ │ │ ├── board_power_bsp.cc │ │ │ │ ├── board_power_bsp.h │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── custom_lcd_display.cc │ │ │ │ ├── custom_lcd_display.h │ │ │ │ └── waveshare-s3-epaper-1.54.cc │ │ │ ├── esp32-s3-epaper-3.97/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── custom_lcd_display.cc │ │ │ │ ├── custom_lcd_display.h │ │ │ │ └── waveshare-s3-epaper-3.97.cc │ │ │ ├── esp32-s3-rlcd-4.2/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── custom_lcd_display.cc │ │ │ │ ├── custom_lcd_display.h │ │ │ │ └── waveshare-s3-rlcd-4.2.cc │ │ │ ├── esp32-s3-touch-amoled-1.32/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-s3-touch-amoled-1.32.cc │ │ │ ├── esp32-s3-touch-amoled-1.75/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-s3-touch-amoled-1.75.cc │ │ │ ├── esp32-s3-touch-amoled-1.8/ │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-s3-touch-amoled-1.8.cc │ │ │ ├── esp32-s3-touch-amoled-2.06/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-s3-touch-amoled-2.06.cc │ │ │ ├── esp32-s3-touch-lcd-1.46/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-s3-touch-lcd-1.46.cc │ │ │ ├── esp32-s3-touch-lcd-1.83/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-s3-touch-lcd-1.83.cc │ │ │ ├── esp32-s3-touch-lcd-1.85/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-s3-touch-lcd-1.85.cc │ │ │ ├── esp32-s3-touch-lcd-1.85c/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-s3-touch-lcd-1.85c.cc │ │ │ ├── esp32-s3-touch-lcd-3.49/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── custom_lcd_display.cc │ │ │ │ ├── custom_lcd_display.h │ │ │ │ └── waveshare-s3-touch-lcd-3.49.cc │ │ │ ├── esp32-s3-touch-lcd-3.5/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-s3-touch-lcd-3.5.cc │ │ │ ├── esp32-s3-touch-lcd-3.5b/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── custom_lcd_display.cc │ │ │ │ ├── custom_lcd_display.h │ │ │ │ └── waveshare-s3-touch-lcd-3.5b.cc │ │ │ ├── esp32-s3-touch-lcd-4.3c/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ ├── esp32_s3_touch_lcd_4.3c.cc │ │ │ │ └── sdkconfig.4_3c │ │ │ ├── esp32-s3-touch-lcd-4b/ │ │ │ │ ├── README.md │ │ │ │ ├── config.h │ │ │ │ ├── config.json │ │ │ │ └── esp32-s3-touch-lcd-4b.cc │ │ │ └── esp32-touch-lcd-3.5/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── esp32-touch-lcd-3.5.cc │ │ ├── wireless-tag-wtp4c5mp07s/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── wireless-tag-wtp4c5mp07s.cc │ │ ├── xingzhi-abs-2.0/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── customlcddisplay.h │ │ │ ├── power_manager.h │ │ │ └── xingzhi-abs-2.0.cc │ │ ├── xingzhi-cube-0.85tft-ml307/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── xingzhi-cube-0.85tft-ml307.cc │ │ ├── xingzhi-cube-0.85tft-wifi/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── xingzhi-cube-0.85tft-wifi.cc │ │ ├── xingzhi-cube-0.96oled-ml307/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── xingzhi-cube-0.96oled-ml307.cc │ │ ├── xingzhi-cube-0.96oled-wifi/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── xingzhi-cube-0.96oled-wifi.cc │ │ ├── xingzhi-cube-1.54tft-ml307/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── xingzhi-cube-1.54tft-ml307.cc │ │ ├── xingzhi-cube-1.54tft-wifi/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── power_manager.h │ │ │ └── xingzhi-cube-1.54tft-wifi.cc │ │ ├── xingzhi-metal-1.54-wifi/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── cst816x.cc │ │ │ ├── cst816x.h │ │ │ ├── power_manager.h │ │ │ └── xingzhi-metal-1.54-wifi.cc │ │ ├── xmini-c3/ │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── xmini_c3_board.cc │ │ ├── xmini-c3-4g/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── xmini_c3_4g_board.cc │ │ ├── xmini-c3-v3/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── xmini_c3_board.cc │ │ ├── yunliao-s3/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── power_manager.cc │ │ │ ├── power_manager.h │ │ │ └── yunliao_s3.cc │ │ ├── zhengchen-1.54tft-ml307/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ └── zhengchen-1.54tft-ml307.cc │ │ ├── zhengchen-1.54tft-wifi/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── power_manager.h │ │ │ ├── zhengchen-1.54tft-wifi.cc │ │ │ └── zhengchen_lcd_display.h │ │ ├── zhengchen-cam/ │ │ │ ├── README.md │ │ │ ├── config.h │ │ │ ├── config.json │ │ │ ├── mcp_controller.cc │ │ │ ├── power_manager.h │ │ │ └── zhengchen_cam_board.cc │ │ └── zhengchen-cam-ml307/ │ │ ├── README.md │ │ ├── config.h │ │ ├── config.json │ │ ├── mcp_controller.cc │ │ ├── power_manager.h │ │ └── zhengchen_cam_board_ml307.cc │ ├── device_state.h │ ├── device_state_machine.cc │ ├── device_state_machine.h │ ├── display/ │ │ ├── display.cc │ │ ├── display.h │ │ ├── emote_display.cc │ │ ├── emote_display.h │ │ ├── lcd_display.cc │ │ ├── lcd_display.h │ │ ├── lvgl_display/ │ │ │ ├── emoji_collection.cc │ │ │ ├── emoji_collection.h │ │ │ ├── gif/ │ │ │ │ ├── LICENSE.txt │ │ │ │ ├── README.md │ │ │ │ ├── gifdec.c │ │ │ │ ├── gifdec.h │ │ │ │ ├── gifdec_mve.h │ │ │ │ ├── lvgl_gif.cc │ │ │ │ └── lvgl_gif.h │ │ │ ├── jpg/ │ │ │ │ ├── image_to_jpeg.cpp │ │ │ │ ├── image_to_jpeg.h │ │ │ │ ├── jpeg_to_image.c │ │ │ │ └── jpeg_to_image.h │ │ │ ├── lvgl_display.cc │ │ │ ├── lvgl_display.h │ │ │ ├── lvgl_font.cc │ │ │ ├── lvgl_font.h │ │ │ ├── lvgl_image.cc │ │ │ ├── lvgl_image.h │ │ │ ├── lvgl_theme.cc │ │ │ └── lvgl_theme.h │ │ ├── oled_display.cc │ │ └── oled_display.h │ ├── idf_component.yml │ ├── led/ │ │ ├── circular_strip.cc │ │ ├── circular_strip.h │ │ ├── gpio_led.cc │ │ ├── gpio_led.h │ │ ├── led.h │ │ ├── single_led.cc │ │ └── single_led.h │ ├── main.cc │ ├── mcp_server.cc │ ├── mcp_server.h │ ├── ota.cc │ ├── ota.h │ ├── protocols/ │ │ ├── mqtt_protocol.cc │ │ ├── mqtt_protocol.h │ │ ├── protocol.cc │ │ ├── protocol.h │ │ ├── websocket_protocol.cc │ │ └── websocket_protocol.h │ ├── settings.cc │ ├── settings.h │ ├── system_info.cc │ └── system_info.h ├── partitions/ │ ├── v1/ │ │ ├── 16m.csv │ │ ├── 16m_custom_wakeword.csv │ │ ├── 16m_echoear.csv │ │ ├── 32m.csv │ │ ├── 4m.csv │ │ ├── 4m_esp-hi.csv │ │ └── 8m.csv │ └── v2/ │ ├── 16m.csv │ ├── 16m_c3.csv │ ├── 32m.csv │ ├── 4m.csv │ ├── 8m.csv │ └── README.md ├── scripts/ │ ├── Image_Converter/ │ │ ├── LVGLImage.py │ │ ├── README.md │ │ ├── lvgl_tools_gui.py │ │ └── requirements.txt │ ├── acoustic_check/ │ │ ├── demod.py │ │ ├── graphic.py │ │ ├── main.py │ │ ├── readme.md │ │ └── requirements.txt │ ├── audio_debug_server.py │ ├── build_default_assets.py │ ├── download_github_runs.py │ ├── gen_lang.py │ ├── mp3_to_ogg.sh │ ├── ogg_converter/ │ │ ├── README.md │ │ └── xiaozhi_ogg_converter.py │ ├── p3_tools/ │ │ ├── README.md │ │ ├── batch_convert_gui.py │ │ ├── convert_audio_to_p3.py │ │ ├── convert_p3_to_audio.py │ │ ├── p3_gui_player.py │ │ ├── play_p3.py │ │ └── requirements.txt │ ├── release.py │ ├── sonic_wifi_config.html │ ├── spiffs_assets/ │ │ ├── README.md │ │ ├── build.py │ │ ├── build_all.py │ │ ├── pack_model.py │ │ └── spiffs_assets_gen.py │ └── versions.py ├── sdkconfig.defaults ├── sdkconfig.defaults.esp32 ├── sdkconfig.defaults.esp32c3 ├── sdkconfig.defaults.esp32c5 ├── sdkconfig.defaults.esp32c6 ├── sdkconfig.defaults.esp32p4 └── sdkconfig.defaults.esp32s3
Showing preview only (222K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2663 symbols across 340 files)
FILE: main/application.cc
type digit_sound (line 613) | struct digit_sound {
function ListeningMode (line 950) | ListeningMode Application::GetDefaultListeningMode() const {
FILE: main/application.h
type AecMode (line 36) | enum AecMode {
function class (line 42) | class Application {
function ListeningMode (line 168) | ListeningMode GetDefaultListeningMode() const;
FILE: main/assets.cc
type mmap_assets_table (line 22) | struct mmap_assets_table {
FILE: main/assets.h
type Asset (line 18) | struct Asset {
function class (line 23) | class Assets {
function class (line 48) | class AssetStrategy {
function class (line 57) | class LvglStrategy : public AssetStrategy {
function class (line 71) | class EmoteStrategy : public AssetStrategy {
FILE: main/audio/audio_codec.h
function class (line 17) | class AudioCodec {
FILE: main/audio/audio_processor.h
function class (line 11) | class AudioProcessor {
FILE: main/audio/audio_service.h
type AudioServiceCallbacks (line 78) | struct AudioServiceCallbacks {
type AudioTaskType (line 86) | enum AudioTaskType {
type AudioTask (line 92) | struct AudioTask {
type DebugStatistics (line 98) | struct DebugStatistics {
function class (line 105) | class AudioService {
FILE: main/audio/codecs/box_audio_codec.h
function class (line 11) | class BoxAudioCodec : public AudioCodec {
FILE: main/audio/codecs/dummy_audio_codec.h
function class (line 6) | class DummyAudioCodec : public AudioCodec {
FILE: main/audio/codecs/es8311_audio_codec.h
function class (line 13) | class Es8311AudioCodec : public AudioCodec {
FILE: main/audio/codecs/es8374_audio_codec.h
function class (line 13) | class Es8374AudioCodec : public AudioCodec {
FILE: main/audio/codecs/es8388_audio_codec.h
function class (line 12) | class Es8388AudioCodec : public AudioCodec {
FILE: main/audio/codecs/es8389_audio_codec.h
function class (line 12) | class Es8389AudioCodec : public AudioCodec {
FILE: main/audio/codecs/no_audio_codec.h
function class (line 10) | class NoAudioCodec : public AudioCodec {
function class (line 23) | class NoAudioCodecDuplex : public NoAudioCodec {
function class (line 28) | class NoAudioCodecSimplex : public NoAudioCodec {
function class (line 34) | class NoAudioCodecSimplexPdm : public NoAudioCodec {
FILE: main/audio/demuxer/ogg_demuxer.h
type ParseState (line 11) | enum ParseState : int8_t {
type Opus_t (line 18) | struct Opus_t {
function tags_seen (line 20) | bool tags_seen{false};
FILE: main/audio/processors/afe_audio_processor.h
function class (line 17) | class AfeAudioProcessor : public AudioProcessor {
FILE: main/audio/processors/audio_debugger.cc
type sockaddr (line 58) | struct sockaddr
FILE: main/audio/processors/audio_debugger.h
function class (line 10) | class AudioDebugger {
FILE: main/audio/processors/no_audio_processor.h
function class (line 11) | class NoAudioProcessor : public AudioProcessor {
FILE: main/audio/wake_word.h
function class (line 11) | class WakeWord {
FILE: main/audio/wake_words/afe_wake_word.h
function class (line 22) | class AfeWakeWord : public WakeWord {
FILE: main/audio/wake_words/custom_wake_word.h
function class (line 20) | class CustomWakeWord : public WakeWord {
FILE: main/audio/wake_words/esp_wake_word.h
function class (line 17) | class EspWakeWord : public WakeWord {
FILE: main/boards/aipi-lite/aipi-lite.cc
class AIPILite (line 26) | class AIPILite : public WifiBoard {
method InitializePowerManager (line 36) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 47) | void InitializePowerSaveTimer() {
method InitializeI2c (line 67) | void InitializeI2c() {
method InitializeSpi (line 85) | void InitializeSpi() {
method InitializeLcdDisplay (line 98) | void InitializeLcdDisplay() {
method InitializeButtons (line 134) | void InitializeButtons() {
method InitializePowerCtl (line 174) | void InitializePowerCtl() {
method InitializeTools (line 182) | void InitializeTools() {}
method AIPILite (line 185) | AIPILite()
method Led (line 200) | virtual Led* GetLed() override {
method AudioCodec (line 205) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 214) | virtual Display* GetDisplay() override { return display_; }
method Backlight (line 216) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 225) | virtual bool GetBatteryLevel(int& level, bool& charging,
method SetPowerSaveLevel (line 238) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/aipi-lite/power_manager.h
function class (line 9) | class PowerManager {
function IsCharging (line 165) | bool IsCharging() {
function IsDischarging (line 173) | bool IsDischarging() {
function GetBatteryLevel (line 178) | uint8_t GetBatteryLevel() { return battery_level_; }
function OnLowBatteryStatusChanged (line 180) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 184) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/atk-dnesp32s3-box/atk_dnesp32s3_box.cc
class ATK_NoAudioCodecDuplex (line 22) | class ATK_NoAudioCodecDuplex : public NoAudioCodec {
method ATK_NoAudioCodecDuplex (line 24) | ATK_NoAudioCodecDuplex(int input_sample_rate, int output_sample_rate, ...
class XL9555_IN (line 82) | class XL9555_IN : public I2cDevice {
method XL9555_IN (line 84) | XL9555_IN(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i...
method xl9555_cfg (line 89) | void xl9555_cfg(void) {
method SetOutputState (line 94) | void SetOutputState(uint8_t bit, uint8_t level) {
method GetPingState (line 114) | int GetPingState(uint16_t pin) {
class atk_dnesp32s3_box (line 128) | class atk_dnesp32s3_box : public WifiBoard {
method InitializeI2c (line 137) | void InitializeI2c() {
method InitializeATK_ST7789_80_Display (line 165) | void InitializeATK_ST7789_80_Display() {
method InitializeButtons (line 243) | void InitializeButtons() {
method atk_dnesp32s3_box (line 255) | atk_dnesp32s3_box() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 263) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 294) | virtual Display* GetDisplay() override {
FILE: main/boards/atk-dnesp32s3-box0/atk_dnesp32s3_box0.cc
class atk_dnesp32s3_box0 (line 22) | class atk_dnesp32s3_box0 : public WifiBoard {
method InitializeBoardPowerManager (line 43) | void InitializeBoardPowerManager() {
method InitializePowerManager (line 122) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 133) | void InitializePowerSaveTimer() {
method InitializeI2c (line 166) | void InitializeI2c() {
method InitializeSpi (line 183) | void InitializeSpi() {
method InitializeButtons (line 194) | void InitializeButtons() {
method InitializeSt7789Display (line 296) | void InitializeSt7789Display() {
method atk_dnesp32s3_box0 (line 328) | atk_dnesp32s3_box0() :
method AudioCodec (line 342) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 359) | virtual Display* GetDisplay() override {
method Backlight (line 363) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 368) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 380) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/atk-dnesp32s3-box0/config.h
type XiaozhiStatus (line 6) | enum XiaozhiStatus {
type LcdStatus (line 14) | enum LcdStatus {
type WakeStatus (line 19) | enum WakeStatus {
type PowerSupply (line 25) | enum PowerSupply {
type PowerSleep (line 30) | enum PowerSleep {
FILE: main/boards/atk-dnesp32s3-box0/power_manager.h
function class (line 10) | class PowerManager {
FILE: main/boards/atk-dnesp32s3-box2-4g/atk_dnesp32s3_box2.cc
class atk_dnesp32s3_box2_4g (line 23) | class atk_dnesp32s3_box2_4g : public DualNetworkBoard {
method InitializeBoardPowerManager (line 40) | void InitializeBoardPowerManager() {
method InitializePowerManager (line 84) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 95) | void InitializePowerSaveTimer() {
method audio_volume_change (line 119) | void audio_volume_change(bool direction) {
method audio_volume_minimum (line 139) | void audio_volume_minimum(){
method audio_volume_maxmum (line 144) | void audio_volume_maxmum(){
method esp_err_t (line 149) | esp_err_t IoExpanderSetLevel(uint16_t pin_mask, uint8_t level) {
method IoExpanderGetLevel (line 153) | uint8_t IoExpanderGetLevel(uint16_t pin_mask) {
method InitializeIoExpander (line 160) | void InitializeIoExpander() {
method InitializeI2c (line 177) | void InitializeI2c() {
method InitializeButtons (line 194) | void InitializeButtons() {
method InitializeSt7789Display (line 314) | void InitializeSt7789Display() {
method atk_dnesp32s3_box2_4g (line 416) | atk_dnesp32s3_box2_4g() :
method AudioCodec (line 428) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 445) | virtual Display* GetDisplay() override {
method Backlight (line 449) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 454) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 466) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/atk-dnesp32s3-box2-4g/config.h
type PowerSupply (line 7) | enum PowerSupply {
FILE: main/boards/atk-dnesp32s3-box2-4g/power_manager.h
function class (line 10) | class PowerManager {
FILE: main/boards/atk-dnesp32s3-box2-wifi/atk_dnesp32s3_box2.cc
class atk_dnesp32s3_box2_wifi (line 23) | class atk_dnesp32s3_box2_wifi : public WifiBoard {
method InitializeBoardPowerManager (line 40) | void InitializeBoardPowerManager() {
method InitializePowerManager (line 84) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 95) | void InitializePowerSaveTimer() {
method audio_volume_change (line 119) | void audio_volume_change(bool direction) {
method audio_volume_minimum (line 139) | void audio_volume_minimum(){
method audio_volume_maxmum (line 144) | void audio_volume_maxmum(){
method esp_err_t (line 149) | esp_err_t IoExpanderSetLevel(uint16_t pin_mask, uint8_t level) {
method IoExpanderGetLevel (line 153) | uint8_t IoExpanderGetLevel(uint16_t pin_mask) {
method InitializeIoExpander (line 160) | void InitializeIoExpander() {
method InitializeI2c (line 178) | void InitializeI2c() {
method InitializeButtons (line 194) | void InitializeButtons() {
method InitializeSt7789Display (line 294) | void InitializeSt7789Display() {
method atk_dnesp32s3_box2_wifi (line 396) | atk_dnesp32s3_box2_wifi() {
method AudioCodec (line 407) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 424) | virtual Display* GetDisplay() override {
method Backlight (line 428) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 433) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 445) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/atk-dnesp32s3-box2-wifi/config.h
type PowerSupply (line 6) | enum PowerSupply {
FILE: main/boards/atk-dnesp32s3-box2-wifi/power_manager.h
function class (line 10) | class PowerManager {
FILE: main/boards/atk-dnesp32s3/atk_dnesp32s3.cc
class XL9555 (line 18) | class XL9555 : public I2cDevice {
method XL9555 (line 20) | XL9555(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_...
method SetOutputState (line 25) | void SetOutputState(uint8_t bit, uint8_t level) {
class atk_dnesp32s3 (line 46) | class atk_dnesp32s3 : public WifiBoard {
method InitializeI2c (line 54) | void InitializeI2c() {
method InitializeSpi (line 75) | void InitializeSpi() {
method InitializeButtons (line 86) | void InitializeButtons() {
method InitializeSt7789Display (line 97) | void InitializeSt7789Display() {
method InitializeCamera (line 135) | void InitializeCamera() {
method atk_dnesp32s3 (line 186) | atk_dnesp32s3() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 194) | virtual Led* GetLed() override {
method AudioCodec (line 199) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 216) | virtual Display* GetDisplay() override {
method Camera (line 220) | virtual Camera* GetCamera() override {
FILE: main/boards/atk-dnesp32s3m-4g/atk_dnesp32s3m.cc
class atk_dnesp32s3m_4g (line 23) | class atk_dnesp32s3m_4g : public Ml307Board {
method InitializeI2c (line 32) | void InitializeI2c() {
method InitializeSpi (line 50) | void InitializeSpi() {
method InitializeButtons (line 61) | void InitializeButtons() {
method InitializeSt7735Display (line 107) | void InitializeSt7735Display() {
method atk_dnesp32s3m_4g (line 171) | atk_dnesp32s3m_4g() : Ml307Board(Module_4G_TX_PIN, Module_4G_RX_PIN),
method Led (line 185) | virtual Led* GetLed() override {
method AudioCodec (line 190) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 207) | virtual Display* GetDisplay() override {
method Backlight (line 211) | virtual Backlight* GetBacklight() override {
FILE: main/boards/atk-dnesp32s3m-wifi/atk_dnesp32s3m.cc
class atk_dnesp32s3m_wifi (line 21) | class atk_dnesp32s3m_wifi : public WifiBoard {
method InitializeI2c (line 30) | void InitializeI2c() {
method InitializeSpi (line 48) | void InitializeSpi() {
method InitializeButtons (line 59) | void InitializeButtons() {
method InitializeSt7735Display (line 117) | void InitializeSt7735Display() {
method atk_dnesp32s3m_wifi (line 181) | atk_dnesp32s3m_wifi() :
method Led (line 195) | virtual Led* GetLed() override {
method AudioCodec (line 200) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 217) | virtual Display* GetDisplay() override {
method Backlight (line 221) | virtual Backlight* GetBacklight() override {
FILE: main/boards/atom-echos3r/atom_echos3r.cc
class AtomEchoS3rBaseBoard (line 14) | class AtomEchoS3rBaseBoard : public WifiBoard {
method InitializeI2c (line 18) | void InitializeI2c() {
method I2cDetect (line 35) | void I2cDetect() {
method InitializeButtons (line 56) | void InitializeButtons() {
method AtomEchoS3rBaseBoard (line 67) | AtomEchoS3rBaseBoard() : boot_button_(USER_BUTTON_GPIO) {
method AudioCodec (line 73) | virtual AudioCodec* GetAudioCodec() override {
FILE: main/boards/atommatrix-echo-base/atommatrix_echo_base.cc
class Pi4ioe (line 21) | class Pi4ioe : public I2cDevice {
method Pi4ioe (line 23) | Pi4ioe(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_...
method SetSpeakerMute (line 30) | void SetSpeakerMute(bool mute) {
class AtomMatrixEchoBaseBoard (line 35) | class AtomMatrixEchoBaseBoard : public WifiBoard {
method InitializeI2c (line 43) | void InitializeI2c() {
method I2cDetect (line 61) | void I2cDetect() {
method InitializePi4ioe (line 82) | void InitializePi4ioe() {
method InitializeButtons (line 88) | void InitializeButtons() {
method AtomMatrixEchoBaseBoard (line 102) | AtomMatrixEchoBaseBoard() : face_button_(BOOT_BUTTON_GPIO) {
method Led (line 109) | virtual Led* GetLed() override {
method AudioCodec (line 114) | virtual AudioCodec* GetAudioCodec() override {
FILE: main/boards/atoms3-echo-base/atoms3_echo_base.cc
class AtomS3EchoBaseBoard (line 47) | class AtomS3EchoBaseBoard : public WifiBoard {
method InitializeI2c (line 53) | void InitializeI2c() {
method I2cDetect (line 70) | void I2cDetect() {
method CheckEchoBaseConnection (line 99) | void CheckEchoBaseConnection() {
method InitializeSpi (line 135) | void InitializeSpi() {
method InitializeGc9107Display (line 147) | void InitializeGc9107Display() {
method InitializeButtons (line 183) | void InitializeButtons() {
method AtomS3EchoBaseBoard (line 195) | AtomS3EchoBaseBoard() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 205) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 222) | virtual Display* GetDisplay() override {
method Backlight (line 226) | virtual Backlight* GetBacklight() override {
FILE: main/boards/atoms3r-cam-m12-echo-base/atoms3r_cam_m12_echo_base.cc
class Pi4ioe (line 22) | class Pi4ioe : public I2cDevice {
method Pi4ioe (line 24) | Pi4ioe(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_...
method SetSpeakerMute (line 31) | void SetSpeakerMute(bool mute) {
class AtomS3rCamM12EchoBaseBoard (line 36) | class AtomS3rCamM12EchoBaseBoard : public WifiBoard {
method InitializeI2c (line 43) | void InitializeI2c() {
method I2cDetect (line 60) | void I2cDetect() {
method CheckEchoBaseConnection (line 89) | void CheckEchoBaseConnection() {
method InitializePi4ioe (line 112) | void InitializePi4ioe() {
method EnableCameraPower (line 118) | void EnableCameraPower() {
method InitializeCamera (line 128) | void InitializeCamera() {
method Camera (line 159) | virtual Camera* GetCamera() override {
method AtomS3rCamM12EchoBaseBoard (line 163) | AtomS3rCamM12EchoBaseBoard() {
method AudioCodec (line 172) | virtual AudioCodec* GetAudioCodec() override {
FILE: main/boards/atoms3r-echo-base/atoms3r_echo_base.cc
class Pi4ioe (line 25) | class Pi4ioe : public I2cDevice {
method Pi4ioe (line 27) | Pi4ioe(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_...
method SetSpeakerMute (line 34) | void SetSpeakerMute(bool mute) {
class Lp5562 (line 39) | class Lp5562 : public I2cDevice {
method Lp5562 (line 41) | Lp5562(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_...
method SetBrightness (line 52) | void SetBrightness(uint8_t brightness) {
class CustomBacklight (line 59) | class CustomBacklight : public Backlight {
method CustomBacklight (line 61) | CustomBacklight(Lp5562* lp5562) : lp5562_(lp5562) {}
method SetBrightnessImpl (line 63) | void SetBrightnessImpl(uint8_t brightness) override {
class AtomS3rEchoBaseBoard (line 104) | class AtomS3rEchoBaseBoard : public WifiBoard {
method InitializeI2c (line 114) | void InitializeI2c() {
method I2cDetect (line 136) | void I2cDetect() {
method CheckEchoBaseConnection (line 165) | void CheckEchoBaseConnection() {
method InitializePi4ioe (line 202) | void InitializePi4ioe() {
method InitializeLp5562 (line 208) | void InitializeLp5562() {
method InitializeSpi (line 213) | void InitializeSpi() {
method InitializeGc9107Display (line 225) | void InitializeGc9107Display() {
method InitializeButtons (line 261) | void InitializeButtons() {
method AtomS3rEchoBaseBoard (line 273) | AtomS3rEchoBaseBoard() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 285) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 302) | virtual Display* GetDisplay() override {
method Backlight (line 306) | virtual Backlight *GetBacklight() override {
FILE: main/boards/bread-compact-esp32-lcd/esp32_bread_board_lcd.cc
class CompactWifiBoardLCD (line 60) | class CompactWifiBoardLCD : public WifiBoard {
method InitializeSpi (line 68) | void InitializeSpi() {
method InitializeLcdDisplay (line 79) | void InitializeLcdDisplay() {
method InitializeButtons (line 125) | void InitializeButtons() {
method CompactWifiBoardLCD (line 165) | CompactWifiBoardLCD() : WifiBoard(),
method AudioCodec (line 176) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 187) | virtual Display* GetDisplay() override {
method Backlight (line 191) | virtual Backlight* GetBacklight() override {
FILE: main/boards/bread-compact-esp32/esp32_bread_board.cc
class CompactWifiBoard (line 19) | class CompactWifiBoard : public WifiBoard {
method InitializeDisplayI2c (line 30) | void InitializeDisplayI2c() {
method InitializeSsd1306Display (line 46) | void InitializeSsd1306Display() {
method InitializeButtons (line 93) | void InitializeButtons() {
method InitializeTools (line 131) | void InitializeTools() {
method CompactWifiBoard (line 136) | CompactWifiBoard() : WifiBoard(), boot_button_(BOOT_BUTTON_GPIO), touc...
method AudioCodec (line 144) | virtual AudioCodec* GetAudioCodec() override
method Display (line 156) | virtual Display* GetDisplay() override {
FILE: main/boards/bread-compact-ml307/compact_ml307_board.cc
class CompactMl307Board (line 20) | class CompactMl307Board : public DualNetworkBoard {
method InitializeDisplayI2c (line 31) | void InitializeDisplayI2c() {
method InitializeSsd1306Display (line 47) | void InitializeSsd1306Display() {
method InitializeButtons (line 94) | void InitializeButtons() {
method InitializeTools (line 153) | void InitializeTools() {
method CompactMl307Board (line 158) | CompactMl307Board() : DualNetworkBoard(ML307_TX_PIN, ML307_RX_PIN, GPI...
method Led (line 170) | virtual Led* GetLed() override {
method AudioCodec (line 175) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 186) | virtual Display* GetDisplay() override {
FILE: main/boards/bread-compact-nt26/compact_nt26_board.cc
class CompactNt26Board (line 19) | class CompactNt26Board : public Nt26Board {
method InitializeDisplayI2c (line 30) | void InitializeDisplayI2c() {
method InitializeSsd1306Display (line 46) | void InitializeSsd1306Display() {
method InitializeButtons (line 93) | void InitializeButtons() {
method InitializeTools (line 137) | void InitializeTools() {
method CompactNt26Board (line 142) | CompactNt26Board() :
method StartNetwork (line 155) | virtual void StartNetwork() override {
method Led (line 160) | virtual Led* GetLed() override {
method AudioCodec (line 165) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 176) | virtual Display* GetDisplay() override {
FILE: main/boards/bread-compact-wifi-lcd/compact_wifi_board_lcd.cc
class CompactWifiBoardLCD (line 62) | class CompactWifiBoardLCD : public WifiBoard {
method InitializeSpi (line 68) | void InitializeSpi() {
method InitializeLcdDisplay (line 79) | void InitializeLcdDisplay() {
method InitializeButtons (line 125) | void InitializeButtons() {
method InitializeTools (line 137) | void InitializeTools() {
method CompactWifiBoardLCD (line 142) | CompactWifiBoardLCD() :
method Led (line 154) | virtual Led* GetLed() override {
method AudioCodec (line 159) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 170) | virtual Display* GetDisplay() override {
method Backlight (line 174) | virtual Backlight* GetBacklight() override {
FILE: main/boards/bread-compact-wifi-s3cam/compact_wifi_board_s3cam.cc
class CompactWifiBoardS3Cam (line 63) | class CompactWifiBoardS3Cam : public WifiBoard {
method InitializeSpi (line 70) | void InitializeSpi() {
method InitializeLcdDisplay (line 81) | void InitializeLcdDisplay() {
method InitializeCamera (line 127) | void InitializeCamera() {
method InitializeButtons (line 157) | void InitializeButtons() {
method CompactWifiBoardS3Cam (line 169) | CompactWifiBoardS3Cam() :
method Led (line 181) | virtual Led* GetLed() override {
method AudioCodec (line 186) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 197) | virtual Display* GetDisplay() override {
method Backlight (line 201) | virtual Backlight* GetBacklight() override {
method Camera (line 209) | virtual Camera* GetCamera() override {
FILE: main/boards/bread-compact-wifi/compact_wifi_board.cc
class CompactWifiBoard (line 24) | class CompactWifiBoard : public WifiBoard {
method InitializeDisplayI2c (line 35) | void InitializeDisplayI2c() {
method InitializeSsd1306Display (line 51) | void InitializeSsd1306Display() {
method InitializeButtons (line 103) | void InitializeButtons() {
method InitializeTools (line 151) | void InitializeTools() {
method CompactWifiBoard (line 156) | CompactWifiBoard() :
method Led (line 167) | virtual Led* GetLed() override {
method AudioCodec (line 172) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 183) | virtual Display* GetDisplay() override {
FILE: main/boards/common/adc_battery_monitor.h
function class (line 9) | class AdcBatteryMonitor {
FILE: main/boards/common/afsk_demod.cc
type audio_wifi_config (line 12) | namespace audio_wifi_config
function ReceiveWifiCredentialsFromAudio (line 16) | void ReceiveWifiCredentialsFromAudio(Application *app,
FILE: main/boards/common/afsk_demod.h
function namespace (line 19) | namespace audio_wifi_config
FILE: main/boards/common/axp2101.h
function class (line 6) | class Axp2101 : public I2cDevice {
FILE: main/boards/common/backlight.h
function class (line 10) | class Backlight {
function class (line 30) | class PwmBacklight : public Backlight {
FILE: main/boards/common/blufi.cpp
type ble_gatt_register_ctxt (line 29) | struct ble_gatt_register_ctxt
type ble_gatt_register_ctxt (line 50) | struct ble_gatt_register_ctxt
function wifi_mode_t (line 66) | static wifi_mode_t GetWifiModeWithFallback(const WifiManager& wifi) {
function Blufi (line 79) | Blufi& Blufi::GetInstance() {
function esp_err_t (line 105) | esp_err_t Blufi::init() {
function esp_err_t (line 141) | esp_err_t Blufi::deinit() {
function esp_err_t (line 164) | esp_err_t Blufi::_host_init() {
function esp_err_t (line 179) | esp_err_t Blufi::_host_deinit() {
function esp_err_t (line 197) | esp_err_t Blufi::_gap_register_callback() {
function esp_err_t (line 205) | esp_err_t Blufi::_host_and_cb_init() {
function esp_err_t (line 249) | esp_err_t Blufi::_host_init() {
function esp_err_t (line 273) | esp_err_t Blufi::_host_deinit(void) {
function esp_err_t (line 284) | esp_err_t Blufi::_gap_register_callback(void) { return ESP_OK; }
function esp_err_t (line 286) | esp_err_t Blufi::_host_and_cb_init() {
function esp_err_t (line 312) | esp_err_t Blufi::_controller_init() {
function esp_err_t (line 335) | esp_err_t Blufi::_controller_deinit() {
function myrand (line 348) | static int myrand(void* rng_state, unsigned char* output, size_t len) {
FILE: main/boards/common/blufi.h
function class (line 16) | class Blufi {
FILE: main/boards/common/board.cc
function Display (line 56) | Display* Board::GetDisplay() {
function Camera (line 61) | Camera* Board::GetCamera() {
function Led (line 65) | Led* Board::GetLed() {
FILE: main/boards/common/board.h
type class (line 20) | enum class
function PowerSaveLevel (line 36) | enum class PowerSaveLevel {
FILE: main/boards/common/button.h
function class (line 11) | class Button {
function class (line 37) | class AdcButton : public Button {
function class (line 43) | class PowerSaveButton : public Button {
FILE: main/boards/common/camera.h
function class (line 6) | class Camera {
FILE: main/boards/common/dual_network_board.cc
function NetworkType (line 23) | NetworkType DualNetworkBoard::LoadNetworkTypeFromSettings(int32_t defaul...
function NetworkInterface (line 80) | NetworkInterface* DualNetworkBoard::GetNetwork() {
FILE: main/boards/common/dual_network_board.h
type class (line 10) | enum class
function class (line 16) | class DualNetworkBoard : public Board {
FILE: main/boards/common/esp32_camera.h
type JpegChunk (line 16) | struct JpegChunk
function class (line 22) | class Esp32Camera : public Camera
FILE: main/boards/common/esp_video.cc
function esp_err_t (line 79) | __attribute__((weak)) esp_err_t esp_video_deinit(void) {
function log_available_video_devices (line 84) | static void log_available_video_devices() {
type v4l2_capability (line 154) | struct v4l2_capability
type v4l2_format (line 167) | struct v4l2_format
type v4l2_format (line 179) | struct v4l2_format
type v4l2_fmtdesc (line 188) | struct v4l2_fmtdesc
type v4l2_requestbuffers (line 278) | struct v4l2_requestbuffers
type v4l2_buffer (line 291) | struct v4l2_buffer
type v4l2_buffer (line 340) | struct v4l2_buffer
type v4l2_buffer (line 398) | struct v4l2_buffer
type v4l2_ext_controls (line 846) | struct v4l2_ext_controls
type v4l2_ext_control (line 847) | struct v4l2_ext_control
type v4l2_ext_controls (line 863) | struct v4l2_ext_controls
type v4l2_ext_control (line 864) | struct v4l2_ext_control
FILE: main/boards/common/esp_video.h
type JpegChunk (line 16) | struct JpegChunk {
function class (line 21) | class EspVideo : public Camera {
FILE: main/boards/common/i2c_device.h
function class (line 6) | class I2cDevice {
FILE: main/boards/common/knob.h
function class (line 9) | class Knob {
FILE: main/boards/common/lamp_controller.h
function class (line 7) | class LampController {
FILE: main/boards/common/ml307_board.cc
function NetworkInterface (line 143) | NetworkInterface* Ml307Board::GetNetwork() {
FILE: main/boards/common/ml307_board.h
function class (line 9) | class Ml307Board : public Board {
FILE: main/boards/common/nt26_board.cc
function NetworkInterface (line 137) | NetworkInterface* Nt26Board::GetNetwork() {
function Nt26CeregState (line 197) | Nt26CeregState Nt26Board::GetRegistrationState() {
FILE: main/boards/common/nt26_board.h
function class (line 28) | class Nt26Board : public Board {
FILE: main/boards/common/power_save_timer.h
function class (line 8) | class PowerSaveTimer {
FILE: main/boards/common/press_to_talk_mcp_tool.cc
function ReturnValue (line 35) | ReturnValue PressToTalkMcpTool::HandleSetPressToTalk(const PropertyList&...
FILE: main/boards/common/press_to_talk_mcp_tool.h
function class (line 8) | class PressToTalkMcpTool {
FILE: main/boards/common/rndis_board.cc
function NetworkInterface (line 173) | NetworkInterface* RndisBoard::GetNetwork() {
FILE: main/boards/common/rndis_board.h
function class (line 17) | class RndisBoard : public Board {
FILE: main/boards/common/sleep_timer.h
function class (line 8) | class SleepTimer {
FILE: main/boards/common/sy6970.h
function class (line 6) | class Sy6970 : public I2cDevice {
FILE: main/boards/common/system_reset.h
function class (line 6) | class SystemReset {
FILE: main/boards/common/wifi_board.cc
function NetworkInterface (line 244) | NetworkInterface* WifiBoard::GetNetwork() {
FILE: main/boards/common/wifi_board.h
function class (line 9) | class WifiBoard : public Board {
FILE: main/boards/df-k10/df_k10_board.cc
class Df_K10Board (line 23) | class Df_K10Board : public WifiBoard {
method InitializeI2c (line 39) | void InitializeI2c() {
method InitializeSpi (line 56) | void InitializeSpi() {
method esp_err_t (line 67) | esp_err_t IoExpanderSetLevel(uint16_t pin_mask, uint8_t level) {
method IoExpanderGetLevel (line 71) | uint8_t IoExpanderGetLevel(uint16_t pin_mask) {
method InitializeIoExpander (line 78) | void InitializeIoExpander() {
method InitializeButtons (line 109) | void InitializeButtons() {
method InitializeCamera (line 175) | void InitializeCamera() {
method InitializeIli9341Display (line 215) | void InitializeIli9341Display() {
method InitializeIot (line 251) | void InitializeIot() {
method Df_K10Board (line 257) | Df_K10Board() {
method Led (line 267) | virtual Led* GetLed() override {
method AudioCodec (line 271) | virtual AudioCodec *GetAudioCodec() override {
method Camera (line 288) | virtual Camera* GetCamera() override {
method Display (line 292) | virtual Display *GetDisplay() override {
FILE: main/boards/df-k10/k10_audio_codec.h
function class (line 9) | class K10AudioCodec : public AudioCodec {
FILE: main/boards/df-k10/led_control.cc
function StripColor (line 15) | StripColor LedStripControl::RGBToColor(int red, int green, int blue) {
FILE: main/boards/df-k10/led_control.h
function class (line 6) | class LedStripControl {
FILE: main/boards/df-s3-ai-cam/df_s3_ai_cam.cc
class DfrobotEsp32S3AiCam (line 18) | class DfrobotEsp32S3AiCam : public WifiBoard {
method InitializeButtons (line 23) | void InitializeButtons() {
method InitializeCamera (line 34) | void InitializeCamera() {
method DfrobotEsp32S3AiCam (line 87) | DfrobotEsp32S3AiCam() :
method Led (line 95) | virtual Led* GetLed() override {
method AudioCodec (line 100) | virtual AudioCodec* GetAudioCodec() override {
method Camera (line 107) | virtual Camera* GetCamera() override {
FILE: main/boards/doit-s3-aibox/doit_s3_aibox.cc
class DoitS3AiBox (line 14) | class DoitS3AiBox : public WifiBoard {
method InitializeButtons (line 23) | void InitializeButtons() {
method InitializeGpio (line 102) | void InitializeGpio(gpio_num_t gpio_num_) {
method DoitS3AiBox (line 115) | DoitS3AiBox() :
method Led (line 125) | virtual Led* GetLed() override {
method AudioCodec (line 130) | virtual AudioCodec* GetAudioCodec() override {
FILE: main/boards/du-chatx/du-chatx-wifi.cc
class DuChatX (line 21) | class DuChatX : public WifiBoard {
method InitializePowerManager (line 29) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 39) | void InitializePowerSaveTimer() {
method InitializeSpi (line 63) | void InitializeSpi() {
method InitializeLcdDisplay (line 74) | void InitializeLcdDisplay() {
method InitializeButtons (line 103) | void InitializeButtons() {
method DuChatX (line 116) | DuChatX() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 125) | virtual Led *GetLed() override {
method AudioCodec (line 130) | virtual AudioCodec *GetAudioCodec() override {
method Display (line 136) | virtual Display *GetDisplay() override {
method Backlight (line 140) | virtual Backlight *GetBacklight() override {
method GetBatteryLevel (line 145) | virtual bool GetBatteryLevel(int &level, bool &charging, bool &dischar...
method SetPowerSaveLevel (line 156) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/du-chatx/power_manager.h
function class (line 10) | class PowerManager {
function IsCharging (line 162) | bool IsCharging() {
function IsDischarging (line 170) | bool IsDischarging() {
function GetBatteryLevel (line 175) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 179) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 183) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/electron-bot/electron_bot.cc
class ElectronBot (line 26) | class ElectronBot : public WifiBoard {
method InitializePowerManager (line 32) | void InitializePowerManager() {
method InitializeSpi (line 37) | void InitializeSpi() {
method InitializeGc9a01Display (line 46) | void InitializeGc9a01Display() {
method InitializeButtons (line 75) | void InitializeButtons() {
method InitializeController (line 86) | void InitializeController() { InitializeElectronBotController(); }
method ElectronBot (line 89) | ElectronBot() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 101) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 109) | virtual Display* GetDisplay() override { return display_; }
method Backlight (line 111) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 115) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
FILE: main/boards/electron-bot/electron_bot_controller.cc
type ElectronBotActionParams (line 20) | struct ElectronBotActionParams {
class ElectronBotController (line 28) | class ElectronBotController {
type ActionType (line 35) | enum ActionType {
method ActionTask (line 66) | static void ActionTask(void* arg) {
method QueueAction (line 104) | void QueueAction(int action_type, int steps, int speed, int direction,...
method StartActionTaskIfNeeded (line 113) | void StartActionTaskIfNeeded() {
method LoadTrimsFromNVS (line 120) | void LoadTrimsFromNVS() {
method ElectronBotController (line 133) | ElectronBotController() {
method RegisterMcpTools (line 146) | void RegisterMcpTools() {
function InitializeElectronBotController (line 371) | void InitializeElectronBotController() {
FILE: main/boards/electron-bot/electron_emoji_display.h
function class (line 9) | class ElectronEmojiDisplay : public SpiLcdDisplay {
FILE: main/boards/electron-bot/movements.cc
function millis (line 20) | unsigned long IRAM_ATTR millis() {
FILE: main/boards/electron-bot/movements.h
function class (line 33) | class Otto {
FILE: main/boards/electron-bot/oscillator.h
function class (line 22) | class Oscillator {
FILE: main/boards/electron-bot/power_manager.h
function class (line 9) | class PowerManager {
function InitializeAdc (line 99) | void InitializeAdc() {
function IsCharging (line 124) | bool IsCharging() { return is_charging_; }
function GetBatteryLevel (line 126) | uint8_t GetBatteryLevel() { return battery_level_; }
FILE: main/boards/esp-box-3/esp_box3_board.cc
class EspBox3Board (line 39) | class EspBox3Board : public WifiBoard {
method InitializeI2c (line 45) | void InitializeI2c() {
method InitializeSpi (line 62) | void InitializeSpi() {
method InitializeButtons (line 73) | void InitializeButtons() {
method InitializeIli9341Display (line 93) | void InitializeIli9341Display() {
method EspBox3Board (line 140) | EspBox3Board() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 148) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 165) | virtual Display* GetDisplay() override {
method Backlight (line 169) | virtual Backlight* GetBacklight() override {
FILE: main/boards/esp-box-lite/box_audio_codec_lite.h
function class (line 9) | class BoxAudioCodecLite : public AudioCodec {
FILE: main/boards/esp-box-lite/esp_box_lite_board.cc
class EspBoxBoardLite (line 47) | class EspBoxBoardLite : public WifiBoard {
method InitializeI2c (line 57) | void InitializeI2c() {
method InitializeSpi (line 74) | void InitializeSpi() {
method ChangeVol (line 85) | void ChangeVol(int val) {
method TogleState (line 98) | void TogleState() {
method InitializeButtons (line 107) | void InitializeButtons() {
method InitializeIli9341Display (line 153) | void InitializeIli9341Display() {
method EspBoxBoardLite (line 195) | EspBoxBoardLite() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 212) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 227) | virtual Display* GetDisplay() override {
method Backlight (line 231) | virtual Backlight* GetBacklight() override {
FILE: main/boards/esp-box/esp_box_board.cc
class EspBox3Board (line 38) | class EspBox3Board : public WifiBoard {
method InitializeI2c (line 44) | void InitializeI2c() {
method InitializeSpi (line 61) | void InitializeSpi() {
method InitializeButtons (line 72) | void InitializeButtons() {
method InitializeIli9341Display (line 92) | void InitializeIli9341Display() {
method EspBox3Board (line 139) | EspBox3Board() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 147) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 164) | virtual Display* GetDisplay() override {
method Backlight (line 168) | virtual Backlight* GetBacklight() override {
FILE: main/boards/esp-hi/adc_pdm_audio_codec.h
function class (line 10) | class AdcPdmAudioCodec : public AudioCodec {
FILE: main/boards/esp-hi/emoji_display.cc
type anim (line 16) | namespace anim {
FILE: main/boards/esp-hi/emoji_display.h
function namespace (line 11) | namespace anim {
FILE: main/boards/esp-hi/esp_hi.cc
class EspHi (line 73) | class EspHi : public WifiBoard {
method wifi_event_handler (line 84) | static void wifi_event_handler(void* arg, esp_event_base_t event_base,
method HandleMoveWakePressDown (line 114) | void HandleMoveWakePressDown(int64_t current_time, int64_t &last_trigg...
method HandleMoveWakePressUp (line 139) | void HandleMoveWakePressUp(int64_t current_time, int64_t &last_trigger...
method InitializeButtons (line 166) | void InitializeButtons()
method InitializeLed (line 198) | void InitializeLed() {
method esp_err_t (line 209) | esp_err_t SetLedColor(uint8_t r, uint8_t g, uint8_t b) {
method InitializeIot (line 220) | void InitializeIot()
method InitializeSpi (line 233) | void InitializeSpi()
method InitializeLcdDisplay (line 245) | void InitializeLcdDisplay()
method InitializeTools (line 302) | void InitializeTools()
method EspHi (line 393) | EspHi() : boot_button_(BOOT_BUTTON_GPIO),
method AudioCodec (line 404) | virtual AudioCodec* GetAudioCodec() override
method Display (line 416) | virtual Display* GetDisplay() override
FILE: main/boards/esp-p4-function-ev-board/esp-p4-function-ev-board.cc
class ESP32P4FunctionEvBoard (line 41) | class ESP32P4FunctionEvBoard : public WifiBoard
method InitializeI2cBuses (line 50) | void InitializeI2cBuses()
method InitializeTouchI2cBus (line 57) | void InitializeTouchI2cBus()
method InitializeLCD (line 62) | void InitializeLCD()
method InitializeButtons (line 78) | void InitializeButtons()
method InitializeTouch (line 91) | void InitializeTouch()
method InitializeSdCard (line 96) | void InitializeSdCard()
method InitializeCamera (line 107) | void InitializeCamera()
method InitializeFonts (line 164) | void InitializeFonts()
method ESP32P4FunctionEvBoard (line 184) | ESP32P4FunctionEvBoard() : boot_button_(0)
method AudioCodec (line 210) | virtual AudioCodec *GetAudioCodec() override
method Display (line 219) | virtual Display *GetDisplay() override { return display_; }
method Backlight (line 221) | virtual Backlight *GetBacklight() override
method Camera (line 227) | virtual Camera *GetCamera() override
FILE: main/boards/esp-s3-lcd-ev-board-2/esp-s3-lcd-ev-board-2.cc
class ESP_S3_LCD_EV_Board_2 (line 25) | class ESP_S3_LCD_EV_Board_2 : public WifiBoard {
method InitializeRGB_GC9503V_Display (line 35) | void InitializeRGB_GC9503V_Display() {
method InitializeCodecI2c (line 130) | void InitializeCodecI2c() {
method InitializeButtons (line 155) | void InitializeButtons() {
method InitializeTouch (line 171) | void InitializeTouch() {
method InitializeCamera (line 202) | void InitializeCamera() {
method ESP_S3_LCD_EV_Board_2 (line 226) | ESP_S3_LCD_EV_Board_2() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 236) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 253) | virtual Display* GetDisplay() override {
method Led (line 258) | virtual Led* GetLed() override {
method Camera (line 264) | virtual Camera* GetCamera() override {
FILE: main/boards/esp-s3-lcd-ev-board-2/esp_lcd_gc9503.c
type gc9503_panel_t (line 25) | typedef struct
function esp_err_t (line 58) | esp_err_t esp_lcd_new_panel_gc9503(const esp_lcd_panel_io_handle_t io, c...
function esp_err_t (line 319) | static esp_err_t panel_gc9503_send_init_cmds(gc9503_panel_t *gc9503)
function esp_err_t (line 385) | static esp_err_t panel_gc9503_init(esp_lcd_panel_t *panel)
function esp_err_t (line 399) | static esp_err_t panel_gc9503_del(esp_lcd_panel_t *panel)
function esp_err_t (line 414) | static esp_err_t panel_gc9503_reset(esp_lcd_panel_t *panel)
function esp_err_t (line 438) | static esp_err_t panel_gc9503_mirror(esp_lcd_panel_t *panel, bool mirror...
function esp_err_t (line 478) | static esp_err_t panel_gc9503_disp_on_off(esp_lcd_panel_t *panel, bool o...
FILE: main/boards/esp-s3-lcd-ev-board-2/esp_lcd_gc9503.h
type gc9503_lcd_init_cmd_t (line 26) | typedef struct {
type gc9503_vendor_config_t (line 39) | typedef struct {
FILE: main/boards/esp-s3-lcd-ev-board/esp-s3-lcd-ev-board.cc
class ESP_S3_LCD_EV_Board (line 23) | class ESP_S3_LCD_EV_Board : public WifiBoard {
method InitializeRGB_GC9503V_Display (line 33) | void InitializeRGB_GC9503V_Display() {
method InitializeCodecI2c (line 129) | void InitializeCodecI2c() {
method InitializeButtons (line 154) | void InitializeButtons() {
method InitializeCamera (line 171) | void InitializeCamera() {
method ESP_S3_LCD_EV_Board (line 196) | ESP_S3_LCD_EV_Board() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 205) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 222) | virtual Display* GetDisplay() override {
method Led (line 227) | virtual Led* GetLed() override {
method Camera (line 233) | virtual Camera* GetCamera() override {
FILE: main/boards/esp-s3-lcd-ev-board/esp_io_expander_tca9554.c
type esp_io_expander_tca9554_t (line 35) | typedef struct {
function esp_err_t (line 54) | esp_err_t esp_io_expander_new_i2c_tca9554(i2c_master_bus_handle_t i2c_bu...
function esp_err_t (line 90) | static esp_err_t read_input_reg(esp_io_expander_handle_t handle, uint32_...
function esp_err_t (line 102) | static esp_err_t write_output_reg(esp_io_expander_handle_t handle, uint3...
function esp_err_t (line 113) | static esp_err_t read_output_reg(esp_io_expander_handle_t handle, uint32...
function esp_err_t (line 121) | static esp_err_t write_direction_reg(esp_io_expander_handle_t handle, ui...
function esp_err_t (line 132) | static esp_err_t read_direction_reg(esp_io_expander_handle_t handle, uin...
function esp_err_t (line 140) | static esp_err_t reset(esp_io_expander_t *handle)
function esp_err_t (line 147) | static esp_err_t del(esp_io_expander_t *handle)
FILE: main/boards/esp-s3-lcd-ev-board/esp_lcd_gc9503.c
type gc9503_panel_t (line 25) | typedef struct
function esp_err_t (line 58) | esp_err_t esp_lcd_new_panel_gc9503(const esp_lcd_panel_io_handle_t io, c...
function esp_err_t (line 319) | static esp_err_t panel_gc9503_send_init_cmds(gc9503_panel_t *gc9503)
function esp_err_t (line 385) | static esp_err_t panel_gc9503_init(esp_lcd_panel_t *panel)
function esp_err_t (line 399) | static esp_err_t panel_gc9503_del(esp_lcd_panel_t *panel)
function esp_err_t (line 414) | static esp_err_t panel_gc9503_reset(esp_lcd_panel_t *panel)
function esp_err_t (line 438) | static esp_err_t panel_gc9503_mirror(esp_lcd_panel_t *panel, bool mirror...
function esp_err_t (line 478) | static esp_err_t panel_gc9503_disp_on_off(esp_lcd_panel_t *panel, bool o...
FILE: main/boards/esp-s3-lcd-ev-board/esp_lcd_gc9503.h
type gc9503_lcd_init_cmd_t (line 26) | typedef struct {
type gc9503_vendor_config_t (line 39) | typedef struct {
FILE: main/boards/esp-sensairshuttle/adc_pdm_audio_codec.h
function class (line 10) | class AdcPdmAudioCodec : public AudioCodec {
FILE: main/boards/esp-sensairshuttle/esp-sensairshuttle.cc
class Cst816d (line 70) | class Cst816d : public I2cDevice {
type TouchPoint_t (line 72) | struct TouchPoint_t {
type TouchEvent (line 78) | enum TouchEvent {
method Cst816d (line 85) | Cst816d(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method UpdateTouchPoint (line 97) | void UpdateTouchPoint()
method TouchPoint_t (line 105) | const TouchPoint_t &GetTouchPoint()
method TouchEvent (line 110) | TouchEvent CheckTouchEvent()
method GetPressCount (line 135) | int GetPressCount() const
method ResetPressCount (line 140) | void ResetPressCount()
class EspSensairShuttle (line 154) | class EspSensairShuttle : public WifiBoard {
method InitializeI2c (line 161) | void InitializeI2c()
method touch_event_task (line 178) | static void touch_event_task(void* arg)
method InitializeCst816dTouchPad (line 206) | void InitializeCst816dTouchPad()
method InitializeButtons (line 212) | void InitializeButtons()
method InitializeSpi (line 225) | void InitializeSpi()
method InitializeLcdDisplay (line 237) | void InitializeLcdDisplay()
method EspSensairShuttle (line 284) | EspSensairShuttle() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 292) | virtual AudioCodec* GetAudioCodec() override
method Display (line 304) | virtual Display* GetDisplay() override
method Cst816d (line 309) | Cst816d* GetTouchpad()
FILE: main/boards/esp-sparkbot/config.h
type light_mode_t (line 58) | typedef enum {
FILE: main/boards/esp-sparkbot/esp_sparkbot_board.cc
class SparkBotEs8311AudioCodec (line 21) | class SparkBotEs8311AudioCodec : public Es8311AudioCodec {
method SparkBotEs8311AudioCodec (line 25) | SparkBotEs8311AudioCodec(void* i2c_master_handle, i2c_port_t i2c_port,...
method EnableOutput (line 31) | void EnableOutput(bool enable) override {
class EspSparkBot (line 43) | class EspSparkBot : public WifiBoard {
method InitializeI2c (line 51) | void InitializeI2c() {
method InitializeSpi (line 68) | void InitializeSpi() {
method InitializeButtons (line 79) | void InitializeButtons() {
method InitializeDisplay (line 90) | void InitializeDisplay() {
method InitializeCamera (line 123) | void InitializeCamera() {
method InitializeEchoUart (line 178) | void InitializeEchoUart() {
method SendUartMessage (line 196) | void SendUartMessage(const char * command_str) {
method InitializeTools (line 202) | void InitializeTools() {
method EspSparkBot (line 270) | EspSparkBot() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 281) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 288) | virtual Display* GetDisplay() override {
method Backlight (line 292) | virtual Backlight* GetBacklight() override {
method Camera (line 297) | virtual Camera* GetCamera() override {
FILE: main/boards/esp-spot/esp_spot_board.cc
type Bmi270Imu (line 37) | namespace Bmi270Imu {
function esp_err_t (line 41) | esp_err_t Initialize(i2c_bus_handle_t i2c_bus, uint8_t addr = BMI270_I...
function esp_err_t (line 62) | esp_err_t EnableImuIntForWakeup() {
class EspSpot (line 114) | class EspSpot : public WifiBoard {
method InitializeI2c (line 132) | void InitializeI2c() {
method InitializeI2c (line 170) | void InitializeI2c() {
method InitializeADC (line 188) | void InitializeADC() {
method InitializeButtons (line 216) | void InitializeButtons() {
method InitializePowerCtl (line 257) | void InitializePowerCtl() {
method InitializeGPIO (line 267) | void InitializeGPIO() {
method HandleUserActivity (line 303) | void HandleUserActivity() {
method InitializePowerSaveTimer (line 310) | void InitializePowerSaveTimer() {
method EnterDeepSleep (line 324) | void EnterDeepSleep() {
method BlinkGreenFor5s (line 347) | void BlinkGreenFor5s() {
method EspSpot (line 373) | EspSpot() : boot_button_(BOOT_BUTTON_GPIO), key_button_(KEY_BUTTON_GPI...
method Led (line 383) | virtual Led* GetLed() override {
method AudioCodec (line 388) | virtual AudioCodec* GetAudioCodec() override {
method SetPowerSaveLevel (line 396) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
method GetBatteryLevel (line 403) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
FILE: main/boards/esp-vocat/esp_vocat.cc
class Charge (line 225) | class Charge : public I2cDevice {
method Charge (line 227) | Charge(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_...
method Printcharge (line 235) | void Printcharge()
method TaskFunction (line 248) | static void TaskFunction(void *pvParameters)
class Cst816s (line 261) | class Cst816s : public I2cDevice {
type TouchPoint_t (line 263) | struct TouchPoint_t {
type TouchEvent (line 269) | enum TouchEvent {
method Cst816s (line 276) | Cst816s(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method UpdateTouchPoint (line 300) | void UpdateTouchPoint()
method TouchPoint_t (line 308) | const TouchPoint_t &GetTouchPoint()
method TouchEvent (line 313) | TouchEvent CheckTouchEvent()
method GetPressCount (line 338) | int GetPressCount() const
method ResetPressCount (line 343) | void ResetPressCount()
method SemaphoreHandle_t (line 349) | SemaphoreHandle_t GetTouchSemaphore()
method WaitForTouchEvent (line 354) | bool WaitForTouchEvent(TickType_t timeout = portMAX_DELAY)
method NotifyTouchEvent (line 362) | void NotifyTouchEvent()
class EspVocat (line 383) | class EspVocat : public WifiBoard {
method InitializeI2c (line 397) | void InitializeI2c()
method DetectPcbVersion (line 418) | uint8_t DetectPcbVersion()
method touch_isr_callback (line 454) | static void touch_isr_callback(void* arg)
method touch_event_task (line 462) | static void touch_event_task(void* arg)
method InitializeCharge (line 491) | void InitializeCharge()
method InitializeCst816sTouchPad (line 497) | void InitializeCst816sTouchPad()
method InitializeSpi (line 515) | void InitializeSpi()
method InitializeSt77916Display (line 526) | void InitializeSt77916Display(uint8_t pcb_version)
method InitializeButtons (line 568) | void InitializeButtons()
method InitializeCamera (line 590) | void InitializeCamera() {
method EspVocat (line 643) | EspVocat() : boot_button_(BOOT_BUTTON_GPIO)
method AudioCodec (line 658) | virtual AudioCodec* GetAudioCodec() override
method Display (line 676) | virtual Display* GetDisplay() override
method Cst816s (line 681) | Cst816s* GetTouchpad()
method Backlight (line 686) | virtual Backlight* GetBacklight() override
method Camera (line 691) | virtual Camera* GetCamera() override {
FILE: main/boards/esp-vocat/touch.h
type bsp_touch_config_t (line 28) | typedef struct {
FILE: main/boards/esp32-cgc-144/esp32_cgc_144_board.cc
class ESP32_CGC_144 (line 30) | class ESP32_CGC_144 : public WifiBoard {
method InitializePowerManager (line 41) | void InitializePowerManager() {
method InitializePowerManager (line 52) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 64) | void InitializePowerSaveTimer() {
method InitializeSpi (line 78) | void InitializeSpi() {
method InitializeSt7735Display (line 89) | void InitializeSt7735Display() {
method InitializeButtons (line 122) | void InitializeButtons() {
method InitializeTools (line 141) | void InitializeTools() {
method ESP32_CGC_144 (line 146) | ESP32_CGC_144() :
method AudioCodec (line 157) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 163) | virtual Display* GetDisplay() override {
method Backlight (line 167) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 172) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 184) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/esp32-cgc-144/power_manager.h
function class (line 10) | class PowerManager {
function IsCharging (line 162) | bool IsCharging() {
function IsDischarging (line 170) | bool IsDischarging() {
function GetBatteryLevel (line 175) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 179) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 183) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/esp32-cgc-144/power_manager_lite.h
function class (line 10) | class PowerManager {
function IsCharging (line 161) | bool IsCharging() {
function IsDischarging (line 169) | bool IsDischarging() {
function GetBatteryLevel (line 174) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 178) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 182) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/esp32-cgc/esp32_cgc_board.cc
class ESP32_CGC (line 62) | class ESP32_CGC : public WifiBoard {
method InitializeSpi (line 68) | void InitializeSpi() {
method InitializeLcdDisplay (line 79) | void InitializeLcdDisplay() {
method InitializeButtons (line 125) | void InitializeButtons() {
method InitializeTools (line 144) | void InitializeTools() {
method ESP32_CGC (line 149) | ESP32_CGC() :
method AudioCodec (line 158) | virtual AudioCodec* GetAudioCodec() override
method Display (line 170) | virtual Display* GetDisplay() override {
method Backlight (line 174) | virtual Backlight* GetBacklight() override {
FILE: main/boards/esp32s3-korvo2-v3-rndis/esp32s3_korvo2_v3_board.cc
class Esp32S3Korvo2V3Board (line 54) | class Esp32S3Korvo2V3Board : public RndisBoard {
method InitializePowerManager (line 67) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 73) | void InitializePowerSaveTimer() {
method InitializeI2c (line 84) | void InitializeI2c() {
method I2cDetect (line 101) | void I2cDetect() {
method InitializeTca9554 (line 122) | void InitializeTca9554() {
method EnableLcdCs (line 148) | void EnableLcdCs() {
method InitializeSpi (line 154) | void InitializeSpi() {
method ChangeVol (line 165) | void ChangeVol(int val) {
method MuteVol (line 178) | void MuteVol() {
method InitializeButtons (line 190) | void InitializeButtons() {
method InitializeIli9341Display (line 276) | void InitializeIli9341Display() {
method InitializeSt7789Display (line 318) | void InitializeSt7789Display() {
method InitializeCamera (line 351) | void InitializeCamera() {
method Esp32S3Korvo2V3Board (line 390) | Esp32S3Korvo2V3Board() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 407) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 424) | virtual Display *GetDisplay() override {
method Camera (line 427) | virtual Camera* GetCamera() override {
method GetBatteryLevel (line 430) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 442) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/esp32s3-korvo2-v3-rndis/power_manager.h
function class (line 12) | class PowerManager {
function IsCharging (line 225) | bool IsCharging() {
function IsDischarging (line 233) | bool IsDischarging() {
function GetBatteryLevel (line 238) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 242) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 246) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/esp32s3-korvo2-v3/esp32s3_korvo2_v3_board.cc
class Esp32S3Korvo2V3Board (line 53) | class Esp32S3Korvo2V3Board : public WifiBoard {
method InitializePowerManager (line 66) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 72) | void InitializePowerSaveTimer() {
method InitializeI2c (line 83) | void InitializeI2c() {
method I2cDetect (line 100) | void I2cDetect() {
method InitializeTca9554 (line 121) | void InitializeTca9554() {
method EnableLcdCs (line 147) | void EnableLcdCs() {
method InitializeSpi (line 153) | void InitializeSpi() {
method ChangeVol (line 164) | void ChangeVol(int val) {
method MuteVol (line 177) | void MuteVol() {
method InitializeButtons (line 189) | void InitializeButtons() {
method InitializeIli9341Display (line 280) | void InitializeIli9341Display() {
method InitializeSt7789Display (line 322) | void InitializeSt7789Display() {
method InitializeCamera (line 355) | void InitializeCamera() {
method Esp32S3Korvo2V3Board (line 394) | Esp32S3Korvo2V3Board() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 411) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 428) | virtual Display *GetDisplay() override {
method Camera (line 431) | virtual Camera* GetCamera() override {
method GetBatteryLevel (line 434) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 446) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/esp32s3-korvo2-v3/power_manager.h
function class (line 12) | class PowerManager {
function IsCharging (line 226) | bool IsCharging() {
function IsDischarging (line 234) | bool IsDischarging() {
function GetBatteryLevel (line 239) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 243) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 247) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/genjutech-s3-1.54tft/genjutech-s3-1.54tft.cc
class SparkBotEs8311AudioCodec (line 23) | class SparkBotEs8311AudioCodec : public Es8311AudioCodec {
method SparkBotEs8311AudioCodec (line 27) | SparkBotEs8311AudioCodec(void* i2c_master_handle, i2c_port_t i2c_port,...
method EnableOutput (line 33) | void EnableOutput(bool enable) override {
class GenJuTech_s3_1_54TFT (line 45) | class GenJuTech_s3_1_54TFT : public WifiBoard {
method InitializePowerManager (line 56) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 67) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 79) | void InitializeCodecI2c() {
method InitializeSpi (line 96) | void InitializeSpi() {
method InitializeButtons (line 107) | void InitializeButtons() {
method InitializeSt7789Display (line 159) | void InitializeSt7789Display() {
method GenJuTech_s3_1_54TFT (line 204) | GenJuTech_s3_1_54TFT() :
method Led (line 218) | virtual Led* GetLed() override {
method AudioCodec (line 223) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 230) | virtual Display *GetDisplay() override {
method Backlight (line 234) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 239) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 251) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/genjutech-s3-1.54tft/power_manager.h
function class (line 10) | class PowerManager {
function IsCharging (line 162) | bool IsCharging() {
function IsDischarging (line 170) | bool IsDischarging() {
function GetBatteryLevel (line 175) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 179) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 183) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/hu-087/hu_087_board.cc
class Hu087Board (line 20) | class Hu087Board : public WifiBoard {
method InitializeDisplayI2c (line 28) | void InitializeDisplayI2c() {
method InitializeSsd1306Display (line 45) | void InitializeSsd1306Display() {
method initializeAmpCtrl (line 96) | void initializeAmpCtrl() {
method InitializeButtons (line 108) | void InitializeButtons() {
method Hu087Board (line 131) | Hu087Board() : touch_button_(TOUCH_BUTTON_GPIO) {
method AudioCodec (line 139) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 148) | virtual Display* GetDisplay() override { return display_; }
FILE: main/boards/jiuchuan-s3/esp_lcd_panel_gc9301.c
type gc9309na_panel_t (line 75) | typedef struct {
function esp_err_t (line 100) | esp_err_t esp_lcd_new_panel_gc9309na(const esp_lcd_panel_io_handle_t io,...
function esp_err_t (line 156) | static esp_err_t panel_gc9309na_del(esp_lcd_panel_t *panel)
function esp_err_t (line 168) | static esp_err_t panel_gc9309na_reset(esp_lcd_panel_t *panel)
function esp_err_t (line 189) | static esp_err_t panel_gc9309na_init(esp_lcd_panel_t *panel)
function esp_err_t (line 280) | static esp_err_t panel_gc9309na_draw_bitmap(esp_lcd_panel_t *panel, int ...
function esp_err_t (line 312) | static esp_err_t panel_gc9309na_invert_color(esp_lcd_panel_t *panel, boo...
function esp_err_t (line 327) | static esp_err_t panel_gc9309na_mirror(esp_lcd_panel_t *panel, bool mirr...
function esp_err_t (line 347) | static esp_err_t panel_gc9309na_swap_xy(esp_lcd_panel_t *panel, bool swa...
function esp_err_t (line 362) | static esp_err_t panel_gc9309na_set_gap(esp_lcd_panel_t *panel, int x_ga...
function esp_err_t (line 370) | static esp_err_t panel_gc9309na_disp_on_off(esp_lcd_panel_t *panel, bool...
function esp_err_t (line 377) | static esp_err_t panel_gc9309na_sleep(esp_lcd_panel_t *panel, bool sleep)
FILE: main/boards/jiuchuan-s3/gpio_manager.h
function class (line 7) | class GpioManager {
FILE: main/boards/jiuchuan-s3/jiuchuan_dev_board.cc
class CustomLcdDisplay (line 28) | class CustomLcdDisplay : public SpiLcdDisplay
method CustomLcdDisplay (line 31) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 46) | virtual void SetupUI() override {
class JiuchuanDevBoard (line 62) | class JiuchuanDevBoard : public WifiBoard {
method MapVolumeForDisplay (line 76) | int MapVolumeForDisplay(int internal_volume) {
method InitializePowerManager (line 86) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 97) | void InitializePowerSaveTimer() {
method InitializeI2c (line 153) | void InitializeI2c() {
method InitializeButtons (line 171) | void InitializeButtons() {
method InitializeGC9301isplay (line 286) | void InitializeGC9301isplay()
method JiuchuanDevBoard (line 329) | JiuchuanDevBoard() :
method Led (line 344) | virtual Led* GetLed() override {
method AudioCodec (line 349) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 366) | virtual Display* GetDisplay() override {
method Backlight (line 370) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 375) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 387) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/jiuchuan-s3/power_controller.h
function PowerState (line 8) | enum class PowerState {
FILE: main/boards/jiuchuan-s3/power_manager.h
function class (line 21) | class PowerManager {
function IsCharging (line 142) | bool IsCharging() {
function IsDischarging (line 151) | bool IsDischarging() {
function GetBatteryLevel (line 156) | int32_t GetBatteryLevel() {
function RegisterAllCallbacks (line 160) | void RegisterAllCallbacks() {
function SetPowerState (line 190) | void SetPowerState(PowerState newState) {
function OnLowBatteryStatusChanged (line 194) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 198) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/kevin-box-2/kevin_box_board.cc
class Pmic (line 20) | class Pmic : public Axp2101 {
method Pmic (line 22) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class KevinBoxBoard (line 48) | class KevinBoxBoard : public DualNetworkBoard {
method InitializePowerSaveTimer (line 61) | void InitializePowerSaveTimer() {
method Enable4GModule (line 69) | void Enable4GModule() {
method InitializeDisplayI2c (line 82) | void InitializeDisplayI2c() {
method InitializeSsd1306Display (line 98) | void InitializeSsd1306Display() {
method InitializeCodecI2c (line 145) | void InitializeCodecI2c() {
method InitializeButtons (line 162) | void InitializeButtons() {
method KevinBoxBoard (line 225) | KevinBoxBoard() : DualNetworkBoard(ML307_TX_PIN, ML307_RX_PIN),
method Led (line 240) | virtual Led* GetLed() override {
method AudioCodec (line 245) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 252) | virtual Display* GetDisplay() override {
method GetBatteryLevel (line 256) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
FILE: main/boards/kevin-c3/kevin_c3_board.cc
class KevinBoxBoard (line 15) | class KevinBoxBoard : public WifiBoard {
method InitializeCodecI2c (line 21) | void InitializeCodecI2c() {
method InitializeButtons (line 46) | void InitializeButtons() {
method InitializeTools (line 63) | void InitializeTools() {
method KevinBoxBoard (line 69) | KevinBoxBoard() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 78) | virtual Led* GetLed() override {
method AudioCodec (line 82) | virtual AudioCodec* GetAudioCodec() override {
FILE: main/boards/kevin-c3/led_strip_control.cc
function StripColor (line 14) | StripColor LedStripControl::RGBToColor(int red, int green, int blue) {
FILE: main/boards/kevin-c3/led_strip_control.h
function class (line 6) | class LedStripControl {
FILE: main/boards/kevin-sp-v3-dev/kevin-sp-v3_board.cc
class KEVIN_SP_V3Board (line 20) | class KEVIN_SP_V3Board : public WifiBoard {
method InitializeSpi (line 27) | void InitializeSpi() {
method InitializeButtons (line 38) | void InitializeButtons() {
method InitializeSt7789Display (line 54) | void InitializeSt7789Display() {
method InitializeCamera (line 86) | void InitializeCamera() {
method KEVIN_SP_V3Board (line 123) | KEVIN_SP_V3Board() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 132) | virtual Led* GetLed() override {
method AudioCodec (line 137) | virtual AudioCodec *GetAudioCodec() override {
method Display (line 143) | virtual Display *GetDisplay() override {
method Backlight (line 147) | virtual Backlight* GetBacklight() override {
method Camera (line 152) | virtual Camera* GetCamera() override {
FILE: main/boards/kevin-sp-v4-dev/kevin-sp-v4_board.cc
class KEVIN_SP_V4Board (line 17) | class KEVIN_SP_V4Board : public WifiBoard {
method InitializeCodecI2c (line 24) | void InitializeCodecI2c() {
method InitializeSpi (line 41) | void InitializeSpi() {
method InitializeButtons (line 52) | void InitializeButtons() {
method InitializeSt7789Display (line 68) | void InitializeSt7789Display() {
method InitializeCamera (line 100) | void InitializeCamera() {
method KEVIN_SP_V4Board (line 137) | KEVIN_SP_V4Board() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 147) | virtual Led* GetLed() override {
method AudioCodec (line 152) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 159) | virtual Display *GetDisplay() override {
method Backlight (line 163) | virtual Backlight* GetBacklight() override {
method Camera (line 168) | virtual Camera* GetCamera() override {
FILE: main/boards/kevin-yuying-313lcd/esp_lcd_gc9503.c
type gc9503_panel_t (line 25) | typedef struct
function esp_err_t (line 58) | esp_err_t esp_lcd_new_panel_gc9503(const esp_lcd_panel_io_handle_t io, c...
function esp_err_t (line 293) | static esp_err_t panel_gc9503_send_init_cmds(gc9503_panel_t *gc9503)
function esp_err_t (line 359) | static esp_err_t panel_gc9503_init(esp_lcd_panel_t *panel)
function esp_err_t (line 373) | static esp_err_t panel_gc9503_del(esp_lcd_panel_t *panel)
function esp_err_t (line 388) | static esp_err_t panel_gc9503_reset(esp_lcd_panel_t *panel)
function esp_err_t (line 412) | static esp_err_t panel_gc9503_mirror(esp_lcd_panel_t *panel, bool mirror...
function esp_err_t (line 452) | static esp_err_t panel_gc9503_disp_on_off(esp_lcd_panel_t *panel, bool o...
FILE: main/boards/kevin-yuying-313lcd/esp_lcd_gc9503.h
type gc9503_lcd_init_cmd_t (line 26) | typedef struct {
type gc9503_vendor_config_t (line 39) | typedef struct {
FILE: main/boards/kevin-yuying-313lcd/kevin_yuying_313lcd.cc
class Yuying_313lcd (line 19) | class Yuying_313lcd : public WifiBoard {
method InitializeRGB_GC9503V_Display (line 25) | void InitializeRGB_GC9503V_Display() {
method InitializeCodecI2c (line 105) | void InitializeCodecI2c() {
method InitializeButtons (line 122) | void InitializeButtons() {
method Yuying_313lcd (line 139) | Yuying_313lcd() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 146) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 153) | virtual Display* GetDisplay() override {
method Backlight (line 157) | virtual Backlight* GetBacklight() override {
FILE: main/boards/labplus-ledong-v2/labplus_ledong_v2.cc
class labplus_ledong_v2 (line 20) | class labplus_ledong_v2 : public WifiBoard {
method InitializeI2c (line 26) | void InitializeI2c() {
method InitializeSpi (line 44) | void InitializeSpi() {
method InitializeButtons (line 55) | void InitializeButtons() {
method InitializeJd9853Display (line 71) | void InitializeJd9853Display() {
method labplus_ledong_v2 (line 123) | labplus_ledong_v2() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 131) | virtual Led* GetLed() override {
method AudioCodec (line 136) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 153) | virtual Display* GetDisplay() override {
method Backlight (line 157) | virtual Backlight* GetBacklight() override {
FILE: main/boards/labplus-mpython-v3/mpython_pro.cc
class mpython_v3 (line 17) | class mpython_v3 : public WifiBoard {
method InitializeI2c (line 23) | void InitializeI2c() {
method InitializeSpi (line 41) | void InitializeSpi() {
method InitializeButtons (line 52) | void InitializeButtons() {
method InitializeSt7789Display (line 68) | void InitializeSt7789Display() {
method mpython_v3 (line 103) | mpython_v3() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 111) | virtual Led* GetLed() override {
method AudioCodec (line 116) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 133) | virtual Display* GetDisplay() override {
method Backlight (line 137) | virtual Backlight* GetBacklight() override {
FILE: main/boards/lceda-course-examples/eda-robot-pro/eda_dog_controller.cc
class EDARobotDogController (line 20) | class EDARobotDogController {
type DogActionParams (line 27) | struct DogActionParams {
type ActionType (line 35) | enum ActionType {
method ActionTask (line 49) | static void ActionTask(void *arg) {
method StartActionTaskIfNeeded (line 106) | void StartActionTaskIfNeeded() {
method QueueAction (line 113) | void QueueAction(int action_type, int steps, int speed, int direction,
method LoadTrimsFromNVS (line 123) | void LoadTrimsFromNVS() {
method EDARobotDogController (line 140) | EDARobotDogController() {
method RegisterMcpTools (line 155) | void RegisterMcpTools() {
function InitializeEDARobotDogController (line 394) | void InitializeEDARobotDogController() {
FILE: main/boards/lceda-course-examples/eda-robot-pro/eda_dog_movements.cc
function millis (line 23) | unsigned long IRAM_ATTR millis() {
FILE: main/boards/lceda-course-examples/eda-robot-pro/eda_dog_movements.h
function class (line 30) | class EDARobotDog {
FILE: main/boards/lceda-course-examples/eda-robot-pro/eda_robot_pro.cc
class EDARobotPro (line 20) | class EDARobotPro : public WifiBoard {
method InitializeDisplayI2c (line 28) | void InitializeDisplayI2c() {
method InitializeSsd1306Display (line 44) | void InitializeSsd1306Display() {
method InitializeEDARobotDogController (line 94) | void InitializeEDARobotDogController() {
method InitializeButtons (line 98) | void InitializeButtons() {
method EDARobotPro (line 111) | EDARobotPro() :
method AudioCodec (line 122) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 128) | virtual Display* GetDisplay() override {
FILE: main/boards/lceda-course-examples/eda-robot-pro/oscillator.h
function class (line 30) | class Oscillator {
FILE: main/boards/lceda-course-examples/eda-super-bear/eda_super_bear.cc
class EdaSuperBear (line 18) | class EdaSuperBear : public WifiBoard {
method InitializeDisplay (line 23) | void InitializeDisplay() {
method InitializeButtons (line 28) | void InitializeButtons() {
method EdaSuperBear (line 40) | EdaSuperBear() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 47) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 55) | virtual Display* GetDisplay() override { return display_; }
FILE: main/boards/lceda-course-examples/eda-super-bear/eda_super_bear_controller.cc
class EdaSuperBearController (line 20) | class EdaSuperBearController {
type EdaRobotActionParams (line 28) | struct EdaRobotActionParams {
type ActionType (line 36) | enum ActionType {
method ActionTask (line 56) | static void ActionTask(void* arg) {
method StartActionTaskIfNeeded (line 139) | void StartActionTaskIfNeeded() {
method QueueAction (line 146) | void QueueAction(int action_type, int steps, int speed, int direction,...
method LoadTrimsFromNVS (line 161) | void LoadTrimsFromNVS() {
method EdaSuperBearController (line 178) | EdaSuperBearController() {
method RegisterMcpTools (line 194) | void RegisterMcpTools() {
function InitializeEdaSuperBearController (line 488) | void InitializeEdaSuperBearController() {
FILE: main/boards/lceda-course-examples/eda-super-bear/eda_super_bear_movements.cc
function millis (line 25) | unsigned long IRAM_ATTR millis() {
FILE: main/boards/lceda-course-examples/eda-super-bear/eda_super_bear_movements.h
function class (line 33) | class EdaRobot {
FILE: main/boards/lceda-course-examples/eda-super-bear/oscillator.h
function class (line 30) | class Oscillator {
FILE: main/boards/lceda-course-examples/eda-tv-pro/eda-tv-pro.cc
class eda_tv_pro (line 18) | class eda_tv_pro : public WifiBoard {
method InitializeSpi (line 24) | void InitializeSpi() {
method InitializeLcdDisplay (line 35) | void InitializeLcdDisplay() {
method InitializeButtons (line 70) | void InitializeButtons() {
method eda_tv_pro (line 82) | eda_tv_pro() :
method Led (line 93) | virtual Led* GetLed() override {
method AudioCodec (line 98) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 109) | virtual Display* GetDisplay() override {
method Backlight (line 113) | virtual Backlight* GetBacklight() override {
FILE: main/boards/lichuang-c3-dev/lichuang_c3_dev_board.cc
class LichuangC3DevBoard (line 16) | class LichuangC3DevBoard : public WifiBoard {
method InitializeI2c (line 22) | void InitializeI2c() {
method InitializeSpi (line 39) | void InitializeSpi() {
method InitializeButtons (line 50) | void InitializeButtons() {
method InitializeSt7789Display (line 61) | void InitializeSt7789Display() {
method LichuangC3DevBoard (line 95) | LichuangC3DevBoard() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 103) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 119) | virtual Display* GetDisplay() override {
method Backlight (line 123) | virtual Backlight* GetBacklight() override {
FILE: main/boards/lichuang-dev/lichuang_dev_board.cc
class Pca9557 (line 22) | class Pca9557 : public I2cDevice {
method Pca9557 (line 24) | Pca9557(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method SetOutputState (line 29) | void SetOutputState(uint8_t bit, uint8_t level) {
class CustomAudioCodec (line 36) | class CustomAudioCodec : public BoxAudioCodec {
method CustomAudioCodec (line 41) | CustomAudioCodec(i2c_master_bus_handle_t i2c_bus, Pca9557* pca9557)
method EnableOutput (line 57) | virtual void EnableOutput(bool enable) override {
class LichuangDevBoard (line 67) | class LichuangDevBoard : public WifiBoard {
method InitializeI2c (line 76) | void InitializeI2c() {
method InitializeSpi (line 96) | void InitializeSpi() {
method InitializeButtons (line 107) | void InitializeButtons() {
method InitializeSt7789Display (line 128) | void InitializeSt7789Display() {
method InitializeTouch (line 168) | void InitializeTouch()
method InitializeCamera (line 207) | void InitializeCamera() {
method InitializeTools (line 242) | void InitializeTools() {
method LichuangDevBoard (line 254) | LichuangDevBoard() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 266) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 273) | virtual Display* GetDisplay() override {
method Backlight (line 277) | virtual Backlight* GetBacklight() override {
method Camera (line 282) | virtual Camera* GetCamera() override {
FILE: main/boards/lilygo-t-cameraplus-s3/ir_filter_controller.h
function class (line 7) | class IrFilterController {
FILE: main/boards/lilygo-t-cameraplus-s3/lilygo-t-cameraplus-s3.cc
class Cst816x (line 20) | class Cst816x : public I2cDevice {
type TouchPoint_t (line 22) | struct TouchPoint_t {
method Cst816x (line 28) | Cst816x(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method UpdateTouchPoint (line 38) | void UpdateTouchPoint() {
method TouchPoint_t (line 45) | const TouchPoint_t &GetTouchPoint() {
class Pmic (line 54) | class Pmic : public Sy6970 {
method Pmic (line 57) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Sy6970(i2c_bus, ...
class LilygoTCameraPlusS3Board (line 67) | class LilygoTCameraPlusS3Board : public WifiBoard {
method InitializePowerSaveTimer (line 78) | void InitializePowerSaveTimer() {
method InitI2c (line 94) | void InitI2c(){
method I2cDetect (line 111) | void I2cDetect() {
method TouchpadDaemon (line 132) | static void TouchpadDaemon(void *param) {
method InitCst816d (line 155) | void InitCst816d() {
method InitSpi (line 161) | void InitSpi() {
method InitSy6970 (line 172) | void InitSy6970() {
method InitializeSt7789Display (line 177) | void InitializeSt7789Display() {
method InitializeButtons (line 209) | void InitializeButtons() {
method InitializeCamera (line 227) | void InitializeCamera() {
method InitializeTools (line 278) | void InitializeTools() {
method LilygoTCameraPlusS3Board (line 283) | LilygoTCameraPlusS3Board() : boot_button_(BOOT_BUTTON_GPIO), key1_butt...
method AudioCodec (line 297) | virtual AudioCodec *GetAudioCodec() override {
method Display (line 311) | virtual Display *GetDisplay() override{
method GetBatteryLevel (line 315) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 329) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
method Backlight (line 336) | virtual Backlight* GetBacklight() override {
method Cst816x (line 341) | Cst816x *GetTouchpad() {
method Camera (line 345) | virtual Camera* GetCamera() override {
FILE: main/boards/lilygo-t-cameraplus-s3/tcamerapluss3_audio_codec.h
function class (line 9) | class Tcamerapluss3AudioCodec : public AudioCodec {
FILE: main/boards/lilygo-t-circle-s3/esp_lcd_gc9d01n.c
type gc9d01n_panel_t (line 28) | typedef struct{
function esp_err_t (line 42) | esp_err_t esp_lcd_new_panel_gc9d01n(const esp_lcd_panel_io_handle_t io, ...
function esp_err_t (line 136) | static esp_err_t panel_gc9d01n_del(esp_lcd_panel_t *panel){
function esp_err_t (line 147) | static esp_err_t panel_gc9d01n_reset(esp_lcd_panel_t *panel){
function esp_err_t (line 219) | static esp_err_t panel_gc9d01n_init(esp_lcd_panel_t *panel){
function esp_err_t (line 268) | static esp_err_t panel_gc9d01n_draw_bitmap(esp_lcd_panel_t *panel, int x...
function esp_err_t (line 288) | static esp_err_t panel_gc9d01n_invert_color(esp_lcd_panel_t *panel, bool...
function esp_err_t (line 301) | static esp_err_t panel_gc9d01n_mirror(esp_lcd_panel_t *panel, bool mirro...
function esp_err_t (line 318) | static esp_err_t panel_gc9d01n_swap_xy(esp_lcd_panel_t *panel, bool swap...
function esp_err_t (line 330) | static esp_err_t panel_gc9d01n_set_gap(esp_lcd_panel_t *panel, int x_gap...
function esp_err_t (line 337) | static esp_err_t panel_gc9d01n_disp_on_off(esp_lcd_panel_t *panel, bool ...
FILE: main/boards/lilygo-t-circle-s3/esp_lcd_gc9d01n.h
type gc9d01n_lcd_init_cmd_t (line 13) | typedef struct {
type gc9d01n_vendor_config_t (line 26) | typedef struct {
FILE: main/boards/lilygo-t-circle-s3/lilygo-t-circle-s3.cc
class Cst816x (line 18) | class Cst816x : public I2cDevice {
type TouchPoint_t (line 20) | struct TouchPoint_t {
method Cst816x (line 26) | Cst816x(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method UpdateTouchPoint (line 36) | void UpdateTouchPoint() {
method TouchPoint_t (line 43) | const TouchPoint_t &GetTouchPoint() {
class LilygoTCircleS3Board (line 52) | class LilygoTCircleS3Board : public WifiBoard {
method InitializePowerSaveTimer (line 60) | void InitializePowerSaveTimer() {
method InitI2c (line 73) | void InitI2c(){
method I2cDetect (line 90) | void I2cDetect() {
method touchpad_daemon (line 111) | static void touchpad_daemon(void *param) {
method InitCst816d (line 134) | void InitCst816d() {
method InitSpi (line 140) | void InitSpi() {
method InitGc9d01nDisplay (line 151) | void InitGc9d01nDisplay() {
method InitializeButtons (line 199) | void InitializeButtons() {
method LilygoTCircleS3Board (line 212) | LilygoTCircleS3Board() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 223) | virtual AudioCodec *GetAudioCodec() override {
method Display (line 237) | virtual Display *GetDisplay() override{
method SetPowerSaveLevel (line 241) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
method Backlight (line 248) | virtual Backlight* GetBacklight() override {
method Cst816x (line 253) | Cst816x *GetTouchpad() {
FILE: main/boards/lilygo-t-circle-s3/tcircles3_audio_codec.h
function class (line 9) | class Tcircles3AudioCodec : public AudioCodec {
FILE: main/boards/lilygo-t-display-p4/hi8561_driver.cc
function esp_err_t (line 119) | esp_err_t esp_lcd_new_panel_hi8561(const esp_lcd_panel_io_handle_t io, c...
function esp_err_t (line 184) | static esp_err_t panel_hi8561_send_init_cmds(hi8561_panel_t *hi8561)
function esp_err_t (line 261) | static esp_err_t panel_hi8561_del(esp_lcd_panel_t *panel)
function esp_err_t (line 277) | static esp_err_t panel_hi8561_init(esp_lcd_panel_t *panel)
function esp_err_t (line 287) | static esp_err_t panel_hi8561_reset(esp_lcd_panel_t *panel)
function esp_err_t (line 309) | static esp_err_t panel_hi8561_sleep(esp_lcd_panel_t *panel, bool sleep)
function esp_err_t (line 330) | static esp_err_t panel_hi8561_on_off(esp_lcd_panel_t *panel, bool on_off)
function esp_err_t (line 351) | static esp_err_t panel_hi8561_mirror(esp_lcd_panel_t *panel, bool mirror...
function esp_err_t (line 383) | static esp_err_t panel_hi8561_invert_color(esp_lcd_panel_t *panel, bool ...
FILE: main/boards/lilygo-t-display-p4/hi8561_driver.h
type hi8561_lcd_init_cmd_t (line 21) | typedef struct
type hi8561_vendor_config_t (line 35) | typedef struct
FILE: main/boards/lilygo-t-display-p4/lilygo-t-display-p4.cc
class CustomBacklight (line 25) | class CustomBacklight : public Backlight {
method CustomBacklight (line 30) | CustomBacklight(std::unique_ptr<Cpp_Bus_Driver::Tool> tool) : tool_(st...
method SetBrightnessImpl (line 32) | void SetBrightnessImpl(uint8_t brightness) override{
method CustomBacklight (line 42) | CustomBacklight(esp_lcd_panel_handle_t panel) : mipi_dpi_panel_(panel) {}
method SetBrightnessImpl (line 44) | void SetBrightnessImpl(uint8_t brightness) override{
class CustomBacklight (line 37) | class CustomBacklight : public Backlight {
method CustomBacklight (line 30) | CustomBacklight(std::unique_ptr<Cpp_Bus_Driver::Tool> tool) : tool_(st...
method SetBrightnessImpl (line 32) | void SetBrightnessImpl(uint8_t brightness) override{
method CustomBacklight (line 42) | CustomBacklight(esp_lcd_panel_handle_t panel) : mipi_dpi_panel_(panel) {}
method SetBrightnessImpl (line 44) | void SetBrightnessImpl(uint8_t brightness) override{
class LilygoTDisplayP4Board (line 53) | class LilygoTDisplayP4Board : public WifiBoard {
method Init_Ldo_Channel_Power (line 80) | bool Init_Ldo_Channel_Power(uint8_t chan_id, uint32_t voltage_mv){
method InitializeCodecI2c (line 94) | void InitializeCodecI2c() {
method InitializeXl9535 (line 111) | void InitializeXl9535() {
method InitializeLCD (line 150) | void InitializeLCD() {
method InitializeTouch (line 247) | void InitializeTouch(){
method AppToggleChatState (line 269) | void AppToggleChatState(void){
method InitializeButtons (line 279) | void InitializeButtons() {
method LilygoTDisplayP4Board (line 285) | LilygoTDisplayP4Board() :
method AudioCodec (line 295) | virtual AudioCodec *GetAudioCodec() override {
method Display (line 302) | virtual Display *GetDisplay() override {
method Backlight (line 307) | virtual Backlight* GetBacklight() override {
method Backlight (line 312) | virtual Backlight* GetBacklight() override {
function TouchTask (line 322) | void TouchTask(void *arg) {
FILE: main/boards/lilygo-t-display-p4/rm69a10_driver.cc
function esp_err_t (line 82) | esp_err_t esp_lcd_new_panel_rm69a10(const esp_lcd_panel_io_handle_t io, ...
function esp_err_t (line 146) | static esp_err_t panel_rm69a10_send_init_cmds(rm69a10_panel_t *rm69a10)
function esp_err_t (line 224) | static esp_err_t panel_rm69a10_del(esp_lcd_panel_t *panel)
function esp_err_t (line 240) | static esp_err_t panel_rm69a10_init(esp_lcd_panel_t *panel)
function esp_err_t (line 250) | static esp_err_t panel_rm69a10_reset(esp_lcd_panel_t *panel)
function esp_err_t (line 272) | static esp_err_t panel_rm69a10_sleep(esp_lcd_panel_t *panel, bool sleep)
function esp_err_t (line 293) | static esp_err_t panel_rm69a10_on_off(esp_lcd_panel_t *panel, bool on_off)
function esp_err_t (line 314) | static esp_err_t panel_rm69a10_mirror(esp_lcd_panel_t *panel, bool mirro...
function esp_err_t (line 346) | static esp_err_t panel_rm69a10_invert_color(esp_lcd_panel_t *panel, bool...
function esp_err_t (line 367) | esp_err_t set_rm69a10_brightness(esp_lcd_panel_t *panel, uint8_t brightn...
FILE: main/boards/lilygo-t-display-p4/rm69a10_driver.h
type rm69a10_lcd_init_cmd_t (line 21) | typedef struct
type rm69a10_vendor_config_t (line 35) | typedef struct
FILE: main/boards/lilygo-t-display-s3-pro-mvsrlora/lilygo-t-display-s3-pro-mvsrlora.cc
class Cst2xxse (line 18) | class Cst2xxse : public I2cDevice {
type TouchPoint_t (line 20) | struct TouchPoint_t {
method Cst2xxse (line 26) | Cst2xxse(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2...
method UpdateTouchPoint (line 36) | void UpdateTouchPoint() {
method TouchPoint_t (line 44) | const TouchPoint_t &GetTouchPoint() {
class Sy6970 (line 53) | class Sy6970 : public I2cDevice {
method Sy6970 (line 56) | Sy6970(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_...
class LilygoTDisplays3ProMVSRLoraBoard (line 70) | class LilygoTDisplays3ProMVSRLoraBoard : public WifiBoard {
method InitializePowerSaveTimer (line 79) | void InitializePowerSaveTimer() {
method InitI2c (line 92) | void InitI2c(){
method I2cDetect (line 109) | void I2cDetect() {
method touchpad_daemon (line 130) | static void touchpad_daemon(void *param) {
method InitCst226se (line 153) | void InitCst226se() {
method InitSy6970 (line 159) | void InitSy6970() {
method InitSpi (line 164) | void InitSpi() {
method InitSt7796Display (line 175) | void InitSt7796Display() {
method InitializeButtons (line 223) | void InitializeButtons() {
method LilygoTDisplays3ProMVSRLoraBoard (line 236) | LilygoTDisplays3ProMVSRLoraBoard() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 248) | virtual AudioCodec *GetAudioCodec() override {
method Display (line 262) | virtual Display *GetDisplay() override{
method SetPowerSaveLevel (line 266) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
method Backlight (line 273) | virtual Backlight* GetBacklight() override {
method Cst2xxse (line 278) | Cst2xxse *GetTouchpad() {
FILE: main/boards/lilygo-t-display-s3-pro-mvsrlora/tdisplays3promvsrlora_audio_codec.h
function class (line 9) | class Tdisplays3promvsrloraAudioCodec : public AudioCodec {
FILE: main/boards/m5stack-cardputer-adv/m5stack_cardputer_adv.cc
class M5StackCardputerAdvBoard (line 18) | class M5StackCardputerAdvBoard : public WifiBoard {
method InitializeI2c (line 26) | void InitializeI2c() {
method I2cDetect (line 43) | void I2cDetect() {
method InitializeSpi (line 65) | void InitializeSpi() {
method InitializeSt7789Display (line 77) | void InitializeSt7789Display() {
method InitializeButtons (line 109) | void InitializeButtons() {
method M5StackCardputerAdvBoard (line 121) | M5StackCardputerAdvBoard() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 130) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 147) | virtual Display* GetDisplay() override {
method Backlight (line 151) | virtual Backlight* GetBacklight() override {
FILE: main/boards/m5stack-core-s3/cores3_audio_codec.h
function class (line 9) | class CoreS3AudioCodec : public AudioCodec {
FILE: main/boards/m5stack-core-s3/m5stack_core_s3.cc
class Pmic (line 20) | class Pmic : public Axp2101 {
method Pmic (line 23) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
method SetBrightness (line 36) | void SetBrightness(uint8_t brightness) {
class CustomBacklight (line 42) | class CustomBacklight : public Backlight {
method CustomBacklight (line 44) | CustomBacklight(Pmic *pmic) : pmic_(pmic) {}
method SetBrightnessImpl (line 46) | void SetBrightnessImpl(uint8_t brightness) override {
class Aw9523 (line 55) | class Aw9523 : public I2cDevice {
method Aw9523 (line 58) | Aw9523(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_...
method ResetAw88298 (line 68) | void ResetAw88298() {
method ResetIli9342 (line 76) | void ResetIli9342() {
class Ft6336 (line 85) | class Ft6336 : public I2cDevice {
type TouchPoint_t (line 87) | struct TouchPoint_t {
method Ft6336 (line 93) | Ft6336(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_...
method UpdateTouchPoint (line 103) | void UpdateTouchPoint() {
method TouchPoint_t (line 110) | inline const TouchPoint_t& GetTouchPoint() {
class M5StackCoreS3Board (line 119) | class M5StackCoreS3Board : public WifiBoard {
method InitializePowerSaveTimer (line 130) | void InitializePowerSaveTimer() {
method InitializeI2c (line 146) | void InitializeI2c() {
method I2cDetect (line 163) | void I2cDetect() {
method InitializeAxp2101 (line 184) | void InitializeAxp2101() {
method InitializeAw9523 (line 189) | void InitializeAw9523() {
method PollTouchpad (line 195) | void PollTouchpad() {
method InitializeFt6336TouchPad (line 225) | void InitializeFt6336TouchPad() {
method InitializeSpi (line 245) | void InitializeSpi() {
method InitializeIli9342Display (line 256) | void InitializeIli9342Display() {
method InitializeCamera (line 292) | void InitializeCamera() {
method M5StackCoreS3Board (line 334) | M5StackCoreS3Board() {
method AudioCodec (line 347) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 362) | virtual Display* GetDisplay() override {
method Camera (line 366) | virtual Camera* GetCamera() override {
method GetBatteryLevel (line 370) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 383) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
method Backlight (line 390) | virtual Backlight *GetBacklight() override {
FILE: main/boards/m5stack-tab5/esp_lcd_st7123.c
type st7123_panel_t (line 29) | typedef struct {
function esp_err_t (line 55) | esp_err_t esp_lcd_new_panel_st7123(const esp_lcd_panel_io_handle_t io, c...
function esp_err_t (line 173) | static esp_err_t panel_st7123_del(esp_lcd_panel_t *panel)
function esp_err_t (line 188) | static esp_err_t panel_st7123_init(esp_lcd_panel_t *panel)
function esp_err_t (line 285) | static esp_err_t panel_st7123_reset(esp_lcd_panel_t *panel)
function esp_err_t (line 304) | static esp_err_t panel_st7123_invert_color(esp_lcd_panel_t *panel, bool ...
function esp_err_t (line 322) | static esp_err_t panel_st7123_mirror(esp_lcd_panel_t *panel, bool mirror...
function esp_err_t (line 350) | static esp_err_t panel_st7123_disp_on_off(esp_lcd_panel_t *panel, bool o...
function esp_err_t (line 365) | static esp_err_t panel_st7123_sleep(esp_lcd_panel_t *panel, bool sleep)
FILE: main/boards/m5stack-tab5/esp_lcd_st7123.h
type st7123_lcd_init_cmd_t (line 28) | typedef struct {
type st7123_vendor_config_t (line 41) | typedef struct {
FILE: main/boards/m5stack-tab5/m5stack_tab5.cc
class Pi4ioe1 (line 51) | class Pi4ioe1 : public I2cDevice {
method Pi4ioe1 (line 53) | Pi4ioe1(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method ReadOutSet (line 65) | uint8_t ReadOutSet() { return ReadReg(PI4IO_REG_OUT_SET); }
method WriteOutSet (line 66) | void WriteOutSet(uint8_t value) { WriteReg(PI4IO_REG_OUT_SET, value); }
class Pi4ioe2 (line 69) | class Pi4ioe2 : public I2cDevice {
method Pi4ioe2 (line 71) | Pi4ioe2(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method ReadOutSet (line 83) | uint8_t ReadOutSet() { return ReadReg(PI4IO_REG_OUT_SET); }
method WriteOutSet (line 84) | void WriteOutSet(uint8_t value) { WriteReg(PI4IO_REG_OUT_SET, value); }
class M5StackTab5Board (line 87) | class M5StackTab5Board : public WifiBoard {
method InitializeI2c (line 97) | void InitializeI2c() {
method esp_err_t (line 113) | static esp_err_t bsp_enable_dsi_phy_power() {
method I2cDetect (line 122) | void I2cDetect() {
method InitializePi4ioe (line 143) | void InitializePi4ioe() {
method InitializeButtons (line 149) | void InitializeButtons() {
method InitializeGt911TouchPad (line 160) | void InitializeGt911TouchPad() {
method InitializeIli9881cDisplay (line 188) | void InitializeIli9881cDisplay() {
method InitializeSt7123Display (line 264) | void InitializeSt7123Display() {
method InitializeSt7123TouchPad (line 380) | void InitializeSt7123TouchPad() {
method InitializeDisplay (line 413) | void InitializeDisplay() {
method InitializeCamera (line 429) | void InitializeCamera() {
method M5StackTab5Board (line 470) | M5StackTab5Board() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 484) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 500) | virtual Display* GetDisplay() override {
method Camera (line 504) | virtual Camera* GetCamera() override {
method Backlight (line 508) | virtual Backlight* GetBacklight() override {
method SetChargeQcEn (line 514) | void SetChargeQcEn(bool en) {
method SetChargeEn (line 526) | void SetChargeEn(bool en) {
method SetUsb5vEn (line 538) | void SetUsb5vEn(bool en) {
method SetExt5vEn (line 550) | void SetExt5vEn(bool en) {
FILE: main/boards/m5stack-tab5/tab5_audio_codec.h
function class (line 9) | class Tab5AudioCodec : public AudioCodec {
FILE: main/boards/magiclick-2p4/magiclick_2p4_board.cc
class NV3023Display (line 21) | class NV3023Display : public SpiLcdDisplay {
method NV3023Display (line 23) | NV3023Display(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle...
method SetupUI (line 28) | void SetupUI() override {
class magiclick_2p4 (line 52) | class magiclick_2p4 : public WifiBoard {
method InitializePowerManager (line 66) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 77) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 91) | void InitializeCodecI2c() {
method InitializeButtons (line 108) | void InitializeButtons() {
method InitializeLedPower (line 164) | void InitializeLedPower() {
method InitializeSpi (line 171) | void InitializeSpi() {
method InitializeNv3023Display (line 182) | void InitializeNv3023Display(){
method magiclick_2p4 (line 217) | magiclick_2p4() :
method Led (line 231) | virtual Led* GetLed() override {
method AudioCodec (line 236) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 243) | virtual Display* GetDisplay() override {
method Backlight (line 247) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 252) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 264) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/magiclick-2p5/magiclick_2p5_board.cc
class magiclick_2p5 (line 62) | class magiclick_2p5 : public DualNetworkBoard {
type DisplayConfig (line 76) | struct DisplayConfig {
method DisplayConfig (line 89) | DisplayConfig GetDisplayConfig() {
method InitializePowerManager (line 134) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 145) | void InitializePowerSaveTimer() {
method Enable4GModule (line 159) | void Enable4GModule() {
method Disable4GModule (line 165) | void Disable4GModule() {
method InitializeCodecI2c (line 172) | void InitializeCodecI2c() {
method CheckNetType (line 189) | void CheckNetType() {
method CheckPCBVersion (line 199) | void CheckPCBVersion() {
method InitializeButtons (line 236) | void InitializeButtons() {
method InitializeLedPower (line 296) | void InitializeLedPower() {
method InitializeSpi (line 303) | void InitializeSpi() {
method InitializeLcdDisplay (line 314) | void InitializeLcdDisplay(){
method magiclick_2p5 (line 367) | magiclick_2p5() : DualNetworkBoard(ML307_TX_PIN, ML307_RX_PIN, GPIO_NU...
method Led (line 383) | virtual Led* GetLed() override {
method AudioCodec (line 388) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 395) | virtual Display* GetDisplay() override {
method Backlight (line 399) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 404) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 416) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/magiclick-2p5/power_manager.h
function class (line 13) | class PowerManager {
function IsCharging (line 170) | bool IsCharging() {
function IsDischarging (line 179) | bool IsDischarging() {
function GetBatteryLevel (line 184) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 188) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 192) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/magiclick-c3-v2/magiclick_c3_v2_board.cc
class GC9107Display (line 21) | class GC9107Display : public SpiLcdDisplay {
method GC9107Display (line 23) | GC9107Display(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle...
method SetupUI (line 28) | void SetupUI() override {
class magiclick_c3_v2 (line 86) | class magiclick_c3_v2 : public WifiBoard {
method InitializePowerSaveTimer (line 93) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 106) | void InitializeCodecI2c() {
method InitializeButtons (line 131) | void InitializeButtons() {
method InitializeSpi (line 148) | void InitializeSpi() {
method InitializeGc9107Display (line 159) | void InitializeGc9107Display(){
method magiclick_c3_v2 (line 199) | magiclick_c3_v2() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 211) | virtual Led* GetLed() override {
method AudioCodec (line 216) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 223) | virtual Display* GetDisplay() override {
method Backlight (line 227) | virtual Backlight* GetBacklight() override {
FILE: main/boards/magiclick-c3/magiclick_c3_board.cc
class NV3023Display (line 19) | class NV3023Display : public SpiLcdDisplay {
method NV3023Display (line 21) | NV3023Display(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle...
method SetupUI (line 26) | void SetupUI() override {
class magiclick_c3 (line 50) | class magiclick_c3 : public WifiBoard {
method InitializePowerSaveTimer (line 57) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 70) | void InitializeCodecI2c() {
method InitializeButtons (line 95) | void InitializeButtons() {
method InitializeSpi (line 112) | void InitializeSpi() {
method InitializeNv3023Display (line 123) | void InitializeNv3023Display(){
method magiclick_c3 (line 157) | magiclick_c3() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 169) | virtual Led* GetLed() override {
method AudioCodec (line 174) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 181) | virtual Display* GetDisplay() override {
method Backlight (line 185) | virtual Backlight* GetBacklight() override {
FILE: main/boards/minsi-k08-dual/minsi_k08_dual.cc
class MINSI_K08_DUAL (line 28) | class MINSI_K08_DUAL : public DualNetworkBoard {
method InitializePowerManager (line 40) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 53) | void InitializePowerSaveTimer() {
method InitializeSpi (line 80) | void InitializeSpi() {
method InitializeLcdDisplay (line 91) | void InitializeLcdDisplay() {
method InitializeButtons (line 126) | void InitializeButtons() {
method InitializeTools (line 182) | void InitializeTools() {
method MINSI_K08_DUAL (line 187) | MINSI_K08_DUAL() : DualNetworkBoard(ML307_TX_PIN, ML307_RX_PIN),
method Led (line 202) | virtual Led* GetLed() override {
method AudioCodec (line 207) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 213) | virtual Display* GetDisplay() override {
method Backlight (line 217) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 225) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 238) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/minsi-k08-dual/power_manager.h
function class (line 10) | class PowerManager {
function IsCharging (line 163) | bool IsCharging() {
function IsDischarging (line 171) | bool IsDischarging() {
function GetBatteryLevel (line 176) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 180) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 184) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/mixgo-nova/mixgo-nova.cc
class MIXGO_NOVA (line 18) | class MIXGO_NOVA : public WifiBoard {
method InitializeI2c (line 26) | void InitializeI2c() {
method InitializeSpi (line 43) | void InitializeSpi() {
method InitializeButtons (line 54) | void InitializeButtons() {
method InitializeSt7789Display (line 95) | void InitializeSt7789Display() {
method MIXGO_NOVA (line 129) | MIXGO_NOVA() :
method Led (line 142) | virtual Led* GetLed() override {
method AudioCodec (line 147) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 154) | virtual Display* GetDisplay() override {
method Backlight (line 158) | virtual Backlight* GetBacklight() override {
FILE: main/boards/movecall-cuican-esp32s3/movecall_cuican_esp32s3.cc
class MovecallCuicanESP32S3 (line 22) | class MovecallCuicanESP32S3 : public WifiBoard {
method InitializeCodecI2c (line 28) | void InitializeCodecI2c() {
method InitializeSpi (line 46) | void InitializeSpi() {
method InitializeGc9a01Display (line 54) | void InitializeGc9a01Display() {
method InitializeButtons (line 81) | void InitializeButtons() {
method MovecallCuicanESP32S3 (line 93) | MovecallCuicanESP32S3() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 101) | virtual Led* GetLed() override {
method Display (line 106) | virtual Display* GetDisplay() override {
method Backlight (line 110) | virtual Backlight* GetBacklight() override {
method AudioCodec (line 115) | virtual AudioCodec* GetAudioCodec() override {
FILE: main/boards/movecall-moji-esp32s3/movecall_moji_esp32s3.cc
class CustomLcdDisplay (line 22) | class CustomLcdDisplay : public SpiLcdDisplay {
method CustomLcdDisplay (line 24) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 38) | virtual void SetupUI() override {
class MovecallMojiESP32S3 (line 49) | class MovecallMojiESP32S3 : public WifiBoard {
method InitializeCodecI2c (line 55) | void InitializeCodecI2c() {
method InitializeSpi (line 73) | void InitializeSpi() {
method InitializeGc9a01Display (line 81) | void InitializeGc9a01Display() {
method InitializeButtons (line 108) | void InitializeButtons() {
method MovecallMojiESP32S3 (line 120) | MovecallMojiESP32S3() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 128) | virtual Led* GetLed() override {
method Display (line 133) | virtual Display* GetDisplay() override {
method Backlight (line 137) | virtual Backlight* GetBacklight() override {
method AudioCodec (line 142) | virtual AudioCodec* GetAudioCodec() override {
FILE: main/boards/movecall-moji2-esp32c5/config.h
type PowerSupply (line 8) | enum PowerSupply {
FILE: main/boards/movecall-moji2-esp32c5/movecall_moji2_esp32s3.cc
class MovecallMoji2ESP32C5 (line 216) | class MovecallMoji2ESP32C5 : public WifiBoard {
method InitializeBatteryMonitor (line 227) | void InitializeBatteryMonitor() {
method InitializePowerSaveTimer (line 241) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 252) | void InitializeCodecI2c() {
method InitializeSpi (line 270) | void InitializeSpi() {
method InitializeSt77916Display (line 282) | void InitializeSt77916Display() {
method InitializeButtons (line 319) | void InitializeButtons() {
method InitializeTools (line 346) | void InitializeTools() {
method MovecallMoji2ESP32C5 (line 352) | MovecallMoji2ESP32C5() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 363) | virtual Led* GetLed() override {
method Display (line 368) | virtual Display* GetDisplay() override {
method Backlight (line 372) | virtual Backlight* GetBacklight() override {
method AudioCodec (line 377) | virtual AudioCodec* GetAudioCodec() override {
method GetBatteryLevel (line 384) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
FILE: main/boards/otto-robot/config.h
type OttoCameraType (line 15) | enum OttoCameraType {
type HardwareConfig (line 26) | struct HardwareConfig {
FILE: main/boards/otto-robot/oscillator.h
function class (line 30) | class Oscillator {
FILE: main/boards/otto-robot/otto_controller.cc
class OttoController (line 23) | class OttoController {
type OttoActionParams (line 31) | struct OttoActionParams {
type ActionType (line 40) | enum ActionType {
method ActionTask (line 71) | static void ActionTask(void* arg) {
method StartActionTaskIfNeeded (line 420) | void StartActionTaskIfNeeded() {
method QueueAction (line 427) | void QueueAction(int action_type, int steps, int speed, int direction,...
method QueueServoSequence (line 448) | void QueueServoSequence(const char* servo_sequence_json) {
method LoadTrimsFromNVS (line 479) | void LoadTrimsFromNVS() {
method OttoController (line 496) | OttoController(const HardwareConfig& hw_config) {
method RegisterMcpTools (line 522) | void RegisterMcpTools() {
function InitializeOttoController (line 844) | void InitializeOttoController(const HardwareConfig& hw_config) {
FILE: main/boards/otto-robot/otto_emoji_display.h
function class (line 9) | class OttoEmojiDisplay : public SpiLcdDisplay {
FILE: main/boards/otto-robot/otto_movements.cc
function millis (line 26) | unsigned long IRAM_ATTR millis() {
FILE: main/boards/otto-robot/otto_movements.h
function class (line 33) | class Otto {
FILE: main/boards/otto-robot/otto_robot.cc
class OttoRobot (line 28) | class OttoRobot : public WifiBoard {
method DetectHardwareVersion (line 41) | bool DetectHardwareVersion() {
method InitializePowerManager (line 161) | void InitializePowerManager() {
method InitializeSpi (line 166) | void InitializeSpi() {
method InitializeLcdDisplay (line 177) | void InitializeLcdDisplay() {
method InitializeButtons (line 209) | void InitializeButtons() {
method InitializeOttoController (line 220) | void InitializeOttoController() { ::InitializeOttoController(hw_config...
method HardwareConfig (line 223) | const HardwareConfig& GetHardwareConfig() const { return hw_config_; }
method OttoCameraType (line 225) | OttoCameraType GetCameraType() const { return camera_type_; }
method InitializeWebSocketControlServer (line 228) | void InitializeWebSocketControlServer() {
method StartNetwork (line 236) | void StartNetwork() override {
method InitializeCamera (line 243) | bool InitializeCamera() {
method InitializeAudioCodec (line 309) | void InitializeAudioCodec() {
method OttoRobot (line 325) | OttoRobot()
method AudioCodec (line 394) | virtual AudioCodec* GetAudioCodec() override { return audio_codec_; }
method Display (line 396) | virtual Display* GetDisplay() override { return display_; }
method Backlight (line 398) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 407) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method Camera (line 414) | virtual Camera* GetCamera() override { return has_camera_ ? camera_ : ...
FILE: main/boards/otto-robot/power_manager.h
function class (line 9) | class PowerManager {
function InitializeAdc (line 116) | void InitializeAdc() {
function IsCharging (line 143) | bool IsCharging() { return is_charging_; }
function GetBatteryLevel (line 145) | uint8_t GetBatteryLevel() { return battery_level_; }
function PauseBatteryUpdate (line 148) | static void PauseBatteryUpdate() { battery_update_paused_ = true; }
function ResumeBatteryUpdate (line 149) | static void ResumeBatteryUpdate() { battery_update_paused_ = false; }
FILE: main/boards/otto-robot/websocket_control_server.cc
function esp_err_t (line 23) | esp_err_t WebSocketControlServer::ws_handler(httpd_req_t *req) {
FILE: main/boards/otto-robot/websocket_control_server.h
function class (line 9) | class WebSocketControlServer {
FILE: main/boards/sensecap-watcher/sensecap_audio_codec.h
function class (line 9) | class SensecapAudioCodec : public AudioCodec {
FILE: main/boards/sensecap-watcher/sensecap_watcher.cc
class CustomLcdDisplay (line 36) | class CustomLcdDisplay : public SpiLcdDisplay {
method CustomLcdDisplay (line 38) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 52) | virtual void SetupUI() override {
class SensecapWatcher (line 105) | class SensecapWatcher : public WifiBoard {
method InitializePowerSaveTimer (line 120) | void InitializePowerSaveTimer() {
method InitializeI2c (line 143) | void InitializeI2c() {
method esp_err_t (line 183) | esp_err_t IoExpanderSetLevel(uint16_t pin_mask, uint8_t level) {
method IoExpanderGetLevel (line 187) | uint8_t IoExpanderGetLevel(uint16_t pin_mask) {
method InitializeExpander (line 194) | void InitializeExpander() {
method OnKnobRotate (line 213) | void OnKnobRotate(bool clockwise) {
method InitializeKnob (line 239) | void InitializeKnob() {
method InitializeButton (line 248) | void InitializeButton() {
method InitializeSpi (line 306) | void InitializeSpi() {
method Initializespd2010Display (line 333) | void Initializespd2010Display() {
method BatterygetVoltage (line 384) | uint16_t BatterygetVoltage(void) {
method BatterygetPercent (line 422) | uint8_t BatterygetPercent(bool print = false) {
method InitializeCmd (line 436) | void InitializeCmd() {
method InitializeCamera (line 566) | void InitializeCamera() {
method SensecapWatcher (line 588) | SensecapWatcher() {
method AudioCodec (line 602) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 619) | virtual Display* GetDisplay() override {
method Backlight (line 623) | virtual Backlight* GetBacklight() override {
method Led (line 631) | virtual Led* GetLed() override {
method SetPowerSaveLevel (line 636) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
method GetBatteryLevel (line 643) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
method Camera (line 660) | virtual Camera* GetCamera() override {
FILE: main/boards/sensecap-watcher/sscma_camera.cc
function __himax_keepalive_check (line 20) | static bool __himax_keepalive_check(sscma_client_handle_t client)
FILE: main/boards/sensecap-watcher/sscma_camera.h
type SscmaData (line 18) | struct SscmaData {
type JpegData (line 22) | struct JpegData {
function class (line 27) | class SscmaCamera : public Camera {
FILE: main/boards/sp-esp32-s3-1.28-box/power_manager.h
function class (line 11) | class PowerManager {
function IsCharging (line 165) | bool IsCharging() {
function IsDischarging (line 173) | bool IsDischarging() {
function GetBatteryLevel (line 178) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 182) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 186) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/sp-esp32-s3-1.28-box/sp-esp32-s3-1.28-box.cc
class Cst816d (line 36) | class Cst816d : public I2cDevice {
type TouchPoint_t (line 38) | struct TouchPoint_t {
method Cst816d (line 43) | Cst816d(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method UpdateTouchPoint (line 57) | void UpdateTouchPoint() {
method TouchPoint_t (line 68) | const TouchPoint_t& GetTouchPoint() const {
method Probe (line 72) | static bool Probe(i2c_master_bus_handle_t i2c_bus, uint8_t addr, uint8...
class CustomLcdDisplay (line 106) | class CustomLcdDisplay : public SpiLcdDisplay {
method CustomLcdDisplay (line 108) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 122) | virtual void SetupUI() override {
class Spotpear_ESP32_S3_1_28_BOX (line 134) | class Spotpear_ESP32_S3_1_28_BOX : public WifiBoard {
method InitializePowerSaveTimer (line 146) | void InitializePowerSaveTimer() {
method InitializePowerManager (line 177) | void InitializePowerManager() {
method InitializeCodecI2c (line 188) | void InitializeCodecI2c() {
method InitializeCodecI2c_Touch (line 205) | void InitializeCodecI2c_Touch() {
method touchpad_timer_callback (line 227) | static void touchpad_timer_callback(void* arg) {
method InitializeCst816DTouchPad (line 260) | void InitializeCst816DTouchPad() {
method InitializeSpi (line 318) | void InitializeSpi() {
method InitializeGc9a01Display (line 326) | void InitializeGc9a01Display() {
method InitializeButtons (line 372) | void InitializeButtons() {
method Spotpear_ESP32_S3_1_28_BOX (line 385) | Spotpear_ESP32_S3_1_28_BOX() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 439) | virtual Led* GetLed() override {
method Display (line 444) | virtual Display* GetDisplay() override {
method Backlight (line 448) | virtual Backlight* GetBacklight() override {
method AudioCodec (line 453) | virtual AudioCodec* GetAudioCodec() override {
method Cst816d (line 460) | Cst816d* GetTouchpad() {
method GetBatteryLevel (line 464) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 483) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/sp-esp32-s3-1.54-muma/power_manager.h
function class (line 10) | class PowerManager {
function IsCharging (line 162) | bool IsCharging() {
function IsDischarging (line 170) | bool IsDischarging() {
function GetBatteryLevel (line 175) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 179) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 183) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/sp-esp32-s3-1.54-muma/sp-esp32-s3-1.54-muma.cc
class Cst816d (line 30) | class Cst816d : public I2cDevice {
type TouchPoint_t (line 32) | struct TouchPoint_t {
method Cst816d (line 37) | Cst816d(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method UpdateTouchPoint (line 47) | void UpdateTouchPoint() {
method TouchPoint_t (line 54) | const TouchPoint_t& GetTouchPoint() {
class Spotpear_esp32_s3_lcd_1_54 (line 63) | class Spotpear_esp32_s3_lcd_1_54 : public WifiBoard {
method InitializePowerManager (line 76) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 87) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 112) | void InitializeCodecI2c() {
method InitializeCodecI2c_Touch (line 129) | void InitializeCodecI2c_Touch() {
method touchpad_timer_callback (line 146) | static void touchpad_timer_callback(void* arg) {
method InitializeCst816DTouchPad (line 177) | void InitializeCst816DTouchPad() {
method EnableLcdCs (line 194) | void EnableLcdCs() {
method InitializeSpi (line 200) | void InitializeSpi() {
method InitializeSt7789Display (line 211) | void InitializeSt7789Display() {
method InitializeButtons (line 250) | void InitializeButtons() {
method Spotpear_esp32_s3_lcd_1_54 (line 263) | Spotpear_esp32_s3_lcd_1_54() :boot_button_(BOOT_BUTTON_GPIO){
method Led (line 280) | virtual Led* GetLed() override {
method Display (line 285) | virtual Display* GetDisplay() override {
method AudioCodec (line 289) | virtual AudioCodec* GetAudioCodec() override {
method Backlight (line 296) | virtual Backlight* GetBacklight() override {
method Cst816d (line 301) | Cst816d* GetTouchpad() {
method GetBatteryLevel (line 305) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 317) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/surfer-c3-1.14tft/power_manager.h
function class (line 10) | class PowerManager {
FILE: main/boards/surfer-c3-1.14tft/surfer-c3-1.14tft.cc
class SurferC3114TFT (line 22) | class SurferC3114TFT : public WifiBoard {
method InitializeI2c (line 32) | void InitializeI2c() {
method InitializePowerManager (line 57) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 69) | void InitializePowerSaveTimer() {
method InitializeSpi (line 94) | void InitializeSpi() {
method InitializeButtons (line 105) | void InitializeButtons() {
method InitializeSt7789Display (line 116) | void InitializeSt7789Display() {
method SurferC3114TFT (line 149) | SurferC3114TFT() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 164) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 180) | virtual Display* GetDisplay() override {
method Backlight (line 184) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 189) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 201) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/taiji-pi-s3/taiji_pi_s3.cc
class Cst816s (line 425) | class Cst816s : public I2cDevice {
type TouchPoint_t (line 427) | struct TouchPoint_t {
method Cst816s (line 432) | Cst816s(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method UpdateTouchPoint (line 442) | void UpdateTouchPoint() {
method TouchPoint_t (line 449) | const TouchPoint_t& GetTouchPoint() {
class TaijiPiS3Board (line 458) | class TaijiPiS3Board : public WifiBoard {
method InitializeI2c (line 465) | void InitializeI2c() {
method touchpad_timer_callback (line 482) | static void touchpad_timer_callback(void* arg) {
method InitializeCst816sTouchPad (line 514) | void InitializeCst816sTouchPad() {
method BspLcdBlSet (line 531) | void BspLcdBlSet(int brightness_percent)
method InitializeSpi (line 546) | void InitializeSpi() {
method Initializest77916Display (line 558) | void Initializest77916Display() {
method InitializeMute (line 595) | void InitializeMute() {
method TaijiPiS3Board (line 603) | TaijiPiS3Board() {
method AudioCodec (line 612) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 649) | virtual Display* GetDisplay() override {
method Backlight (line 653) | virtual Backlight* GetBacklight() override {
method Cst816s (line 658) | Cst816s* GetTouchpad() {
FILE: main/boards/tudouzi/kevin_box_board.cc
class Pmic (line 20) | class Pmic : public Axp2101 {
method Pmic (line 22) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class KevinBoxBoard (line 48) | class KevinBoxBoard : public Ml307Board {
method InitializePowerSaveTimer (line 61) | void InitializePowerSaveTimer() {
method Enable4GModule (line 72) | void Enable4GModule() {
method InitializeDisplayI2c (line 85) | void InitializeDisplayI2c() {
method InitializeSsd1306Display (line 101) | void InitializeSsd1306Display() {
method InitializeCodecI2c (line 148) | void InitializeCodecI2c() {
method InitializeButtons (line 165) | void InitializeButtons() {
method KevinBoxBoard (line 210) | KevinBoxBoard() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN),
method Led (line 225) | virtual Led* GetLed() override {
method AudioCodec (line 230) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 237) | virtual Display* GetDisplay() override {
method GetBatteryLevel (line 241) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
FILE: main/boards/waveshare/esp32-c6-lcd-1.69/esp32-c6-lcd-1.69.cc
class CustomLcdDisplay (line 22) | class CustomLcdDisplay : public SpiLcdDisplay {
method CustomLcdDisplay (line 24) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 39) | virtual void SetupUI() override {
class CustomButton (line 49) | class CustomButton: public Button {
method OnPressDownDel (line 51) | void OnPressDownDel(void) {
method OnPressUpDel (line 58) | void OnPressUpDel(void) {
class CustomBoard (line 67) | class CustomBoard : public WifiBoard {
method InitializePowerManager (line 76) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 81) | void InitializePowerSaveTimer() {
method InitializeI2c (line 95) | void InitializeI2c() {
method InitializeSpi (line 112) | void InitializeSpi() {
method InitializeLcdDisplay (line 124) | void InitializeLcdDisplay() {
method InitializeButtons (line 166) | void InitializeButtons() {
method CustomBoard (line 205) | CustomBoard() :
method AudioCodec (line 216) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 233) | virtual Display* GetDisplay() override {
method Backlight (line 237) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 242) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 254) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-c6-lcd-1.69/power_manager.h
function class (line 13) | class PowerManager {
function GetBatteryLevel (line 106) | int GetBatteryLevel(void) {
function IsCharging (line 142) | bool IsCharging(void) {
function IsDischarging (line 149) | bool IsDischarging(void) {
function IsChargingDone (line 156) | bool IsChargingDone(void) {
function PowerOff (line 163) | void PowerOff(void) {
function PowerON (line 169) | void PowerON(void) {
FILE: main/boards/waveshare/esp32-c6-touch-amoled-1.32/esp32-c6-touch-amoled-1.32.cc
class CustomLcdDisplay (line 32) | class CustomLcdDisplay : public SpiLcdDisplay {
method my_draw_event_cb (line 37) | static void my_draw_event_cb(lv_event_t *e) {
method SetMIRROR_XY (line 52) | void SetMIRROR_XY(uint8_t mirror) {
method CustomLcdDisplay (line 61) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle, esp_lcd_panel_ha...
method SetupUI (line 69) | virtual void SetupUI() override {
class CustomBoard (line 79) | class CustomBoard : public WifiBoard {
method InitializeI2c (line 90) | void InitializeI2c() {
method SetDispbacklight (line 103) | void SetDispbacklight(uint8_t backlight) {
method InitializeButtons (line 112) | void InitializeButtons() {
method InitializeSpi (line 130) | void InitializeSpi() {
method InitializeLcdDisplay (line 141) | void InitializeLcdDisplay() {
method InitializeTools (line 174) | void InitializeTools() {
method CheckPowerKeyState (line 189) | void CheckPowerKeyState() {
method CustomBoard (line 204) | CustomBoard() : boot_button_(BOOT_BUTTON_GPIO), pwr_button_(PWR_KEY_GP...
method AudioCodec (line 213) | virtual AudioCodec *GetAudioCodec() override {
method Display (line 218) | virtual Display *GetDisplay() override {
FILE: main/boards/waveshare/esp32-c6-touch-amoled-1.43/esp32-c6-touch-amoled-1.43.cc
class CustomLcdDisplay (line 30) | class CustomLcdDisplay : public SpiLcdDisplay {
method MyDrawEventCb (line 32) | static void MyDrawEventCb(lv_event_t *e) {
method CustomLcdDisplay (line 46) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 61) | virtual void SetupUI() override {
class CustomBoard (line 70) | class CustomBoard : public WifiBoard {
method InitializeI2c (line 83) | void InitializeI2c() {
method InitializeTca9554 (line 100) | void InitializeTca9554(void) {
method InitializeSpi (line 110) | void InitializeSpi() {
method InitializeLcdDisplay (line 122) | void InitializeLcdDisplay() {
method InitializeButtons (line 160) | void InitializeButtons() { //接入锂电池时,可长按PWR开机/关机
method InitializeTouch (line 195) | void InitializeTouch() {
method TouchInputReadCallback (line 210) | static void TouchInputReadCallback(lv_indev_t * indev, lv_indev_data_t...
method InitializeTools (line 236) | void InitializeTools()
method SetDispbacklight (line 249) | void SetDispbacklight(uint8_t backlight) {
method CustomBoard (line 259) | CustomBoard() :
method AudioCodec (line 269) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 286) | virtual Display* GetDisplay() override {
FILE: main/boards/waveshare/esp32-c6-touch-amoled-1.8/esp32-c6-touch-amoled-1.8.cc
class Pmic (line 28) | class Pmic : public Axp2101 {
method Pmic (line 30) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class CustomLcdDisplay (line 73) | class CustomLcdDisplay : public SpiLcdDisplay {
method CustomLcdDisplay (line 75) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 90) | virtual void SetupUI() override {
class CustomBacklight (line 100) | class CustomBacklight : public Backlight {
method CustomBacklight (line 102) | CustomBacklight(esp_lcd_panel_io_handle_t panel_io) : Backlight(), pan...
method SetBrightnessImpl (line 107) | virtual void SetBrightnessImpl(uint8_t brightness) override {
class WaveshareEsp32c6TouchAMOLED1inch8 (line 119) | class WaveshareEsp32c6TouchAMOLED1inch8 : public WifiBoard {
method InitializePowerSaveTimer (line 129) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 145) | void InitializeCodecI2c() {
method InitializeTca9554 (line 162) | void InitializeTca9554(void) {
method InitializeAxp2101 (line 179) | void InitializeAxp2101() {
method InitializeSpi (line 184) | void InitializeSpi() {
method InitializeButtons (line 196) | void InitializeButtons() {
method InitializeSH8601Display (line 207) | void InitializeSH8601Display() {
method InitializeTouch (line 249) | void InitializeTouch()
method InitializeTools (line 282) | void InitializeTools() {
method WaveshareEsp32c6TouchAMOLED1inch8 (line 294) | WaveshareEsp32c6TouchAMOLED1inch8() :
method AudioCodec (line 307) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 314) | virtual Display* GetDisplay() override {
method Backlight (line 318) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 322) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 335) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-c6-touch-amoled-2.06/esp32-c6-touch-amoled-2.06.cc
class Pmic (line 26) | class Pmic : public Axp2101 {
method Pmic (line 28) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class CustomLcdDisplay (line 76) | class CustomLcdDisplay : public SpiLcdDisplay {
method rounder_event_cb (line 78) | static void rounder_event_cb(lv_event_t* e) {
method CustomLcdDisplay (line 94) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 109) | virtual void SetupUI() override {
class CustomBacklight (line 120) | class CustomBacklight : public Backlight {
method CustomBacklight (line 122) | CustomBacklight(esp_lcd_panel_io_handle_t panel_io) : Backlight(), pan...
method SetBrightnessImpl (line 127) | virtual void SetBrightnessImpl(uint8_t brightness) override {
class WaveshareEsp32c6TouchAMOLED2inch06 (line 139) | class WaveshareEsp32c6TouchAMOLED2inch06 : public WifiBoard {
method InitializePowerSaveTimer (line 148) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 161) | void InitializeCodecI2c() {
method InitializeAxp2101 (line 175) | void InitializeAxp2101() {
method InitializeSpi (line 180) | void InitializeSpi() {
method InitializeButtons (line 192) | void InitializeButtons() {
method InitializeSH8601Display (line 213) | void InitializeSH8601Display() {
method InitializeTools (line 253) | void InitializeTools() {
method WaveshareEsp32c6TouchAMOLED2inch06 (line 265) | WaveshareEsp32c6TouchAMOLED2inch06() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 275) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 292) | virtual Display* GetDisplay() override {
method Backlight (line 296) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 300) | virtual bool GetBatteryLevel(int &level, bool &charging, bool &dischar...
method SetPowerSaveLevel (line 314) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-c6-touch-lcd-1.83/esp32-c6-touch-lcd-1.83.cc
class Pmic (line 24) | class Pmic : public Axp2101 {
method Pmic (line 26) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class WaveshareEsp32c6TouchLCD1inch83 (line 53) | class WaveshareEsp32c6TouchLCD1inch83 : public WifiBoard {
method InitializePowerSaveTimer (line 61) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 74) | void InitializeCodecI2c() {
method InitializeAxp2101 (line 88) | void InitializeAxp2101() {
method InitializeSpi (line 93) | void InitializeSpi() {
method InitializeButtons (line 104) | void InitializeButtons() {
method InitializeDisplay (line 124) | void InitializeDisplay() {
method InitializeTouch (line 156) | void InitializeTouch() {
method InitializeTools (line 188) | void InitializeTools() {
method WaveshareEsp32c6TouchLCD1inch83 (line 200) | WaveshareEsp32c6TouchLCD1inch83() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 212) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 229) | virtual Display* GetDisplay() override {
method Backlight (line 233) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 238) | virtual bool GetBatteryLevel(int &level, bool &charging, bool &dischar...
method SetPowerSaveLevel (line 252) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-p4-nano/esp32-p4-nano.cc
class CustomBacklight (line 27) | class CustomBacklight : public Backlight {
method CustomBacklight (line 29) | CustomBacklight(i2c_master_bus_handle_t i2c_handle)
method SetBrightnessImpl (line 35) | virtual void SetBrightnessImpl(uint8_t brightness) override {
class WaveshareEsp32p4nano (line 64) | class WaveshareEsp32p4nano : public WifiBoard {
method InitializeCodecI2c (line 72) | void InitializeCodecI2c() {
method esp_err_t (line 89) | static esp_err_t bsp_enable_dsi_phy_power(void) {
method InitializeLCD (line 104) | void InitializeLCD() {
method InitializeTouch (line 184) | void InitializeTouch()
method InitializeCamera (line 215) | void InitializeCamera() {
method InitializeButtons (line 232) | void InitializeButtons() {
method WaveshareEsp32p4nano (line 245) | WaveshareEsp32p4nano() :
method AudioCodec (line 254) | virtual AudioCodec *GetAudioCodec() override {
method Display (line 261) | virtual Display *GetDisplay() override {
method Camera (line 265) | virtual Camera* GetCamera() override {
method Backlight (line 269) | virtual Backlight *GetBacklight() override {
FILE: main/boards/waveshare/esp32-p4-wifi6-touch-lcd/esp32-p4-wifi6-touch-lcd.cc
class WaveshareEsp32p4 (line 38) | class WaveshareEsp32p4 : public WifiBoard {
method esp_err_t (line 46) | esp_err_t i2c_device_probe(uint8_t addr) {
method InitializeCodecI2c (line 50) | void InitializeCodecI2c() {
method esp_err_t (line 67) | static esp_err_t bsp_enable_dsi_phy_power(void) {
method InitializeLCD (line 82) | void InitializeLCD() {
method InitializeTouch (line 333) | void InitializeTouch()
method InitializeCamera (line 377) | void InitializeCamera() {
method InitializeButtons (line 394) | void InitializeButtons() {
method WaveshareEsp32p4 (line 407) | WaveshareEsp32p4() :
method AudioCodec (line 417) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 434) | virtual Display *GetDisplay() override {
method Camera (line 438) | virtual Camera* GetCamera() override {
method Backlight (line 442) | virtual Backlight* GetBacklight() override {
FILE: main/boards/waveshare/esp32-s3-audio-board/esp32-s3-audio_board.cc
class CustomBoard (line 28) | class CustomBoard : public WifiBoard {
method InitializeI2c (line 36) | void InitializeI2c() {
method InitializeTca9555 (line 47) | void InitializeTca9555(void)
method InitializeSpi (line 71) | void InitializeSpi() {
method InitializeSt7789Display (line 82) | void InitializeSt7789Display() {
method InitializeJd9853Display (line 114) | void InitializeJd9853Display() {
method InitializeButtons (line 147) | void InitializeButtons() {
method InitializeCamera (line 158) | void InitializeCamera() {
method CustomBoard (line 199) | CustomBoard() :
method Led (line 214) | virtual Led* GetLed() override {
method AudioCodec (line 219) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 225) | virtual Display* GetDisplay() override {
method Backlight (line 229) | virtual Backlight* GetBacklight() override {
method Camera (line 234) | virtual Camera* GetCamera() override {
FILE: main/boards/waveshare/esp32-s3-audio-board/esp_lcd_jd9853.c
type jd9853_panel_t (line 34) | typedef struct
function esp_err_t (line 49) | esp_err_t esp_lcd_new_panel_jd9853(const esp_lcd_panel_io_handle_t io, c...
function esp_err_t (line 151) | static esp_err_t panel_jd9853_del(esp_lcd_panel_t *panel)
function esp_err_t (line 164) | static esp_err_t panel_jd9853_reset(esp_lcd_panel_t *panel)
type lcd_init_cmd_t (line 186) | typedef struct
function esp_err_t (line 276) | static esp_err_t panel_jd9853_init(esp_lcd_panel_t *panel)
function esp_err_t (line 340) | static esp_err_t panel_jd9853_draw_bitmap(esp_lcd_panel_t *panel, int x_...
function esp_err_t (line 375) | static esp_err_t panel_jd9853_invert_color(esp_lcd_panel_t *panel, bool ...
function esp_err_t (line 392) | static esp_err_t panel_jd9853_mirror(esp_lcd_panel_t *panel, bool mirror...
function esp_err_t (line 416) | static esp_err_t panel_jd9853_swap_xy(esp_lcd_panel_t *panel, bool swap_...
function esp_err_t (line 432) | static esp_err_t panel_jd9853_set_gap(esp_lcd_panel_t *panel, int x_gap,...
function esp_err_t (line 440) | static esp_err_t panel_jd9853_disp_on_off(esp_lcd_panel_t *panel, bool o...
FILE: main/boards/waveshare/esp32-s3-audio-board/esp_lcd_jd9853.h
type jd9853_lcd_init_cmd_t (line 24) | typedef struct {
type jd9853_vendor_config_t (line 37) | typedef struct {
FILE: main/boards/waveshare/esp32-s3-epaper-1.54/board_power_bsp.h
function class (line 4) | class BoardPowerBsp {
FILE: main/boards/waveshare/esp32-s3-epaper-1.54/custom_lcd_display.h
type COLOR_IMAGE (line 8) | typedef enum {
type custom_lcd_spi_t (line 14) | typedef struct {
function class (line 26) | class CustomLcdDisplay : public LcdDisplay {
FILE: main/boards/waveshare/esp32-s3-epaper-1.54/waveshare-s3-epaper-1.54.cc
class CustomBoard (line 18) | class CustomBoard : public WifiBoard {
method InitializeI2c (line 28) | void InitializeI2c() {
method InitializeButtons (line 41) | void InitializeButtons() {
method InitializeTools (line 61) | void InitializeTools() {
method InitializeLcdDisplay (line 69) | void InitializeLcdDisplay() {
method Power_Init (line 82) | void Power_Init() {
method BatterygetVoltage (line 92) | uint16_t BatterygetVoltage(void) {
method BatterygetPercent (line 132) | uint8_t BatterygetPercent() {
method CustomBoard (line 146) | CustomBoard() : boot_button_(BOOT_BUTTON_GPIO), pwr_button_(VBAT_PWR_G...
method AudioCodec (line 154) | virtual AudioCodec *GetAudioCodec() override {
method Display (line 159) | virtual Display *GetDisplay() override {
method GetBatteryLevel (line 163) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
FILE: main/boards/waveshare/esp32-s3-epaper-3.97/custom_lcd_display.h
type COLOR_IMAGE (line 8) | typedef enum {
type custom_epd_spi_t (line 14) | typedef struct {
function class (line 25) | class CustomEpdDisplay : public LcdDisplay {
FILE: main/boards/waveshare/esp32-s3-epaper-3.97/waveshare-s3-epaper-3.97.cc
class Pmic (line 22) | class Pmic : public Axp2101 {
method Pmic (line 24) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class WaveshareEsp32s3ePaper3inch97 (line 56) | class WaveshareEsp32s3ePaper3inch97 : public WifiBoard {
method InitializePowerSaveTimer (line 65) | void InitializePowerSaveTimer() {
method InitializeI2c (line 75) | void InitializeI2c() {
method InitializeButtons (line 88) | void InitializeButtons() {
method InitializeAxp2101 (line 107) | void InitializeAxp2101() {
method InitializeTools (line 112) | void InitializeTools() {
method InitializeEpdDisplay (line 121) | void InitializeEpdDisplay() {
method WaveshareEsp32s3ePaper3inch97 (line 137) | WaveshareEsp32s3ePaper3inch97()
method AudioCodec (line 147) | virtual AudioCodec* GetAudioCodec() override {
method GetBatteryLevel (line 155) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method Display (line 168) | virtual Display* GetDisplay() override { return display_; }
method SetPowerSaveLevel (line 170) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-s3-rlcd-4.2/custom_lcd_display.h
type ColorSelection (line 7) | enum ColorSelection {
type spi_display_config_t (line 12) | typedef struct {
function class (line 20) | class CustomLcdDisplay : public LcdDisplay {
FILE: main/boards/waveshare/esp32-s3-rlcd-4.2/waveshare-s3-rlcd-4.2.cc
class CustomBoard (line 18) | class CustomBoard : public WifiBoard {
method InitializeI2c (line 27) | void InitializeI2c() {
method InitializeButtons (line 40) | void InitializeButtons() {
method InitializeTools (line 60) | void InitializeTools() {
method InitializeLcdDisplay (line 69) | void InitializeLcdDisplay() {
method BatterygetVoltage (line 79) | uint16_t BatterygetVoltage(void) {
method BatterygetPercent (line 119) | uint8_t BatterygetPercent() {
method CustomBoard (line 133) | CustomBoard() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 140) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 157) | virtual Display* GetDisplay() override {
method GetBatteryLevel (line 161) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
FILE: main/boards/waveshare/esp32-s3-touch-amoled-1.32/esp32-s3-touch-amoled-1.32.cc
class CustomLcdDisplay (line 32) | class CustomLcdDisplay : public SpiLcdDisplay {
method my_draw_event_cb (line 37) | static void my_draw_event_cb(lv_event_t *e) {
method SetMIRROR_XY (line 52) | void SetMIRROR_XY(uint8_t mirror) {
method CustomLcdDisplay (line 61) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle, esp_lcd_panel_ha...
method SetupUI (line 69) | virtual void SetupUI() override {
class CustomBoard (line 79) | class CustomBoard : public WifiBoard {
method InitializeI2c (line 90) | void InitializeI2c() {
method SetDispbacklight (line 103) | void SetDispbacklight(uint8_t backlight) {
method InitializeButtons (line 112) | void InitializeButtons() {
method InitializeSpi (line 130) | void InitializeSpi() {
method InitializeLcdDisplay (line 141) | void InitializeLcdDisplay() {
method InitializeTools (line 174) | void InitializeTools() {
method CheckPowerKeyState (line 189) | void CheckPowerKeyState() {
method CustomBoard (line 204) | CustomBoard() : boot_button_(BOOT_BUTTON_GPIO), pwr_button_(PWR_BUTTON...
method AudioCodec (line 213) | virtual AudioCodec *GetAudioCodec() override {
method Display (line 218) | virtual Display *GetDisplay() override {
FILE: main/boards/waveshare/esp32-s3-touch-amoled-1.75/esp32-s3-touch-amoled-1.75.cc
class Pmic (line 28) | class Pmic : public Axp2101 {
method Pmic (line 30) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class CustomLcdDisplay (line 81) | class CustomLcdDisplay : public SpiLcdDisplay {
method rounder_event_cb (line 83) | static void rounder_event_cb(lv_event_t* e) {
method CustomLcdDisplay (line 99) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 114) | virtual void SetupUI() override {
class CustomBacklight (line 125) | class CustomBacklight : public Backlight {
method CustomBacklight (line 127) | CustomBacklight(esp_lcd_panel_io_handle_t panel_io) : Backlight(), pan...
method SetBrightnessImpl (line 132) | virtual void SetBrightnessImpl(uint8_t brightness) override {
class WaveshareEsp32s3TouchAMOLED1inch75 (line 144) | class WaveshareEsp32s3TouchAMOLED1inch75 : public WifiBoard {
method InitializePowerSaveTimer (line 154) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 167) | void InitializeCodecI2c() {
method InitializeTca9554 (line 181) | void InitializeTca9554(void) {
method InitializeAxp2101 (line 189) | void InitializeAxp2101() {
method InitializeSpi (line 194) | void InitializeSpi() {
method InitializeButtons (line 206) | void InitializeButtons() {
method InitializeDisplay (line 226) | void InitializeDisplay() {
method InitializeTouch (line 265) | void InitializeTouch() {
method InitializeTools (line 297) | void InitializeTools() {
method WaveshareEsp32s3TouchAMOLED1inch75 (line 309) | WaveshareEsp32s3TouchAMOLED1inch75() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 323) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 340) | virtual Display* GetDisplay() override {
method Backlight (line 344) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 348) | virtual bool GetBatteryLevel(int &level, bool &charging, bool &dischar...
method SetPowerSaveLevel (line 362) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc
class Pmic (line 28) | class Pmic : public Axp2101 {
method Pmic (line 30) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class CustomLcdDisplay (line 73) | class CustomLcdDisplay : public SpiLcdDisplay {
method CustomLcdDisplay (line 75) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 90) | virtual void SetupUI() override {
class CustomBacklight (line 100) | class CustomBacklight : public Backlight {
method CustomBacklight (line 102) | CustomBacklight(esp_lcd_panel_io_handle_t panel_io) : Backlight(), pan...
method SetBrightnessImpl (line 107) | virtual void SetBrightnessImpl(uint8_t brightness) override {
class WaveshareEsp32s3TouchAMOLED1inch8 (line 119) | class WaveshareEsp32s3TouchAMOLED1inch8 : public WifiBoard {
method InitializePowerSaveTimer (line 129) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 145) | void InitializeCodecI2c() {
method InitializeTca9554 (line 162) | void InitializeTca9554(void) {
method InitializeAxp2101 (line 179) | void InitializeAxp2101() {
method InitializeSpi (line 184) | void InitializeSpi() {
method InitializeButtons (line 196) | void InitializeButtons() {
method InitializeSH8601Display (line 207) | void InitializeSH8601Display() {
method InitializeTouch (line 249) | void InitializeTouch()
method InitializeTools (line 282) | void InitializeTools() {
method WaveshareEsp32s3TouchAMOLED1inch8 (line 294) | WaveshareEsp32s3TouchAMOLED1inch8() :
method AudioCodec (line 307) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 314) | virtual Display* GetDisplay() override {
method Backlight (line 318) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 322) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 335) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-s3-touch-amoled-2.06/esp32-s3-touch-amoled-2.06.cc
class Pmic (line 27) | class Pmic : public Axp2101 {
method Pmic (line 29) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class CustomLcdDisplay (line 77) | class CustomLcdDisplay : public SpiLcdDisplay {
method rounder_event_cb (line 79) | static void rounder_event_cb(lv_event_t* e) {
method CustomLcdDisplay (line 95) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 110) | virtual void SetupUI() override {
class CustomBacklight (line 121) | class CustomBacklight : public Backlight {
method CustomBacklight (line 123) | CustomBacklight(esp_lcd_panel_io_handle_t panel_io) : Backlight(), pan...
method SetBrightnessImpl (line 128) | virtual void SetBrightnessImpl(uint8_t brightness) override {
class WaveshareEsp32s3TouchAMOLED2inch06 (line 140) | class WaveshareEsp32s3TouchAMOLED2inch06 : public WifiBoard {
method InitializePowerSaveTimer (line 149) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 162) | void InitializeCodecI2c() {
method InitializeAxp2101 (line 176) | void InitializeAxp2101() {
method InitializeSpi (line 181) | void InitializeSpi() {
method InitializeButtons (line 193) | void InitializeButtons() {
method InitializeSH8601Display (line 213) | void InitializeSH8601Display() {
method InitializeTouch (line 252) | void InitializeTouch() {
method InitializeTools (line 284) | void InitializeTools() {
method WaveshareEsp32s3TouchAMOLED2inch06 (line 296) | WaveshareEsp32s3TouchAMOLED2inch06() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 307) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 324) | virtual Display* GetDisplay() override {
method Backlight (line 328) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 332) | virtual bool GetBatteryLevel(int &level, bool &charging, bool &dischar...
method SetPowerSaveLevel (line 346) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-s3-touch-lcd-1.46/esp32-s3-touch-lcd-1.46.cc
class CustomLcdDisplay (line 24) | class CustomLcdDisplay : public SpiLcdDisplay {
method rounder_event_cb (line 26) | static void rounder_event_cb(lv_event_t * e) {
method CustomLcdDisplay (line 35) | CustomLcdDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 50) | virtual void SetupUI() override {
class CustomBoard (line 59) | class CustomBoard : public WifiBoard {
method InitializeI2c (line 69) | void InitializeI2c() {
method InitializeTca9554 (line 80) | void InitializeTca9554(void) {
method InitializeSpi (line 105) | void InitializeSpi() {
method InitializeSpd2010Display (line 117) | void InitializeSpd2010Display() {
method InitializeButtonsCustom (line 150) | void InitializeButtonsCustom() {
method InitializeButtons (line 161) | void InitializeButtons() {
method CustomBoard (line 217) | CustomBoard() {
method AudioCodec (line 226) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 233) | virtual Display* GetDisplay() override {
method Backlight (line 237) | virtual Backlight* GetBacklight() override {
FILE: main/boards/waveshare/esp32-s3-touch-lcd-1.83/esp32-s3-touch-lcd-1.83.cc
class Pmic (line 25) | class Pmic : public Axp2101 {
method Pmic (line 27) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class WaveshareEsp32s3TouchLCD1inch83 (line 54) | class WaveshareEsp32s3TouchLCD1inch83 : public WifiBoard {
method InitializePowerSaveTimer (line 62) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 75) | void InitializeCodecI2c() {
method InitializeAxp2101 (line 89) | void InitializeAxp2101() {
method InitializeSpi (line 94) | void InitializeSpi() {
method InitializeButtons (line 105) | void InitializeButtons() {
method InitializeDisplay (line 125) | void InitializeDisplay() {
method InitializeTouch (line 157) | void InitializeTouch() {
method InitializeTools (line 189) | void InitializeTools() {
method WaveshareEsp32s3TouchLCD1inch83 (line 201) | WaveshareEsp32s3TouchLCD1inch83() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 213) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 230) | virtual Display* GetDisplay() override {
method Backlight (line 234) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 239) | virtual bool GetBatteryLevel(int &level, bool &charging, bool &dischar...
method SetPowerSaveLevel (line 253) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-s3-touch-lcd-1.85/esp32-s3-touch-lcd-1.85.cc
class CustomBoard (line 212) | class CustomBoard : public WifiBoard {
method InitializeI2c (line 222) | void InitializeI2c() {
method InitializeTca9554 (line 233) | void InitializeTca9554(void) {
method InitializeSpi (line 258) | void InitializeSpi() {
method Initializest77916Display (line 270) | void Initializest77916Display() {
method InitializeButtonsCustom (line 359) | void InitializeButtonsCustom() {
method InitializeButtons (line 369) | void InitializeButtons() {
method CustomBoard (line 419) | CustomBoard() {
method AudioCodec (line 428) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 435) | virtual Display* GetDisplay() override {
method Backlight (line 439) | virtual Backlight* GetBacklight() override {
FILE: main/boards/waveshare/esp32-s3-touch-lcd-1.85c/esp32-s3-touch-lcd-1.85c.cc
class CustomBoard (line 214) | class CustomBoard : public WifiBoard {
method InitializeI2c (line 221) | void InitializeI2c() {
method InitializeTca9554 (line 232) | void InitializeTca9554(void)
method InitializeSpi (line 258) | void InitializeSpi() {
method Initializest77916Display (line 270) | void Initializest77916Display() {
method InitializeButtons (line 358) | void InitializeButtons() {
method CustomBoard (line 370) | CustomBoard() :
method AudioCodec (line 381) | virtual AudioCodec* GetAudioCodec() override {
method AudioCodec (line 390) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 397) | virtual Display* GetDisplay() override {
method Backlight (line 401) | virtual Backlight* GetBacklight() override {
FILE: main/boards/waveshare/esp32-s3-touch-lcd-3.49/custom_lcd_display.h
function class (line 7) | class CustomLcdDisplay : public LcdDisplay {
FILE: main/boards/waveshare/esp32-s3-touch-lcd-3.49/waveshare-s3-touch-lcd-3.49.cc
class CustomBoard (line 34) | class CustomBoard : public WifiBoard {
method InitializeI2c (line 45) | void InitializeI2c() {
method InitializeTca9554 (line 62) | void InitializeTca9554(void) {
method InitializeSpi (line 73) | void InitializeSpi() {
method InitializeLcdDisplay (line 85) | void InitializeLcdDisplay() {
method InitializeButtons (line 134) | void InitializeButtons() {
method InitializeTouch (line 158) | void InitializeTouch() {
method TouchInputReadCallback (line 185) | static void TouchInputReadCallback(lv_indev_t * indev, lv_indev_data_t...
method GetPwrCurrentState (line 206) | void GetPwrCurrentState() {
method CustomBoard (line 213) | CustomBoard() :
method AudioCodec (line 226) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 243) | virtual Display* GetDisplay() override {
method Backlight (line 247) | virtual Backlight* GetBacklight() override {
FILE: main/boards/waveshare/esp32-s3-touch-lcd-3.5/esp32-s3-touch-lcd-3.5.cc
class Pmic (line 31) | class Pmic : public Axp2101 {
method Pmic (line 33) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class CustomBoard (line 101) | class CustomBoard : public WifiBoard {
method InitializePowerSaveTimer (line 111) | void InitializePowerSaveTimer() {
method InitializeI2c (line 127) | void InitializeI2c() {
method InitializeTca9554 (line 144) | void InitializeTca9554(void)
method InitializeAxp2101 (line 159) | void InitializeAxp2101() {
method InitializeSpi (line 164) | void InitializeSpi() {
method InitializeCamera (line 175) | void InitializeCamera() {
method InitializeTouch (line 216) | void InitializeTouch()
method InitializeLcdDisplay (line 248) | void InitializeLcdDisplay() {
method InitializeButtons (line 289) | void InitializeButtons() {
method InitializeTools (line 301) | void InitializeTools() {
method CustomBoard (line 313) | CustomBoard() :
method AudioCodec (line 333) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 340) | virtual Display* GetDisplay() override {
method Backlight (line 344) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 348) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 361) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
method Camera (line 368) | virtual Camera* GetCamera() override {
FILE: main/boards/waveshare/esp32-s3-touch-lcd-3.5b/custom_lcd_display.h
function class (line 7) | class CustomLcdDisplay : public LcdDisplay {
FILE: main/boards/waveshare/esp32-s3-touch-lcd-3.5b/waveshare-s3-touch-lcd-3.5b.cc
class Pmic (line 71) | class Pmic : public Axp2101 {
method Pmic (line 73) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class CustomBoard (line 103) | class CustomBoard : public WifiBoard {
method InitializePowerSaveTimer (line 113) | void InitializePowerSaveTimer() {
method InitializeI2c (line 129) | void InitializeI2c() {
method InitializeTca9554 (line 146) | void InitializeTca9554(void)
method InitializeAxp2101 (line 161) | void InitializeAxp2101() {
method InitializeSpi (line 166) | void InitializeSpi() {
method InitializeCamera (line 178) | void InitializeCamera() {
method InitializeLcdDisplay (line 219) | void InitializeLcdDisplay() {
method InitializeButtons (line 259) | void InitializeButtons() {
method InitializeTouch (line 270) | void InitializeTouch()
method CustomBoard (line 303) | CustomBoard() :
method AudioCodec (line 323) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 330) | virtual Display* GetDisplay() override {
method Backlight (line 334) | virtual Backlight* GetBacklight() override {
method Camera (line 338) | virtual Camera* GetCamera() override {
method GetBatteryLevel (line 343) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 356) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-s3-touch-lcd-4.3c/esp32_s3_touch_lcd_4.3c.cc
class CustomBacklight (line 26) | class CustomBacklight : public Backlight {
method CustomBacklight (line 28) | CustomBacklight(esp_io_expander_handle_t io_handle)
method SetBrightnessImpl (line 34) | virtual void SetBrightnessImpl(uint8_t brightness) override {
class WaveshareEsp32s3TouchLCD43c (line 43) | class WaveshareEsp32s3TouchLCD43c : public WifiBoard {
method InitializePowerSaveTimer (line 51) | void InitializePowerSaveTimer() {
method InitializeGpio (line 62) | void InitializeGpio() {
method InitializeCodecI2c (line 72) | void InitializeCodecI2c() {
method InitializeCustomio (line 88) | void InitializeCustomio(void) {
method InitializeRGB (line 101) | void InitializeRGB() {
method InitializeTouch (line 153) | void InitializeTouch() {
method InitializeTools (line 187) | void InitializeTools() {
method WaveshareEsp32s3TouchLCD43c (line 199) | WaveshareEsp32s3TouchLCD43c() {
method AudioCodec (line 210) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 227) | virtual Display* GetDisplay() override {
method Backlight (line 231) | virtual Backlight *GetBacklight() override {
method SetPowerSaveLevel (line 235) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-s3-touch-lcd-4b/esp32-s3-touch-lcd-4b.cc
class Pmic (line 33) | class Pmic : public Axp2101 {
method Pmic (line 35) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class WaveshareEsp32s3TouchLCD4b (line 105) | class WaveshareEsp32s3TouchLCD4b : public WifiBoard {
method InitializePowerSaveTimer (line 118) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 131) | void InitializeCodecI2c() {
method InitializeTca9554 (line 147) | void InitializeTca9554(void) {
method InitializeAxp2101 (line 159) | void InitializeAxp2101() {
method InitializeRGB (line 164) | void InitializeRGB() {
method InitializeButtons (line 241) | void InitializeButtons() {
method InitializeTouch (line 261) | void InitializeTouch() {
method InitializeTools (line 292) | void InitializeTools() {
method CheckKeyState (line 302) | void CheckKeyState() {
method InitializeKeyMonitor (line 347) | void InitializeKeyMonitor() {
method WaveshareEsp32s3TouchLCD4b (line 370) | WaveshareEsp32s3TouchLCD4b() : boot_button_(BOOT_BUTTON_GPIO) {
method AudioCodec (line 383) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 400) | virtual Display* GetDisplay() override {
method Backlight (line 404) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 409) | virtual bool GetBatteryLevel(int &level, bool &charging, bool &dischar...
method SetPowerSaveLevel (line 423) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/waveshare/esp32-touch-lcd-3.5/esp32-touch-lcd-3.5.cc
class Pmic (line 30) | class Pmic : public Axp2101 {
method Pmic (line 32) | Pmic(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : Axp2101(i2c_bus,...
class WaveshareEsp32TouchLCD3inch5 (line 100) | class WaveshareEsp32TouchLCD3inch5 : public WifiBoard {
method InitializePowerSaveTimer (line 110) | void InitializePowerSaveTimer() {
method InitializeI2c (line 126) | void InitializeI2c() {
method InitializeTca9554 (line 143) | void InitializeTca9554(void)
method InitializeAxp2101 (line 158) | void InitializeAxp2101() {
method InitializeSpi (line 163) | void InitializeSpi() {
method InitializeTouch (line 174) | void InitializeTouch()
method InitializeLcdDisplay (line 206) | void InitializeLcdDisplay() {
method InitializeButtons (line 247) | void InitializeButtons() {
method InitializeTools (line 269) | void InitializeTools() {
method WaveshareEsp32TouchLCD3inch5 (line 281) | WaveshareEsp32TouchLCD3inch5() :
method AudioCodec (line 295) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 302) | virtual Display* GetDisplay() override {
method Backlight (line 306) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 310) | virtual bool GetBatteryLevel(int &level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 323) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/wireless-tag-wtp4c5mp07s/wireless-tag-wtp4c5mp07s.cc
class WirelessTagEsp32p47b (line 28) | class WirelessTagEsp32p47b : public WifiBoard {
method InitializeCodecI2c (line 34) | void InitializeCodecI2c() {
method esp_err_t (line 51) | static esp_err_t bsp_enable_dsi_phy_power(void) {
method InitializeLCD (line 66) | void InitializeLCD() {
method InitializeTouch (line 136) | void InitializeTouch()
method InitializeButtons (line 168) | void InitializeButtons() {
method InitializeSdCard (line 180) | void InitializeSdCard() {
method WirelessTagEsp32p47b (line 260) | WirelessTagEsp32p47b() :
method AudioCodec (line 270) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 286) | virtual Display *GetDisplay() override {
method Backlight (line 290) | virtual Backlight* GetBacklight() override {
FILE: main/boards/xingzhi-abs-2.0/customlcddisplay.h
function class (line 10) | class CustomLcdDisplay : public SpiLcdDisplay {
FILE: main/boards/xingzhi-abs-2.0/power_manager.h
function class (line 15) | class PowerManager {
function IsCharging (line 263) | bool IsCharging() {
function IsDischarging (line 271) | bool IsDischarging() {
function GetBatteryLevel (line 276) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 280) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 284) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
function shutdown (line 288) | void shutdown() {
FILE: main/boards/xingzhi-abs-2.0/xingzhi-abs-2.0.cc
class XINGZHI_ABS_2_0 (line 34) | class XINGZHI_ABS_2_0 : public DualNetworkBoard {
method VibrateMotor (line 51) | void VibrateMotor(uint32_t duration_ms) {
method VibrateTask (line 58) | static void VibrateTask(void* param) {
method TriggerVibrateEvent (line 71) | void TriggerVibrateEvent() {
method InitializePowerManager (line 76) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 87) | void InitializePowerSaveTimer() {
method InitializeI2c (line 107) | void InitializeI2c() {
method InitializeSpi (line 130) | void InitializeSpi() {
method InitializeSt7789Display (line 141) | void InitializeSt7789Display() {
method InitializeSDcardSpi (line 171) | void InitializeSDcardSpi() {
method InitializePhysicalButtons (line 216) | void InitializePhysicalButtons() {
method InitializeGpio (line 289) | void InitializeGpio() {
method InitializeVibrateTask (line 300) | void InitializeVibrateTask() {
method XINGZHI_ABS_2_0 (line 324) | XINGZHI_ABS_2_0() :
method AudioCodec (line 343) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 360) | virtual Display* GetDisplay() override {
method Backlight (line 364) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 369) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 381) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/xingzhi-cube-0.85tft-ml307/xingzhi-cube-0.85tft-ml307.cc
class XINGZHI_CUBE_0_85TFT_ML307 (line 81) | class XINGZHI_CUBE_0_85TFT_ML307 : public Ml307Board {
method InitializePowerManager (line 92) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 103) | void InitializePowerSaveTimer() {
method InitializeSpi (line 128) | void InitializeSpi() {
method InitializeButtons (line 139) | void InitializeButtons() {
method InitializeNv3023Display (line 146) | void InitializeNv3023Display() {
method Initializegpio21_45 (line 174) | void Initializegpio21_45() {
method XINGZHI_CUBE_0_85TFT_ML307 (line 191) | XINGZHI_CUBE_0_85TFT_ML307(): Ml307Board(ML307_TX_PIN, ML307_RX_PIN),
method AudioCodec (line 204) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 210) | virtual Display* GetDisplay() override {
method Backlight (line 214) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 219) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 231) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/xingzhi-cube-0.85tft-wifi/xingzhi-cube-0.85tft-wifi.cc
class XINGZHI_CUBE_0_85TFT_WIFI (line 81) | class XINGZHI_CUBE_0_85TFT_WIFI : public WifiBoard {
method InitializePowerManager (line 92) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 103) | void InitializePowerSaveTimer() {
method InitializeSpi (line 128) | void InitializeSpi() {
method InitializeButtons (line 139) | void InitializeButtons() {
method InitializeNv3023Display (line 151) | void InitializeNv3023Display() {
method Initializegpio21_45 (line 179) | void Initializegpio21_45() {
method XINGZHI_CUBE_0_85TFT_WIFI (line 196) | XINGZHI_CUBE_0_85TFT_WIFI():
method AudioCodec (line 209) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 215) | virtual Display* GetDisplay() override {
method Backlight (line 219) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 224) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 236) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc
class XINGZHI_CUBE_0_96OLED_ML307 (line 22) | class XINGZHI_CUBE_0_96OLED_ML307 : public DualNetworkBoard {
method InitializePowerManager (line 34) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 45) | void InitializePowerSaveTimer() {
method InitializeDisplayI2c (line 68) | void InitializeDisplayI2c() {
method InitializeSsd1306Display (line 84) | void InitializeSsd1306Display() {
method InitializeButtons (line 131) | void InitializeButtons() {
method XINGZHI_CUBE_0_96OLED_ML307 (line 188) | XINGZHI_CUBE_0_96OLED_ML307() : DualNetworkBoard(ML307_TX_PIN, ML307_R...
method Led (line 199) | virtual Led* GetLed() override {
method AudioCodec (line 204) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 210) | virtual Display* GetDisplay() override {
method GetBatteryLevel (line 214) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 226) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc
class XINGZHI_CUBE_0_96OLED_WIFI (line 23) | class XINGZHI_CUBE_0_96OLED_WIFI : public WifiBoard {
method InitializePowerManager (line 35) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 46) | void InitializePowerSaveTimer() {
method InitializeDisplayI2c (line 69) | void InitializeDisplayI2c() {
method InitializeSsd1306Display (line 85) | void InitializeSsd1306Display() {
method InitializeButtons (line 132) | void InitializeButtons() {
method XINGZHI_CUBE_0_96OLED_WIFI (line 179) | XINGZHI_CUBE_0_96OLED_WIFI() :
method Led (line 190) | virtual Led* GetLed() override {
method AudioCodec (line 195) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 201) | virtual Display* GetDisplay() override {
method GetBatteryLevel (line 205) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 217) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc
class XINGZHI_CUBE_1_54TFT_ML307 (line 21) | class XINGZHI_CUBE_1_54TFT_ML307 : public DualNetworkBoard {
method InitializePowerManager (line 32) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 43) | void InitializePowerSaveTimer() {
method InitializeSpi (line 68) | void InitializeSpi() {
method InitializeButtons (line 79) | void InitializeButtons() {
method InitializeSt7789Display (line 135) | void InitializeSt7789Display() {
method XINGZHI_CUBE_1_54TFT_ML307 (line 164) | XINGZHI_CUBE_1_54TFT_ML307() :
method AudioCodec (line 177) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 183) | virtual Display* GetDisplay() override {
method Backlight (line 187) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 192) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 204) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/xingzhi-cube-1.54tft-wifi/power_manager.h
function class (line 10) | class PowerManager {
function IsCharging (line 162) | bool IsCharging() {
function IsDischarging (line 170) | bool IsDischarging() {
function GetBatteryLevel (line 175) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 179) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 183) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc
class XINGZHI_CUBE_1_54TFT_WIFI (line 21) | class XINGZHI_CUBE_1_54TFT_WIFI : public WifiBoard {
method InitializePowerManager (line 32) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 43) | void InitializePowerSaveTimer() {
method InitializeSpi (line 68) | void InitializeSpi() {
method InitializeButtons (line 79) | void InitializeButtons() {
method InitializeSt7789Display (line 125) | void InitializeSt7789Display() {
method XINGZHI_CUBE_1_54TFT_WIFI (line 154) | XINGZHI_CUBE_1_54TFT_WIFI() :
method AudioCodec (line 166) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 172) | virtual Display* GetDisplay() override {
method Backlight (line 176) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 181) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 193) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/xingzhi-metal-1.54-wifi/cst816x.cc
type timeval (line 36) | struct timeval
FILE: main/boards/xingzhi-metal-1.54-wifi/cst816x.h
type class (line 15) | enum class
type TouchEvent (line 22) | struct TouchEvent {
function class (line 28) | class Cst816x : public I2cDevice {
FILE: main/boards/xingzhi-metal-1.54-wifi/power_manager.h
function class (line 15) | class PowerManager {
function IsCharging (line 263) | bool IsCharging() {
function IsDischarging (line 271) | bool IsDischarging() {
function GetBatteryLevel (line 276) | uint8_t GetBatteryLevel() {
function OnLowBatteryStatusChanged (line 280) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 284) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
function shutdown (line 288) | void shutdown() {
FILE: main/boards/xingzhi-metal-1.54-wifi/xingzhi-metal-1.54-wifi.cc
class XINGZHI_METAL_1_54_WIFI (line 23) | class XINGZHI_METAL_1_54_WIFI : public WifiBoard {
method InitializePowerManager (line 36) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 47) | void InitializePowerSaveTimer() {
method InitializeI2c (line 67) | void InitializeI2c() {
method InitializeSpi (line 93) | void InitializeSpi() {
method InitializeSt7789Display (line 104) | void InitializeSt7789Display() {
method Initialtouchtask (line 132) | void Initialtouchtask() {
method XINGZHI_METAL_1_54_WIFI (line 140) | XINGZHI_METAL_1_54_WIFI() :
method AudioCodec (line 151) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 168) | virtual Display* GetDisplay() override {
method Backlight (line 172) | virtual Backlight* GetBacklight() override {
method Cst816x (line 177) | Cst816x *GetTouchpad() {
method GetBatteryLevel (line 181) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 193) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/xmini-c3-4g/xmini_c3_4g_board.cc
class XminiC3Board (line 22) | class XminiC3Board : public Ml307Board {
method InitializeBatteryMonitor (line 33) | void InitializeBatteryMonitor() {
method InitializePowerSaveTimer (line 44) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 65) | void InitializeCodecI2c() {
method InitializeSsd1306Display (line 89) | void InitializeSsd1306Display() {
method InitializeButtons (line 136) | void InitializeButtons() {
method InitializeTools (line 155) | void InitializeTools() {
method XminiC3Board (line 161) | XminiC3Board() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN, ML307_DTR_PIN),
method Led (line 172) | virtual Led* GetLed() override {
method Display (line 177) | virtual Display* GetDisplay() override {
method AudioCodec (line 181) | virtual AudioCodec* GetAudioCodec() override {
method GetBatteryLevel (line 188) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 195) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/xmini-c3-v3/xmini_c3_board.cc
class XminiC3Board (line 23) | class XminiC3Board : public WifiBoard {
method InitializePowerManager (line 34) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 45) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 56) | void InitializeCodecI2c() {
method InitializeSsd1306Display (line 81) | void InitializeSsd1306Display() {
method InitializeButtons (line 128) | void InitializeButtons() {
method InitializeTools (line 155) | void InitializeTools() {
method XminiC3Board (line 161) | XminiC3Board() : boot_button_(BOOT_BUTTON_GPIO, false, 0, 0, true) {
method Led (line 170) | virtual Led* GetLed() override {
method Display (line 175) | virtual Display* GetDisplay() override {
method AudioCodec (line 179) | virtual AudioCodec* GetAudioCodec() override {
method GetBatteryLevel (line 186) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method SetPowerSaveLevel (line 193) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/xmini-c3/xmini_c3_board.cc
class XminiC3Board (line 21) | class XminiC3Board : public WifiBoard {
method InitializePowerSaveTimer (line 31) | void InitializePowerSaveTimer() {
method InitializeCodecI2c (line 42) | void InitializeCodecI2c() {
method InitializeSsd1306Display (line 67) | void InitializeSsd1306Display() {
method InitializeButtons (line 114) | void InitializeButtons() {
method InitializeTools (line 140) | void InitializeTools() {
method XminiC3Board (line 146) | XminiC3Board() : boot_button_(BOOT_BUTTON_GPIO) {
method Led (line 158) | virtual Led* GetLed() override {
method Display (line 163) | virtual Display* GetDisplay() override {
method AudioCodec (line 167) | virtual AudioCodec* GetAudioCodec() override {
method SetPowerSaveLevel (line 174) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/yunliao-s3/power_manager.cc
function batt_mon_isr_handler (line 17) | static void IRAM_ATTR batt_mon_isr_handler(void* arg) {
function batt_mon_task (line 23) | static void batt_mon_task(void* arg) {
function calBattLife (line 32) | static void calBattLife() {
FILE: main/boards/yunliao-s3/power_manager.h
function class (line 11) | class PowerManager{
FILE: main/boards/yunliao-s3/yunliao_s3.cc
class YunliaoDisplay (line 18) | class YunliaoDisplay : public SpiLcdDisplay {
method YunliaoDisplay (line 20) | YunliaoDisplay(esp_lcd_panel_io_handle_t io_handle,
method SetupUI (line 32) | virtual void SetupUI() override {
class YunliaoS3 (line 42) | class YunliaoS3 : public DualNetworkBoard {
method InitializePowerSaveTimer (line 50) | void InitializePowerSaveTimer() {
method InitializeI2c (line 67) | void InitializeI2c() {
method InitializeSpi (line 85) | void InitializeSpi() {
method InitializeButtons (line 98) | void InitializeButtons() {
method InitializeSt7789Display (line 133) | void InitializeSt7789Display() {
method InitializeTools (line 170) | void InitializeTools(){
method SetAecMode (line 192) | void SetAecMode(bool enable) {
method SwitchTFT (line 199) | void SwitchTFT() {
method YunliaoS3 (line 210) | YunliaoS3()
method AudioCodec (line 262) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 271) | virtual Display* GetDisplay() override { return display_; }
method Backlight (line 273) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 279) | virtual bool GetBatteryLevel(int& level, bool& charging,
method SetPowerSaveLevel (line 287) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/zhengchen-1.54tft-ml307/zhengchen-1.54tft-ml307.cc
class ZHENGCHEN_1_54TFT_ML307 (line 21) | class ZHENGCHEN_1_54TFT_ML307 : public DualNetworkBoard {
method InitializePowerManager (line 32) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 46) | void InitializePowerSaveTimer() {
method InitializeSpi (line 63) | void InitializeSpi() {
method InitializeButtons (line 74) | void InitializeButtons() {
method InitializeSt7789Display (line 128) | void InitializeSt7789Display() {
method ZHENGCHEN_1_54TFT_ML307 (line 158) | ZHENGCHEN_1_54TFT_ML307() :
method AudioCodec (line 171) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 177) | virtual Display* GetDisplay() override {
method Backlight (line 181) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 186) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method GetTemperature (line 198) | virtual bool GetTemperature(float& esp32temp) override {
method SetPowerSaveLevel (line 203) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/zhengchen-1.54tft-wifi/power_manager.h
function class (line 12) | class PowerManager {
function IsCharging (line 206) | bool IsCharging() {
function IsDischarging (line 214) | bool IsDischarging() {
function GetBatteryLevel (line 220) | uint8_t GetBatteryLevel() {
function OnTemperatureChanged (line 227) | void OnTemperatureChanged(std::function<void(float)> callback) {
function OnLowBatteryStatusChanged (line 231) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 235) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/zhengchen-1.54tft-wifi/zhengchen-1.54tft-wifi.cc
class ZHENGCHEN_1_54TFT_WIFI (line 21) | class ZHENGCHEN_1_54TFT_WIFI : public WifiBoard {
method InitializePowerManager (line 32) | void InitializePowerManager() {
method InitializePowerSaveTimer (line 50) | void InitializePowerSaveTimer() {
method InitializeSpi (line 67) | void InitializeSpi() {
method InitializeButtons (line 78) | void InitializeButtons() {
method InitializeSt7789Display (line 139) | void InitializeSt7789Display() {
method InitializeTools (line 168) | void InitializeTools() {
method ZHENGCHEN_1_54TFT_WIFI (line 172) | ZHENGCHEN_1_54TFT_WIFI() :
method AudioCodec (line 186) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 194) | virtual Display* GetDisplay() override {
method Backlight (line 198) | virtual Backlight* GetBacklight() override {
method GetBatteryLevel (line 203) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method GetTemperature (line 215) | virtual bool GetTemperature(float& esp32temp) override {
method SetPowerSaveLevel (line 220) | virtual void SetPowerSaveLevel(PowerSaveLevel level) override {
FILE: main/boards/zhengchen-1.54tft-wifi/zhengchen_lcd_display.h
function class (line 8) | class ZHENGCHEN_LcdDisplay : public SpiLcdDisplay {
FILE: main/boards/zhengchen-cam-ml307/mcp_controller.cc
class MCPController (line 16) | class MCPController {
method MCPController (line 18) | MCPController() {
method RegisterMcpTools (line 23) | void RegisterMcpTools() {
function InitializeMCPController (line 89) | void InitializeMCPController() {
FILE: main/boards/zhengchen-cam-ml307/power_manager.h
function class (line 11) | class PowerManager {
function IsCharging (line 205) | bool IsCharging() {
function IsDischarging (line 213) | bool IsDischarging() {
function GetBatteryLevel (line 219) | uint8_t GetBatteryLevel() {
function OnTemperatureChanged (line 226) | void OnTemperatureChanged(std::function<void(float)> callback) {
function OnLowBatteryStatusChanged (line 230) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 234) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/zhengchen-cam-ml307/zhengchen_cam_board_ml307.cc
class Pca9557 (line 34) | class Pca9557 : public I2cDevice {
method Pca9557 (line 36) | Pca9557(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method SetOutputState (line 41) | void SetOutputState(uint8_t bit, uint8_t level) {
class CustomAudioCodec (line 48) | class CustomAudioCodec : public BoxAudioCodec {
method CustomAudioCodec (line 53) | CustomAudioCodec(i2c_master_bus_handle_t i2c_bus, Pca9557* pca9557)
method EnableOutput (line 69) | virtual void EnableOutput(bool enable) override {
class ZhengchenCamBoard_ML307 (line 79) | class ZhengchenCamBoard_ML307 : public DualNetworkBoard {
method InitializeI2c (line 91) | void InitializeI2c() {
method InitializeSpi (line 111) | void InitializeSpi() {
method InitializeButtons (line 122) | void InitializeButtons() {
method InitializeSt7789Display (line 197) | void InitializeSt7789Display() {
method InitializeCamera (line 246) | void InitializeCamera() {
method InitializeController (line 281) | void InitializeController() { InitializeMCPController(); }
method ZhengchenCamBoard_ML307 (line 284) | ZhengchenCamBoard_ML307() :
method AudioCodec (line 298) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 305) | virtual Display* GetDisplay() override {
method Led (line 309) | virtual Led* GetLed() override {
method GetBatteryLevel (line 314) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method GetTemperature (line 325) | virtual bool GetTemperature(float& esp32temp) override {
method Backlight (line 330) | virtual Backlight* GetBacklight() override {
method Camera (line 335) | virtual Camera* GetCamera() override {
FILE: main/boards/zhengchen-cam/mcp_controller.cc
class MCPController (line 16) | class MCPController {
method MCPController (line 18) | MCPController() {
method RegisterMcpTools (line 23) | void RegisterMcpTools() {
function InitializeMCPController (line 89) | void InitializeMCPController() {
FILE: main/boards/zhengchen-cam/power_manager.h
function class (line 11) | class PowerManager {
function IsCharging (line 205) | bool IsCharging() {
function IsDischarging (line 213) | bool IsDischarging() {
function GetBatteryLevel (line 219) | uint8_t GetBatteryLevel() {
function OnTemperatureChanged (line 226) | void OnTemperatureChanged(std::function<void(float)> callback) {
function OnLowBatteryStatusChanged (line 230) | void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
function OnChargingStatusChanged (line 234) | void OnChargingStatusChanged(std::function<void(bool)> callback) {
FILE: main/boards/zhengchen-cam/zhengchen_cam_board.cc
class Pca9557 (line 34) | class Pca9557 : public I2cDevice {
method Pca9557 (line 36) | Pca9557(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c...
method SetOutputState (line 41) | void SetOutputState(uint8_t bit, uint8_t level) {
class CustomAudioCodec (line 48) | class CustomAudioCodec : public BoxAudioCodec {
method CustomAudioCodec (line 53) | CustomAudioCodec(i2c_master_bus_handle_t i2c_bus, Pca9557* pca9557)
method EnableOutput (line 69) | virtual void EnableOutput(bool enable) override {
class ZhengchenCamBoard (line 79) | class ZhengchenCamBoard : public WifiBoard {
method InitializeI2c (line 91) | void InitializeI2c() {
method InitializeSpi (line 111) | void InitializeSpi() {
method InitializeButtons (line 122) | void InitializeButtons() {
method InitializeSt7789Display (line 191) | void InitializeSt7789Display() {
method InitializeCamera (line 240) | void InitializeCamera() {
method InitializeController (line 275) | void InitializeController() { InitializeMCPController(); }
method ZhengchenCamBoard (line 278) | ZhengchenCamBoard() :
method AudioCodec (line 291) | virtual AudioCodec* GetAudioCodec() override {
method Display (line 298) | virtual Display* GetDisplay() override {
method Led (line 302) | virtual Led* GetLed() override {
method GetBatteryLevel (line 307) | virtual bool GetBatteryLevel(int& level, bool& charging, bool& dischar...
method GetTemperature (line 318) | virtual bool GetTemperature(float& esp32temp) override {
method Backlight (line 323) | virtual Backlight* GetBacklight() override {
method Camera (line 328) | virtual Camera* GetCamera() override {
FILE: main/device_state.h
type DeviceState (line 4) | enum DeviceState {
FILE: main/device_state_machine.h
function next_listener_id_ (line 69) | int next_listener_id_{0}
FILE: main/display/display.h
function class (line 18) | class Theme {
function class (line 28) | class Display {
function class (line 64) | class DisplayLockGuard {
function class (line 79) | class NoDisplay : public Display {
FILE: main/display/emote_display.cc
type emote (line 33) | namespace emote {
class EmoteDisplay (line 45) | class EmoteDisplay
function OnFlushIoReady (line 51) | static bool OnFlushIoReady(const esp_lcd_panel_io_handle_t panel_io,
function OnFlushCallback (line 62) | static void OnFlushCallback(int x_start, int y_start, int x_end, int y...
function emote_handle_t (line 74) | static emote_handle_t InitializeEmote(const esp_lcd_panel_handle_t pan...
FILE: main/display/emote_display.h
function namespace (line 10) | namespace emote {
FILE: main/display/lcd_display.h
function virtual (line 51) | virtual void ClearChatMessages() override;
function class (line 70) | class RgbLcdDisplay : public LcdDisplay {
function class (line 78) | class MipiLcdDisplay : public LcdDisplay {
FILE: main/display/lvgl_display/emoji_collection.cc
function LvglImage (line 13) | const LvglImage* EmojiCollection::GetEmojiImage(const char* name) {
FILE: main/display/lvgl_display/emoji_collection.h
function class (line 14) | class EmojiCollection {
function class (line 24) | class Twemoji32 : public EmojiCollection {
function class (line 29) | class Twemoji64 : public EmojiCollection {
FILE: main/display/lvgl_display/gif/gifdec.c
type Entry (line 13) | typedef struct Entry {
type Table (line 19) | typedef struct Table {
function read_num (line 41) | static uint16_t
function gd_GIF (line 50) | gd_GIF *
function gd_GIF (line 62) | gd_GIF *
function gd_GIF (line 74) | static gd_GIF * gif_open(gd_GIF * gif_base)
function discard_sub_blocks (line 171) | static void
function read_plain_text_ext (line 182) | static void
function read_graphic_control_ext (line 210) | static void
function read_comment_ext (line 227) | static void
function read_application_ext (line 239) | static void
function read_ext (line 278) | static void
function get_key (line 302) | static uint16_t
function read_image_data (line 334) | static int
function Table (line 481) | static Table *
function add_entry (line 503) | static int
function interlaced_line_index (line 524) | static int
function read_image_data (line 547) | static int
function read_image (line 629) | static int
function render_frame_rect (line 660) | static void
function dispose (line 688) | static void
function gd_get_frame (line 725) | int
function gd_render_frame (line 752) | void
function gd_rewind (line 758) | void
function gd_close_gif (line 765) | void
function f_gif_open (line 772) | static bool f_gif_open(gd_GIF * gif, const void * path, bool is_file)
function f_gif_read (line 789) | static void f_gif_read(gd_GIF * gif, void * buf, size_t len)
function f_gif_seek (line 800) | static int f_gif_seek(gd_GIF * gif, size_t pos, int k)
function f_gif_close (line 815) | static void f_gif_close(gd_GIF * gif)
FILE: main/display/lvgl_display/gif/gifdec.h
type gd_Palette (line 12) | typedef struct _gd_Palette {
type gd_GCE (line 17) | typedef struct _gd_GCE {
type gd_GIF (line 27) | typedef struct _gd_GIF {
FILE: main/display/lvgl_display/gif/gifdec_mve.h
function _gifdec_fill_bg_mve (line 41) | static inline void _gifdec_fill_bg_mve(uint8_t * dst, uint16_t w, uint16...
function _gifdec_render_frame_mve (line 70) | static inline void _gifdec_render_frame_mve(uint8_t * dst, uint16_t w, u...
FILE: main/display/lvgl_display/gif/lvgl_gif.cc
function lv_img_dsc_t (line 47) | const lv_img_dsc_t* LvglGif::image_dsc() const {
FILE: main/display/lvgl_display/gif/lvgl_gif.h
function class (line 13) | class LvglGif {
FILE: main/display/lvgl_display/jpg/image_to_jpeg.cpp
function __always_inline (line 30) | static __always_inline uint8_t expand_5_to_8(uint8_t v) {
function __always_inline (line 34) | static __always_inline uint8_t expand_6_to_8(uint8_t v) {
function hw_jpeg_ensure_inited (line 198) | static bool hw_jpeg_ensure_inited(void) {
function encode_with_hw_jpeg (line 278) | static bool encode_with_hw_jpeg(const uint8_t* src, size_t src_len, uint...
function encode_with_esp_new_jpeg (line 350) | static bool encode_with_esp_new_jpeg(const uint8_t* src, size_t src_len,...
function image_to_jpeg (line 427) | bool image_to_jpeg(uint8_t* src, size_t src_len, uint16_t width, uint16_...
function image_to_jpeg_cb (line 451) | bool image_to_jpeg_cb(uint8_t* src, size_t src_len, uint16_t width, uint...
FILE: main/display/lvgl_display/jpg/image_to_jpeg.h
type v4l2_pix_fmt_t (line 26) | typedef uint32_t v4l2_pix_fmt_t;
FILE: main/display/lvgl_display/jpg/jpeg_to_image.c
function esp_err_t (line 23) | static esp_err_t decode_with_new_jpeg(const uint8_t* src, size_t src_len...
function esp_err_t (line 103) | static esp_err_t decode_with_hardware_jpeg(const uint8_t* src, size_t sr...
function esp_err_t (line 245) | esp_err_t jpeg_to_image(const uint8_t* src, size_t src_len, uint8_t** ou...
FILE: main/display/lvgl_display/lvgl_display.cc
type tm (line 140) | struct tm
FILE: main/display/lvgl_display/lvgl_display.h
function class (line 15) | class LvglDisplay : public Display {
FILE: main/display/lvgl_display/lvgl_font.h
function class (line 6) | class LvglFont {
function class (line 13) | class LvglBuiltInFont : public LvglFont {
function class (line 23) | class LvglCBinFont : public LvglFont {
FILE: main/display/lvgl_display/lvgl_image.h
function class (line 7) | class LvglImage {
function class (line 15) | class LvglRawImage : public LvglImage {
function class (line 25) | class LvglCBinImage : public LvglImage {
function class (line 35) | class LvglSourceImage : public LvglImage {
function class (line 44) | class LvglAllocatedImage : public LvglImage {
FILE: main/display/lvgl_display/lvgl_theme.cc
function lv_color_t (line 6) | lv_color_t LvglTheme::ParseColor(const std::string& color) {
function LvglTheme (line 20) | LvglTheme* LvglThemeManager::GetTheme(const std::string& theme_name) {
FILE: main/display/lvgl_display/lvgl_theme.h
function class (line 14) | class LvglTheme : public Theme {
function class (line 79) | class LvglThemeManager {
FILE: main/display/oled_display.h
function class (line 10) | class OledDisplay : public LvglDisplay {
FILE: main/led/circular_strip.h
type StripColor (line 15) | struct StripColor {
function class (line 19) | class CircularStrip : public Led {
FILE: main/led/gpio_led.h
function class (line 13) | class GpioLed : public Led {
FILE: main/led/led.h
Condensed preview — 1426 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,052K chars).
[
{
"path": ".clang-format",
"chars": 3337,
"preview": "---\nLanguage: Cpp\nBasedOnStyle: Google\nAccessModifierOffset: -4\nAlignAfterOpenBracket: Align\nAlignConsecutiveAssignments"
},
{
"path": ".github/ISSUE_TEMPLATE/01_build_install_bug.yml",
"chars": 3326,
"preview": "name: Installation or build bug report\ndescription: Report installation or build bugs\nlabels: ['bug']\nbody:\n - type: ch"
},
{
"path": ".github/ISSUE_TEMPLATE/02_runtime_bug.yml",
"chars": 3396,
"preview": "name: Runtime bug report\ndescription: Report runtime bugs\nlabels: ['bug']\nbody:\n - type: checkboxes\n id: checklist\n "
},
{
"path": ".github/ISSUE_TEMPLATE/03_feature_request.yml",
"chars": 1647,
"preview": "name: Feature request\ndescription: Suggest an idea for this project.\nlabels: ['enhancement']\nbody:\n - type: markdown\n "
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 276,
"preview": "blank_issues_enabled: true\ncontact_links:\n - name: 小智 AI 官方网站\n url: https://xiaozhi.me/\n about: 激活设备、配置 AI、声纹识别、声"
},
{
"path": ".github/workflows/build.yml",
"chars": 3243,
"preview": "name: Build Boards\n\non:\n push:\n branches:\n - main\n - ci/* # for ci test\n pull_request:\n branches:\n "
},
{
"path": ".gitignore",
"chars": 239,
"preview": "tmp/\ncomponents/\nmanaged_components/\nbuild/\ndist/\n.vscode/\n.devcontainer/\nsdkconfig.old\nsdkconfig\ndependencies.lock\n.env"
},
{
"path": "CMakeLists.txt",
"chars": 494,
"preview": "# The following lines of boilerplate have to be in your project's\n# CMakeLists in this exact order for cmake to work cor"
},
{
"path": "LICENSE",
"chars": 1140,
"preview": "MIT License\n\nCopyright (c) 2025 Shenzhen Xinzhi Future Technology Co., Ltd.\nCopyright (c) 2025 Project Contributors\n\nPer"
},
{
"path": "README.md",
"chars": 9508,
"preview": "# An MCP-based Chatbot\n\n(English | [中文](README_zh.md) | [日本語](README_ja.md))\n\n## Introduction\n\n👉 [Human: Give AI a camer"
},
{
"path": "README_ja.md",
"chars": 7592,
"preview": "# MCP ベースのチャットボット\n\n(日本語 | [中文](README_zh.md) | [English](README.md))\n\n## はじめに\n\n👉 [人間:AIにカメラを装着 vs AI:その場で飼い主が3日間髪を洗っていない"
},
{
"path": "README_zh.md",
"chars": 7034,
"preview": "# An MCP-based Chatbot\n\n(中文 | [English](README.md) | [日本語](README_ja.md))\n\n## 介绍\n\n👉 [人类:给 AI 装摄像头 vs AI:当场发现主人三天没洗头【bili"
},
{
"path": "docs/blufi.md",
"chars": 1366,
"preview": "# BluFi 配网(集成 esp-wifi-connect)\n\n本文档说明如何在小智固件中启用和使用 BluFi(BLE Wi‑Fi 配网),并结合项目内置的 `esp-wifi-connect` 组件完成 Wi‑Fi 连接与存储。官方\n"
},
{
"path": "docs/code_style.md",
"chars": 1555,
"preview": "# 代码风格指南\n\n## 代码格式化工具\n\n本项目使用 clang-format 工具来统一代码风格。我们已经在项目根目录下提供了 `.clang-format` 配置文件,该配置基于 Google C++ 风格指南,并做了一些自定义调整。"
},
{
"path": "docs/custom-board.md",
"chars": 10983,
"preview": "# 自定义开发板指南\n\n本指南介绍如何为小智AI语音聊天机器人项目定制一个新的开发板初始化程序。小智AI支持70多种ESP32系列开发板,每个开发板的初始化代码都放在对应的目录下。\n\n## 重要提示\n\n> **警告**: 对于自定义开发板,"
},
{
"path": "docs/mcp-protocol.md",
"chars": 7411,
"preview": "# MCP (Model Context Protocol) 交互流程\n\nNOTICE: AI 辅助生成, 在实现后台服务时, 请参照代码确认细节!!\n\n本项目中的 MCP 协议用于后台 API(MCP 客户端)与 ESP32 设备(MCP"
},
{
"path": "docs/mcp-usage.md",
"chars": 2637,
"preview": "# MCP 协议物联网控制用法说明\n\n> 本文档介绍如何基于 MCP 协议实现 ESP32 设备的物联网控制。详细协议流程请参考 [`mcp-protocol.md`](./mcp-protocol.md)。\n\n## 简介\n\nMCP(Mod"
},
{
"path": "docs/mqtt-udp.md",
"chars": 6187,
"preview": "# MQTT + UDP 混合通信协议文档\n\n基于代码实现整理的 MQTT + UDP 混合通信协议文档,概述设备端与服务器之间如何通过 MQTT 进行控制消息传输,通过 UDP 进行音频数据传输的交互方式。\n\n---\n\n## 1. 协议概"
},
{
"path": "docs/websocket.md",
"chars": 11808,
"preview": "以下是一份基于代码实现整理的 WebSocket 通信协议文档,概述设备端与服务器之间如何通过 WebSocket 进行交互。\n\n该文档仅基于所提供的代码推断,实际部署时可能需要结合服务器端实现进行进一步确认或补充。\n\n---\n\n## 1."
},
{
"path": "main/CMakeLists.txt",
"chars": 47616,
"preview": "# Define source files\nset(SOURCES \"audio/audio_codec.cc\"\n \"audio/audio_service.cc\"\n \"audio/demuxer"
},
{
"path": "main/Kconfig.projbuild",
"chars": 33386,
"preview": "menu \"Xiaozhi Assistant\"\n\nconfig OTA_URL\n string \"Default OTA URL\"\n default \"https://api.tenclass.net/xiaozhi/ota/"
},
{
"path": "main/application.cc",
"chars": 40208,
"preview": "#include \"application.h\"\n#include \"board.h\"\n#include \"display.h\"\n#include \"system_info.h\"\n#include \"audio_codec.h\"\n#incl"
},
{
"path": "main/application.h",
"chars": 5735,
"preview": "#ifndef _APPLICATION_H_\n#define _APPLICATION_H_\n\n#include <freertos/FreeRTOS.h>\n#include <freertos/event_groups.h>\n#incl"
},
{
"path": "main/assets/locales/ar-SA/language.json",
"chars": 2500,
"preview": "{\n \"language\": {\n \"type\": \"ar-SA\"\n },\n \"strings\": {\n \"WARNING\": \"تحذير\",\n \"INFO\": \"معلومات"
},
{
"path": "main/assets/locales/bg-BG/language.json",
"chars": 2789,
"preview": "{\n \"language\": {\n \"type\": \"bg-BG\"\n },\n \"strings\": {\n \"WARNING\": \"Предупреждение\",\n \"INFO\":"
},
{
"path": "main/assets/locales/ca-ES/language.json",
"chars": 2767,
"preview": "{\n \"language\": {\n \"type\": \"ca-ES\"\n },\n \"strings\": {\n \"WARNING\": \"Advertència\",\n \"INFO\": \"I"
},
{
"path": "main/assets/locales/cs-CZ/language.json",
"chars": 2625,
"preview": "{\n \"language\": {\n \"type\": \"cs-CZ\"\n },\n \"strings\": {\n \"WARNING\": \"Varování\",\n \"INFO\": \"Info"
},
{
"path": "main/assets/locales/da-DK/language.json",
"chars": 2660,
"preview": "{\n \"language\": {\n \"type\": \"da-DK\"\n },\n \"strings\": {\n \"WARNING\": \"Advarsel\",\n \"INFO\": \"Info"
},
{
"path": "main/assets/locales/de-DE/language.json",
"chars": 2762,
"preview": "{\n \"language\": {\n \"type\": \"de-DE\"\n },\n \"strings\": {\n \"WARNING\": \"Warnung\",\n \"INFO\": \"Infor"
},
{
"path": "main/assets/locales/el-GR/language.json",
"chars": 2710,
"preview": "{\n \"language\": {\n \"type\": \"el-GR\"\n },\n \"strings\": {\n \"WARNING\": \"Προειδοποίηση\",\n \"INFO\": "
},
{
"path": "main/assets/locales/en-US/language.json",
"chars": 2553,
"preview": "{\n \"language\": {\n \"type\": \"en-US\"\n },\n \"strings\": {\n \"WARNING\": \"Warning\",\n \"INFO\": \"Infor"
},
{
"path": "main/assets/locales/es-ES/language.json",
"chars": 2748,
"preview": "{\n \"language\": {\n \"type\": \"es-ES\"\n },\n \"strings\": {\n \"WARNING\": \"Advertencia\",\n \"INFO\": \"I"
},
{
"path": "main/assets/locales/fa-IR/language.json",
"chars": 2553,
"preview": "{\n \"language\": {\n \"type\": \"fa-IR\"\n },\n \"strings\": {\n \"WARNING\": \"هشدار\",\n \"INFO\": \"اطلاعات"
},
{
"path": "main/assets/locales/fi-FI/language.json",
"chars": 2720,
"preview": "{\n \"language\": {\n \"type\": \"fi-FI\"\n },\n \"strings\": {\n \"WARNING\": \"Varoitus\",\n \"INFO\": \"Tiet"
},
{
"path": "main/assets/locales/fil-PH/language.json",
"chars": 2791,
"preview": "{\n \"language\": {\n \"type\": \"fil-PH\"\n },\n \"strings\": {\n \"WARNING\": \"Babala\",\n \"INFO\": \"Impor"
},
{
"path": "main/assets/locales/fr-FR/language.json",
"chars": 2842,
"preview": "{\n \"language\": {\n \"type\": \"fr-FR\"\n },\n \"strings\": {\n \"WARNING\": \"Avertissement\",\n \"INFO\": "
},
{
"path": "main/assets/locales/he-IL/language.json",
"chars": 2333,
"preview": "{\n \"language\": {\n \"type\": \"he-IL\"\n },\n \"strings\": {\n \"WARNING\": \"אזהרה\",\n \"INFO\": \"מידע\",\n"
},
{
"path": "main/assets/locales/hi-IN/language.json",
"chars": 2662,
"preview": "{\n \"language\": {\n \"type\": \"hi-IN\"\n },\n \"strings\": {\n \"WARNING\": \"चेतावनी\",\n \"INFO\": \"जानका"
},
{
"path": "main/assets/locales/hr-HR/language.json",
"chars": 2729,
"preview": "{\n \"language\": {\n \"type\": \"hr-HR\"\n },\n \"strings\": {\n \"WARNING\": \"Upozorenje\",\n \"INFO\": \"In"
},
{
"path": "main/assets/locales/hu-HU/language.json",
"chars": 2753,
"preview": "{\n \"language\": {\n \"type\": \"hu-HU\"\n },\n \"strings\": {\n \"WARNING\": \"Figyelmeztetés\",\n \"INFO\":"
},
{
"path": "main/assets/locales/id-ID/language.json",
"chars": 2612,
"preview": "{\n \"language\": {\n \"type\": \"id-ID\"\n },\n \"strings\": {\n \"WARNING\": \"Peringatan\",\n \"INFO\": \"In"
},
{
"path": "main/assets/locales/it-IT/language.json",
"chars": 2735,
"preview": "{\n \"language\": {\n \"type\": \"it-IT\"\n },\n \"strings\": {\n \"WARNING\": \"Avviso\",\n \"INFO\": \"Inform"
},
{
"path": "main/assets/locales/ja-JP/language.json",
"chars": 2208,
"preview": "{\n \"language\": {\n \"type\": \"ja-JP\"\n },\n \"strings\": {\n \"WARNING\": \"警告\",\n \"INFO\": \"情報\",\n "
},
{
"path": "main/assets/locales/ko-KR/language.json",
"chars": 2135,
"preview": "{\n \"language\": {\n \"type\": \"ko-KR\"\n },\n \"strings\": {\n \"WARNING\": \"경고\",\n \"INFO\": \"정보\",\n "
},
{
"path": "main/assets/locales/ms-MY/language.json",
"chars": 2622,
"preview": "{\n \"language\": {\n \"type\": \"ms-MY\"\n },\n \"strings\": {\n \"WARNING\": \"Amaran\",\n \"INFO\": \"Maklum"
},
{
"path": "main/assets/locales/nb-NO/language.json",
"chars": 2623,
"preview": "{\n \"language\": {\n \"type\": \"nb-NO\"\n },\n \"strings\": {\n \"WARNING\": \"Advarsel\",\n \"INFO\": \"Info"
},
{
"path": "main/assets/locales/nl-NL/language.json",
"chars": 2666,
"preview": "{\n \"language\": {\n \"type\": \"nl-NL\"\n },\n \"strings\": {\n \"WARNING\": \"Waarschuwing\",\n \"INFO\": \""
},
{
"path": "main/assets/locales/pl-PL/language.json",
"chars": 2776,
"preview": "{\n \"language\": {\n \"type\": \"pl-PL\"\n },\n \"strings\": {\n \"WARNING\": \"Ostrzeżenie\",\n \"INFO\": \"I"
},
{
"path": "main/assets/locales/pt-PT/language.json",
"chars": 2711,
"preview": "{\n \"language\": {\n \"type\": \"pt-PT\"\n },\n \"strings\": {\n \"WARNING\": \"Aviso\",\n \"INFO\": \"Informa"
},
{
"path": "main/assets/locales/ro-RO/language.json",
"chars": 2774,
"preview": "{\n \"language\": {\n \"type\": \"ro-RO\"\n },\n \"strings\": {\n \"WARNING\": \"Avertisment\",\n \"INFO\": \"I"
},
{
"path": "main/assets/locales/ru-RU/language.json",
"chars": 2697,
"preview": "{\n \"language\": {\n \"type\": \"ru-RU\"\n },\n \"strings\": {\n \"WARNING\": \"Предупреждение\",\n \"INFO\":"
},
{
"path": "main/assets/locales/sk-SK/language.json",
"chars": 2642,
"preview": "{\n \"language\": {\n \"type\": \"sk-SK\"\n },\n \"strings\": {\n \"WARNING\": \"Upozornenie\",\n \"INFO\": \"I"
},
{
"path": "main/assets/locales/sl-SI/language.json",
"chars": 2673,
"preview": "{\n \"language\": {\n \"type\": \"sl-SI\"\n },\n \"strings\": {\n \"WARNING\": \"Opozorilo\",\n \"INFO\": \"Inf"
},
{
"path": "main/assets/locales/sr-RS/language.json",
"chars": 2674,
"preview": "{\n \"language\": {\n \"type\": \"sr-RS\"\n },\n \"strings\": {\n \"WARNING\": \"Упозорење\",\n \"INFO\": \"Инф"
},
{
"path": "main/assets/locales/sv-SE/language.json",
"chars": 2601,
"preview": "{\n \"language\": {\n \"type\": \"sv-SE\"\n },\n \"strings\": {\n \"WARNING\": \"Varning\",\n \"INFO\": \"Infor"
},
{
"path": "main/assets/locales/th-TH/language.json",
"chars": 2578,
"preview": "{\n \"language\": {\n \"type\": \"th-TH\"\n },\n \"strings\": {\n \"WARNING\": \"คำเตือน\",\n \"INFO\": \"ข้อมู"
},
{
"path": "main/assets/locales/tr-TR/language.json",
"chars": 2577,
"preview": "{\n \"language\": {\n \"type\": \"tr-TR\"\n },\n \"strings\": {\n \"WARNING\": \"Uyarı\",\n \"INFO\": \"Bilgi\","
},
{
"path": "main/assets/locales/uk-UA/language.json",
"chars": 2737,
"preview": "{\n \"language\": {\n \"type\": \"uk-UA\"\n },\n \"strings\": {\n \"WARNING\": \"Попередження\",\n \"INFO\": \""
},
{
"path": "main/assets/locales/vi-VN/language.json",
"chars": 2608,
"preview": "{\n \"language\": {\n \"type\": \"vi-VN\"\n },\n \"strings\": {\n \"WARNING\": \"Cảnh báo\",\n \"INFO\": \"Thôn"
},
{
"path": "main/assets/locales/zh-CN/language.json",
"chars": 1948,
"preview": "{\n \"language\": {\n \"type\": \"zh-CN\"\n },\n \"strings\": {\n \"WARNING\": \"警告\",\n \"INFO\": \"信息\",\n "
},
{
"path": "main/assets/locales/zh-TW/language.json",
"chars": 1951,
"preview": "{\n \"language\": {\n \"type\": \"zh-TW\"\n },\n \"strings\": {\n \"WARNING\": \"警告\",\n \"INFO\": \"資訊\",\n "
},
{
"path": "main/assets.cc",
"chars": 20783,
"preview": "#include \"assets.h\"\n#include \"board.h\"\n#include \"display.h\"\n#include \"application.h\"\n#include \"lvgl_theme.h\"\n#include \"e"
},
{
"path": "main/assets.h",
"chars": 2654,
"preview": "#ifndef ASSETS_H\n#define ASSETS_H\n\n#include <string>\n#include <functional>\n#include <memory>\n\n#include <cJSON.h>\n#includ"
},
{
"path": "main/audio/README.md",
"chars": 5101,
"preview": "# Audio Service Architecture\n\nThe audio service is a core component responsible for managing all audio-related functiona"
},
{
"path": "main/audio/audio_codec.cc",
"chars": 1638,
"preview": "#include \"audio_codec.h\"\n#include \"board.h\"\n#include \"settings.h\"\n\n#include <esp_log.h>\n#include <cstring>\n#include <dri"
},
{
"path": "main/audio/audio_codec.h",
"chars": 1901,
"preview": "#ifndef _AUDIO_CODEC_H\n#define _AUDIO_CODEC_H\n\n#include <freertos/FreeRTOS.h>\n#include <freertos/event_groups.h>\n#includ"
},
{
"path": "main/audio/audio_processor.h",
"chars": 766,
"preview": "#ifndef AUDIO_PROCESSOR_H\n#define AUDIO_PROCESSOR_H\n\n#include <string>\n#include <vector>\n#include <functional>\n\n#include"
},
{
"path": "main/audio/audio_service.cc",
"chars": 29216,
"preview": "#include \"audio_service.h\"\n#include <esp_log.h>\n#include <cstring>\n\n#define RATE_CVT_CFG(_src_rate, _dest_rate, _channel"
},
{
"path": "main/audio/audio_service.h",
"chars": 7725,
"preview": "#ifndef AUDIO_SERVICE_H\n#define AUDIO_SERVICE_H\n\n#include <memory>\n#include <deque>\n#include <condition_variable>\n#inclu"
},
{
"path": "main/audio/codecs/box_audio_codec.cc",
"chars": 8335,
"preview": "#include \"box_audio_codec.h\"\n\n#include <esp_log.h>\n#include <driver/i2c_master.h>\n#include <driver/i2s_tdm.h>\n\n#define T"
},
{
"path": "main/audio/codecs/box_audio_codec.h",
"chars": 1414,
"preview": "#ifndef _BOX_AUDIO_CODEC_H\n#define _BOX_AUDIO_CODEC_H\n\n#include \"audio_codec.h\"\n\n#include <esp_codec_dev.h>\n#include <es"
},
{
"path": "main/audio/codecs/dummy_audio_codec.cc",
"chars": 475,
"preview": "#include \"dummy_audio_codec.h\"\n\nDummyAudioCodec::DummyAudioCodec(int input_sample_rate, int output_sample_rate) {\n du"
},
{
"path": "main/audio/codecs/dummy_audio_codec.h",
"chars": 406,
"preview": "#ifndef _DUMMY_AUDIO_CODEC_H\n#define _DUMMY_AUDIO_CODEC_H\n\n#include \"audio_codec.h\"\n\nclass DummyAudioCodec : public Audi"
},
{
"path": "main/audio/codecs/es8311_audio_codec.cc",
"chars": 6423,
"preview": "#include \"es8311_audio_codec.h\"\n\n#include <esp_log.h>\n\n#define TAG \"Es8311AudioCodec\"\n\nEs8311AudioCodec::Es8311AudioCode"
},
{
"path": "main/audio/codecs/es8311_audio_codec.h",
"chars": 1440,
"preview": "#ifndef _ES8311_AUDIO_CODEC_H\n#define _ES8311_AUDIO_CODEC_H\n\n#include \"audio_codec.h\"\n\n#include <driver/i2c_master.h>\n#i"
},
{
"path": "main/audio/codecs/es8374_audio_codec.cc",
"chars": 6576,
"preview": "#include \"es8374_audio_codec.h\"\n\n#include <esp_log.h>\n\n#define TAG \"Es8374AudioCodec\"\n\nEs8374AudioCodec::Es8374AudioCode"
},
{
"path": "main/audio/codecs/es8374_audio_codec.h",
"chars": 1402,
"preview": "#ifndef _ES8374_AUDIO_CODEC_H\n#define _ES8374_AUDIO_CODEC_H\n\n#include \"audio_codec.h\"\n\n#include <driver/i2c.h>\n#include "
},
{
"path": "main/audio/codecs/es8388_audio_codec.cc",
"chars": 7451,
"preview": "#include \"es8388_audio_codec.h\"\n\n#include <esp_log.h>\n\n#define TAG \"Es8388AudioCodec\"\n\nEs8388AudioCodec::Es8388AudioCode"
},
{
"path": "main/audio/codecs/es8388_audio_codec.h",
"chars": 1393,
"preview": "#ifndef _ES8388_AUDIO_CODEC_H\n#define _ES8388_AUDIO_CODEC_H\n\n#include \"audio_codec.h\"\n\n#include <driver/i2c_master.h>\n#i"
},
{
"path": "main/audio/codecs/es8389_audio_codec.cc",
"chars": 6761,
"preview": "#include \"es8389_audio_codec.h\"\n\n#include <esp_log.h>\n\nstatic const char TAG[] = \"Es8389AudioCodec\";\n\nEs8389AudioCodec::"
},
{
"path": "main/audio/codecs/es8389_audio_codec.h",
"chars": 1402,
"preview": "#ifndef _ES8389_AUDIO_CODEC_H\n#define _ES8389_AUDIO_CODEC_H\n\n#include \"audio_codec.h\"\n\n#include <driver/i2c.h>\n#include "
},
{
"path": "main/audio/codecs/no_audio_codec.cc",
"chars": 13482,
"preview": "#include \"no_audio_codec.h\"\n\n#include <esp_log.h>\n#include <cmath>\n#include <cstring>\n\n#define TAG \"NoAudioCodec\"\n\nNoAud"
},
{
"path": "main/audio/codecs/no_audio_codec.h",
"chars": 1743,
"preview": "#ifndef _NO_AUDIO_CODEC_H\n#define _NO_AUDIO_CODEC_H\n\n#include \"audio_codec.h\"\n\n#include <driver/gpio.h>\n#include <driver"
},
{
"path": "main/audio/demuxer/ogg_demuxer.cc",
"chars": 11927,
"preview": "#include \"ogg_demuxer.h\"\n#include \"esp_log.h\"\n\n#define TAG \"OggDemuxer\"\n\n/// @brief 重置解封器\nvoid OggDemuxer::Reset()\n{\n "
},
{
"path": "main/audio/demuxer/ogg_demuxer.h",
"chars": 1676,
"preview": "#ifndef OGG_DEMUXER_H_\n#define OGG_DEMUXER_H_\n\n#include <functional>\n#include <cstdint>\n#include <cstring>\n#include <vec"
},
{
"path": "main/audio/processors/afe_audio_processor.cc",
"chars": 6612,
"preview": "#include \"afe_audio_processor.h\"\n#include <esp_log.h>\n\n#define PROCESSOR_RUNNING 0x01\n\n#define TAG \"AfeAudioProcessor\"\n\n"
},
{
"path": "main/audio/processors/afe_audio_processor.h",
"chars": 1460,
"preview": "#ifndef AFE_AUDIO_PROCESSOR_H\n#define AFE_AUDIO_PROCESSOR_H\n\n#include <esp_afe_sr_models.h>\n#include <freertos/FreeRTOS."
},
{
"path": "main/audio/processors/audio_debugger.cc",
"chars": 2119,
"preview": "#include \"audio_debugger.h\"\n#include \"sdkconfig.h\"\n\n#if CONFIG_USE_AUDIO_DEBUGGER\n#include <esp_log.h>\n#include <arpa/in"
},
{
"path": "main/audio/processors/audio_debugger.h",
"chars": 349,
"preview": "#ifndef AUDIO_DEBUGGER_H\n#define AUDIO_DEBUGGER_H\n\n#include <vector>\n#include <cstdint>\n\n#include <sys/socket.h>\n#includ"
},
{
"path": "main/audio/processors/no_audio_processor.cc",
"chars": 2051,
"preview": "#include \"no_audio_processor.h\"\n#include <esp_log.h>\n\n#define TAG \"NoAudioProcessor\"\n\nvoid NoAudioProcessor::Initialize("
},
{
"path": "main/audio/processors/no_audio_processor.h",
"chars": 1100,
"preview": "#ifndef DUMMY_AUDIO_PROCESSOR_H\n#define DUMMY_AUDIO_PROCESSOR_H\n\n#include <vector>\n#include <functional>\n#include <atomi"
},
{
"path": "main/audio/wake_word.h",
"chars": 743,
"preview": "#ifndef WAKE_WORD_H\n#define WAKE_WORD_H\n\n#include <string>\n#include <vector>\n#include <functional>\n\n#include <model_path"
},
{
"path": "main/audio/wake_words/afe_wake_word.cc",
"chars": 9664,
"preview": "#include \"afe_wake_word.h\"\n#include \"audio_service.h\"\n#include <esp_log.h>\n#include <sstream>\n\n#define DETECTION_RUNNING"
},
{
"path": "main/audio/wake_words/afe_wake_word.h",
"chars": 1879,
"preview": "#ifndef AFE_WAKE_WORD_H\n#define AFE_WAKE_WORD_H\n\n#include <freertos/FreeRTOS.h>\n#include <freertos/task.h>\n#include <fre"
},
{
"path": "main/audio/wake_words/custom_wake_word.cc",
"chars": 11887,
"preview": "#include \"custom_wake_word.h\"\n#include \"audio_service.h\"\n#include \"system_info.h\"\n#include \"assets.h\"\n\n#include <esp_log"
},
{
"path": "main/audio/wake_words/custom_wake_word.h",
"chars": 2058,
"preview": "#ifndef CUSTOM_WAKE_WORD_H\n#define CUSTOM_WAKE_WORD_H\n\n#include <esp_attr.h>\n#include <esp_mn_iface.h>\n#include <esp_mn_"
},
{
"path": "main/audio/wake_words/esp_wake_word.cc",
"chars": 3161,
"preview": "#include \"esp_wake_word.h\"\n#include <esp_log.h>\n\n\n#define TAG \"EspWakeWord\"\n\nEspWakeWord::EspWakeWord() {\n}\n\nEspWakeWord"
},
{
"path": "main/audio/wake_words/esp_wake_word.h",
"chars": 1240,
"preview": "#ifndef ESP_WAKE_WORD_H\n#define ESP_WAKE_WORD_H\n\n#include <esp_wn_iface.h>\n#include <esp_wn_models.h>\n#include <model_pa"
},
{
"path": "main/boards/aipi-lite/README.md",
"chars": 711,
"preview": "# 编译命令\n\n## 一键编译\n\n```bash\npython scripts/release.py aipi-lite\n```\n\n## 手动配置编译\n\n```bash\nidf.py set-target esp32s3\n```\n\n**配置"
},
{
"path": "main/boards/aipi-lite/README_en.md",
"chars": 1216,
"preview": "# Build Instructions\n\n## One-click Build\n\n```bash\npython scripts/release.py aipi-lite -c config_en.json\n```\n\n## Manual C"
},
{
"path": "main/boards/aipi-lite/aipi-lite.cc",
"chars": 8560,
"preview": "#include <driver/gpio.h>\n#include <driver/i2c_master.h>\n#include <driver/rtc_io.h>\n#include <driver/spi_common.h>\n#inclu"
},
{
"path": "main/boards/aipi-lite/config.h",
"chars": 1557,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n// aipi-lite configuration\n\n#include <driver/gpio.h>\n\n#define AUDIO_I"
},
{
"path": "main/boards/aipi-lite/config.json",
"chars": 287,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"aipi-lite\",\n \"sdkconfig_append\": [\n"
},
{
"path": "main/boards/aipi-lite/config_en.json",
"chars": 488,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"aipi-lite_en\",\n \"sdkconfig_append\":"
},
{
"path": "main/boards/aipi-lite/power_manager.h",
"chars": 5864,
"preview": "#pragma once\n#include <driver/gpio.h>\n#include <esp_adc/adc_oneshot.h>\n#include <esp_timer.h>\n\n#include <functional>\n#in"
},
{
"path": "main/boards/atk-dnesp32s3/atk_dnesp32s3.cc",
"chars": 6942,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/es8388_audio_codec.h\"\n#include \"display/lcd_display.h\"\n#include \"application.h\""
},
{
"path": "main/boards/atk-dnesp32s3/config.h",
"chars": 1704,
"preview": "\n#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n\n#include <driver/gpio.h>\n\n#define AUDIO_INPUT_SAMPLE_RATE 2400"
},
{
"path": "main/boards/atk-dnesp32s3/config.json",
"chars": 338,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"atk-dnesp32s3\",\n \"sdkconfig_append\""
},
{
"path": "main/boards/atk-dnesp32s3-box/atk_dnesp32s3_box.cc",
"chars": 9815,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/es8311_audio_codec.h\"\n#include \"codecs/no_audio_codec.h\"\n#include \"display/lcd_"
},
{
"path": "main/boards/atk-dnesp32s3-box/config.h",
"chars": 1196,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n#include <driver/gpio.h>\n\n#define AUDIO_INPUT_SAMPLE_RATE 24000\n#def"
},
{
"path": "main/boards/atk-dnesp32s3-box/config.json",
"chars": 211,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"atk-dnesp32s3-box\",\n \"sdkconfig_app"
},
{
"path": "main/boards/atk-dnesp32s3-box0/atk_dnesp32s3_box0.cc",
"chars": 15233,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/es8311_audio_codec.h\"\n#include \"display/lcd_display.h\"\n#include \"system_reset.h"
},
{
"path": "main/boards/atk-dnesp32s3-box0/config.h",
"chars": 1832,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n#include <driver/gpio.h>\n\nenum XiaozhiStatus {\n kDevice_null,\n "
},
{
"path": "main/boards/atk-dnesp32s3-box0/config.json",
"chars": 147,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"atk-dnesp32s3-box0\",\n \"sdkconfig_ap"
},
{
"path": "main/boards/atk-dnesp32s3-box0/power_manager.h",
"chars": 5811,
"preview": "#pragma once\n#include <vector>\n#include <functional>\n\n#include <esp_timer.h>\n#include <driver/gpio.h>\n#include <esp_adc/"
},
{
"path": "main/boards/atk-dnesp32s3-box2-4g/atk_dnesp32s3_box2.cc",
"chars": 19160,
"preview": "#include \"dual_network_board.h\"\n#include \"codecs/es8389_audio_codec.h\"\n#include \"display/lcd_display.h\"\n#include \"system"
},
{
"path": "main/boards/atk-dnesp32s3-box2-4g/config.h",
"chars": 2218,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n\n#include <driver/gpio.h>\n\nenum PowerSupply {\n kDeviceTypecSupply,"
},
{
"path": "main/boards/atk-dnesp32s3-box2-4g/config.json",
"chars": 150,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"atk-dnesp32s3-box2-4g\",\n \"sdkconfig"
},
{
"path": "main/boards/atk-dnesp32s3-box2-4g/power_manager.h",
"chars": 6195,
"preview": "#pragma once\n#include <vector>\n#include <functional>\n#include \"esp_io_expander_tca95xx_16bit.h\"\n#include <esp_timer.h>\n#"
},
{
"path": "main/boards/atk-dnesp32s3-box2-wifi/atk_dnesp32s3_box2.cc",
"chars": 18117,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/es8389_audio_codec.h\"\n#include \"display/lcd_display.h\"\n#include \"system_reset.h"
},
{
"path": "main/boards/atk-dnesp32s3-box2-wifi/config.h",
"chars": 2004,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n#include <driver/gpio.h>\n\nenum PowerSupply {\n kDeviceTypecSupply,\n"
},
{
"path": "main/boards/atk-dnesp32s3-box2-wifi/config.json",
"chars": 152,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"atk-dnesp32s3-box2-wifi\",\n \"sdkconf"
},
{
"path": "main/boards/atk-dnesp32s3-box2-wifi/power_manager.h",
"chars": 6195,
"preview": "#pragma once\n#include <vector>\n#include <functional>\n#include \"esp_io_expander_tca95xx_16bit.h\"\n#include <esp_timer.h>\n#"
},
{
"path": "main/boards/atk-dnesp32s3m-4g/atk_dnesp32s3m.cc",
"chars": 7467,
"preview": "#include \"ml307_board.h\"\n#include \"codecs/es8388_audio_codec.h\"\n#include \"display/lcd_display.h\"\n#include \"system_reset."
},
{
"path": "main/boards/atk-dnesp32s3m-4g/config.h",
"chars": 1318,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n\n#include <driver/gpio.h>\n\n#define AUDIO_INPUT_SAMPLE_RATE 24000\n#def"
},
{
"path": "main/boards/atk-dnesp32s3m-wifi/atk_dnesp32s3m.cc",
"chars": 7779,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/es8388_audio_codec.h\"\n#include \"display/lcd_display.h\"\n#include \"application.h\""
},
{
"path": "main/boards/atk-dnesp32s3m-wifi/config.h",
"chars": 1312,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n\n#include <driver/gpio.h>\n\n#define AUDIO_INPUT_SAMPLE_RATE 24000"
},
{
"path": "main/boards/atom-echos3r/README.md",
"chars": 823,
"preview": "# AtomEchoS3R\n## 简介\n\nAtomEchoS3R 是 M5Stack 推出的基于 ESP32-S3-PICO-1-N8R8 的物联网可编程控制器,采用了 ES8311 单声道音频解码器、MEMS 麦克风和 NS4150B 功"
},
{
"path": "main/boards/atom-echos3r/atom_echos3r.cc",
"chars": 2683,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/es8311_audio_codec.h\"\n#include \"application.h\"\n#include \"button.h\"\n#include \"co"
},
{
"path": "main/boards/atom-echos3r/config.h",
"chars": 828,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n// AtomEchoS3R Board configuration\n\n#include <driver/gpio.h>\n\n#define"
},
{
"path": "main/boards/atom-echos3r/config.json",
"chars": 289,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"atom-echos3r\",\n \"sdkconfig_append\":"
},
{
"path": "main/boards/atommatrix-echo-base/README.md",
"chars": 229,
"preview": "# 编译配置命令\n\n**配置编译目标为 ESP32:**\n\n```bash\nidf.py set-target esp32\n```\n\n**打开 menuconfig:**\n\n```bash\nidf.py menuconfig\n```\n\n**"
},
{
"path": "main/boards/atommatrix-echo-base/atommatrix_echo_base.cc",
"chars": 3807,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/es8311_audio_codec.h\"\n#include \"application.h\"\n#include \"button.h\"\n#include \"co"
},
{
"path": "main/boards/atommatrix-echo-base/config.h",
"chars": 795,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n// AtomMatrix+EchoBase Board configuration\n\n#include <driver/gpio.h>\n"
},
{
"path": "main/boards/atommatrix-echo-base/config.json",
"chars": 160,
"preview": "{\n \"target\": \"esp32\",\n \"builds\": [\n {\n \"name\": \"atommatrix-echo-base\",\n \"sdkconfig_ap"
},
{
"path": "main/boards/atoms3-echo-base/README.md",
"chars": 576,
"preview": "# 编译配置命令\n\n**配置编译目标为 ESP32S3:**\n\n```bash\nidf.py set-target esp32s3\n```\n\n**打开 menuconfig:**\n\n```bash\nidf.py menuconfig\n```"
},
{
"path": "main/boards/atoms3-echo-base/atoms3_echo_base.cc",
"chars": 8040,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/es8311_audio_codec.h\"\n#include \"display/lcd_display.h\"\n#include \"application.h\""
},
{
"path": "main/boards/atoms3-echo-base/config.h",
"chars": 1191,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n// AtomS3+EchoBase Board configuration\n\n#include <driver/gpio.h>\n\n#de"
},
{
"path": "main/boards/atoms3-echo-base/config.json",
"chars": 327,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"atoms3-echo-base\",\n \"sdkconfig_appe"
},
{
"path": "main/boards/atoms3r-cam-m12-echo-base/README.md",
"chars": 1192,
"preview": "# AtomS3R CAM/M12 + Echo Base\n\n## 简介\n\n<div align=\"center\">\n <a href=\"https://docs.m5stack.com/zh_CN/core/AtomS3R%20Ca"
},
{
"path": "main/boards/atoms3r-cam-m12-echo-base/atoms3r_cam_m12_echo_base.cc",
"chars": 6035,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/es8311_audio_codec.h\"\n#include \"application.h\"\n#include \"button.h\"\n#include \"co"
},
{
"path": "main/boards/atoms3r-cam-m12-echo-base/config.h",
"chars": 1535,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n// AtomS3R M12+EchoBase Board configuration\n\n#include <driver/gpio.h>"
},
{
"path": "main/boards/atoms3r-cam-m12-echo-base/config.json",
"chars": 301,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"atoms3r-cam-m12-echo-base\",\n \"sdkco"
},
{
"path": "main/boards/atoms3r-echo-base/README.md",
"chars": 547,
"preview": "# 编译配置命令\r\n\r\n**配置编译目标为 ESP32S3:**\r\n\r\n```bash\r\nidf.py set-target esp32s3\r\n```\r\n\r\n**打开 menuconfig:**\r\n\r\n```bash\r\nidf.py men"
},
{
"path": "main/boards/atoms3r-echo-base/atoms3r_echo_base.cc",
"chars": 10471,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/es8311_audio_codec.h\"\n#include \"display/lcd_display.h\"\n#include \"application.h\""
},
{
"path": "main/boards/atoms3r-echo-base/config.h",
"chars": 1192,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n// AtomS3R+EchoBase Board configuration\n\n#include <driver/gpio.h>\n\n#d"
},
{
"path": "main/boards/atoms3r-echo-base/config.json",
"chars": 293,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"atoms3r-echo-base\",\n \"sdkconfig_app"
},
{
"path": "main/boards/bread-compact-esp32/README.md",
"chars": 223,
"preview": "# 编译配置命令\n\n**配置编译目标为 ESP32:**\n\n```bash\nidf.py set-target esp32\n```\n\n**打开 menuconfig:**\n\n```bash\nidf.py menuconfig\n```\n\n**"
},
{
"path": "main/boards/bread-compact-esp32/config.h",
"chars": 1377,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n#include <driver/gpio.h>\n\n#define AUDIO_INPUT_SAMPLE_RATE 16000\n#def"
},
{
"path": "main/boards/bread-compact-esp32/config.json",
"chars": 372,
"preview": "{\n \"target\": \"esp32\",\n \"builds\": [\n {\n \"name\": \"bread-compact-esp32\",\n \"sdkconfig_app"
},
{
"path": "main/boards/bread-compact-esp32/esp32_bread_board.cc",
"chars": 5291,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/no_audio_codec.h\"\n#include \"system_reset.h\"\n#include \"application.h\"\n#include \""
},
{
"path": "main/boards/bread-compact-esp32-lcd/config.h",
"chars": 7937,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n#include <driver/gpio.h>\n\n#define AUDIO_INPUT_SAMPLE_RATE 16000\n#def"
},
{
"path": "main/boards/bread-compact-esp32-lcd/config.json",
"chars": 207,
"preview": "{\n \"target\": \"esp32\",\n \"builds\": [\n {\n \"name\": \"bread-compact-esp32-lcd\",\n \"sdkconfig"
},
{
"path": "main/boards/bread-compact-esp32-lcd/esp32_bread_board_lcd.cc",
"chars": 7085,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/no_audio_codec.h\"\n#include \"display/lcd_display.h\"\n#include \"system_reset.h\"\n#i"
},
{
"path": "main/boards/bread-compact-ml307/compact_ml307_board.cc",
"chars": 6485,
"preview": "#include \"dual_network_board.h\"\n#include \"codecs/no_audio_codec.h\"\n#include \"display/oled_display.h\"\n#include \"system_re"
},
{
"path": "main/boards/bread-compact-ml307/config.h",
"chars": 1398,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n#include <driver/gpio.h>\n\n#define AUDIO_INPUT_SAMPLE_RATE 16000\n#def"
},
{
"path": "main/boards/bread-compact-ml307/config.json",
"chars": 374,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"bread-compact-ml307\",\n \"sdkconfig_a"
},
{
"path": "main/boards/bread-compact-nt26/compact_nt26_board.cc",
"chars": 5915,
"preview": "#include \"board.h\"\n#include \"nt26_board.h\"\n#include \"codecs/no_audio_codec.h\"\n#include \"display/oled_display.h\"\n#include"
},
{
"path": "main/boards/bread-compact-nt26/config.h",
"chars": 1475,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n#include <driver/gpio.h>\n\n#define AUDIO_INPUT_SAMPLE_RATE 16000\n#def"
},
{
"path": "main/boards/bread-compact-nt26/config.json",
"chars": 207,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"bread-compact-nt26\",\n \"sdkconfig_ap"
},
{
"path": "main/boards/bread-compact-wifi/compact_wifi_board.cc",
"chars": 6141,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/no_audio_codec.h\"\n#include \"display/oled_display.h\"\n#include \"system_reset.h\"\n#"
},
{
"path": "main/boards/bread-compact-wifi/config.h",
"chars": 1405,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n#include <driver/gpio.h>\n\n#define AUDIO_INPUT_SAMPLE_RATE 16000\n#def"
},
{
"path": "main/boards/bread-compact-wifi/config.json",
"chars": 372,
"preview": "{\n \"target\": \"esp32s3\",\n \"builds\": [\n {\n \"name\": \"bread-compact-wifi\",\n \"sdkconfig_ap"
},
{
"path": "main/boards/bread-compact-wifi-lcd/compact_wifi_board_lcd.cc",
"chars": 6309,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/no_audio_codec.h\"\n#include \"display/lcd_display.h\"\n#include \"system_reset.h\"\n#i"
},
{
"path": "main/boards/bread-compact-wifi-lcd/config.h",
"chars": 8262,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n#include <driver/gpio.h>\n\n#define AUDIO_INPUT_SAMPLE_RATE 16000\n#def"
},
{
"path": "main/boards/bread-compact-wifi-s3cam/README.md",
"chars": 380,
"preview": "硬件基于基于ESP32S3CAM开发板,代码基于bread-compact-wifi-lcd修改\n使用的摄像头是OV2640\n注意因为摄像头占用IO较多,所以占用了ESP32S3的USB 19 20两个引脚\n连线方式参考config.h文件"
},
{
"path": "main/boards/bread-compact-wifi-s3cam/compact_wifi_board_s3cam.cc",
"chars": 7488,
"preview": "#include \"wifi_board.h\"\n#include \"codecs/no_audio_codec.h\"\n#include \"display/lcd_display.h\"\n#include \"system_reset.h\"\n#i"
},
{
"path": "main/boards/bread-compact-wifi-s3cam/config.h",
"chars": 8867,
"preview": "#ifndef _BOARD_CONFIG_H_\n#define _BOARD_CONFIG_H_\n\n#include <driver/gpio.h>\n\n#define AUDIO_INPUT_SAMPLE_RATE 16000\n#def"
},
{
"path": "main/boards/common/adc_battery_monitor.cc",
"chars": 3688,
"preview": "#include \"adc_battery_monitor.h\"\n\nAdcBatteryMonitor::AdcBatteryMonitor(adc_unit_t adc_unit, adc_channel_t adc_channel, f"
},
{
"path": "main/boards/common/adc_battery_monitor.h",
"chars": 858,
"preview": "#ifndef ADC_BATTERY_MONITOR_H\n#define ADC_BATTERY_MONITOR_H\n\n#include <functional>\n#include <driver/gpio.h>\n#include <ad"
},
{
"path": "main/boards/common/afsk_demod.cc",
"chars": 16958,
"preview": "#include \"afsk_demod.h\"\n#include <cstring>\n#include <algorithm>\n#include \"esp_log.h\"\n#include \"display.h\"\n#include \"ssid"
},
{
"path": "main/boards/common/afsk_demod.h",
"chars": 6593,
"preview": "#pragma once\n\n#include <vector>\n#include <deque>\n#include <string>\n#include <memory>\n#include <optional>\n#include <cmath"
},
{
"path": "main/boards/common/axp2101.cc",
"chars": 815,
"preview": "#include \"axp2101.h\"\n#include \"board.h\"\n#include \"display.h\"\n\n#include <esp_log.h>\n\n#define TAG \"Axp2101\"\n\nAxp2101::Axp2"
},
{
"path": "main/boards/common/axp2101.h",
"chars": 384,
"preview": "#ifndef __AXP2101_H__\n#define __AXP2101_H__\n\n#include \"i2c_device.h\"\n\nclass Axp2101 : public I2cDevice {\npublic:\n Axp"
},
{
"path": "main/boards/common/backlight.cc",
"chars": 3392,
"preview": "#include \"backlight.h\"\n#include \"settings.h\"\n\n#include <esp_log.h>\n#include <driver/ledc.h>\n\n#define TAG \"Backlight\"\n\n\nB"
},
{
"path": "main/boards/common/backlight.h",
"chars": 794,
"preview": "#pragma once\n\n#include <cstdint>\n#include <functional>\n\n#include <driver/gpio.h>\n#include <esp_timer.h>\n\n\nclass Backligh"
},
{
"path": "main/boards/common/blufi.cpp",
"chars": 31246,
"preview": "#include \"blufi.h\"\n#include <algorithm>\n#include <cassert>\n#include <cstring>\n#include <string>\n#include <vector>\n#inclu"
},
{
"path": "main/boards/common/blufi.h",
"chars": 4323,
"preview": "#pragma once\n\n#include <aes/esp_aes.h>\n#include <cassert>\n#include <cstring>\n#include <vector>\n#include \"esp_blufi_api.h"
},
{
"path": "main/boards/common/board.cc",
"chars": 5925,
"preview": "#include \"board.h\"\n#include \"system_info.h\"\n#include \"settings.h\"\n#include \"display/display.h\"\n#include \"display/oled_di"
},
{
"path": "main/boards/common/board.h",
"chars": 3006,
"preview": "#ifndef BOARD_H\n#define BOARD_H\n\n#include <http.h>\n#include <web_socket.h>\n#include <mqtt.h>\n#include <udp.h>\n#include <"
},
{
"path": "main/boards/common/button.cc",
"chars": 3904,
"preview": "#include \"button.h\"\n\n#include <button_gpio.h>\n#include <esp_log.h>\n\n#define TAG \"Button\"\n\n#if CONFIG_SOC_ADC_SUPPORTED\nA"
},
{
"path": "main/boards/common/button.h",
"chars": 1402,
"preview": "#ifndef BUTTON_H_\n#define BUTTON_H_\n\n#include <driver/gpio.h>\n#include <iot_button.h>\n#include <button_types.h>\n#include"
},
{
"path": "main/boards/common/camera.h",
"chars": 466,
"preview": "#ifndef CAMERA_H\n#define CAMERA_H\n\n#include <string>\n\nclass Camera {\npublic:\n virtual void SetExplainUrl(const std::s"
},
{
"path": "main/boards/common/dual_network_board.cc",
"chars": 3126,
"preview": "#include \"dual_network_board.h\"\n#include \"application.h\"\n#include \"display.h\"\n#include \"assets/lang_config.h\"\n#include \""
},
{
"path": "main/boards/common/dual_network_board.h",
"chars": 1704,
"preview": "#ifndef DUAL_NETWORK_BOARD_H\n#define DUAL_NETWORK_BOARD_H\n\n#include \"board.h\"\n#include \"wifi_board.h\"\n#include \"ml307_bo"
},
{
"path": "main/boards/common/esp32_camera.cc",
"chars": 11257,
"preview": "#include \"sdkconfig.h\"\n\n#include <esp_heap_caps.h>\n#include <cstdio>\n#include <cstring>\n#include <esp_log.h>\n#include <i"
},
{
"path": "main/boards/common/esp32_camera.h",
"chars": 1170,
"preview": "#pragma once\n#include \"sdkconfig.h\"\n\n#include <lvgl.h>\n#include <thread>\n#include <memory>\n#include <vector>\n\n#include <"
},
{
"path": "main/boards/common/esp_video.cc",
"chars": 40392,
"preview": "#include \"sdkconfig.h\"\n\n#include <fcntl.h>\n#include <sys/ioctl.h>\n#include <sys/mman.h>\n#include <sys/param.h>\n#include "
},
{
"path": "main/boards/common/esp_video.h",
"chars": 1378,
"preview": "#pragma once\n#include \"sdkconfig.h\"\n\n#include <lvgl.h>\n#include <thread>\n#include <memory>\n#include <vector>\n\n#include <"
},
{
"path": "main/boards/common/i2c_device.cc",
"chars": 1035,
"preview": "#include \"i2c_device.h\"\n\n#include <esp_log.h>\n\n#define TAG \"I2cDevice\"\n\n\nI2cDevice::I2cDevice(i2c_master_bus_handle_t i2"
},
{
"path": "main/boards/common/i2c_device.h",
"chars": 389,
"preview": "#ifndef I2C_DEVICE_H\n#define I2C_DEVICE_H\n\n#include <driver/i2c_master.h>\n\nclass I2cDevice {\npublic:\n I2cDevice(i2c_m"
},
{
"path": "main/boards/common/knob.cc",
"chars": 1409,
"preview": "#include \"knob.h\"\n\nstatic const char* TAG = \"Knob\";\n\nKnob::Knob(gpio_num_t pin_a, gpio_num_t pin_b) {\n knob_config_t "
},
{
"path": "main/boards/common/knob.h",
"chars": 466,
"preview": "#ifndef KNOB_H_\n#define KNOB_H_\n\n#include <driver/gpio.h>\n#include <functional>\n#include <esp_log.h>\n#include <iot_knob."
},
{
"path": "main/boards/common/lamp_controller.h",
"chars": 1507,
"preview": "#ifndef __LAMP_CONTROLLER_H__\n#define __LAMP_CONTROLLER_H__\n\n#include \"mcp_server.h\"\n\n\nclass LampController {\nprivate:\n "
},
{
"path": "main/boards/common/ml307_board.cc",
"chars": 8980,
"preview": "#include \"ml307_board.h\"\n\n#include \"audio_codec.h\"\n#include \"display.h\"\n\n#include <esp_log.h>\n#include <esp_timer.h>\n#in"
},
{
"path": "main/boards/common/ml307_board.h",
"chars": 1226,
"preview": "#ifndef ML307_BOARD_H\n#define ML307_BOARD_H\n\n#include <memory>\n#include <at_modem.h>\n#include \"board.h\"\n\n\nclass Ml307Boa"
},
{
"path": "main/boards/common/nt26_board.cc",
"chars": 8938,
"preview": "#include \"nt26_board.h\"\n#include \"display.h\"\n#include \"application.h\"\n#include \"audio_codec.h\"\n#include <esp_log.h>\n#inc"
},
{
"path": "main/boards/common/nt26_board.h",
"chars": 2020,
"preview": "#ifndef NT26_BOARD_H\n#define NT26_BOARD_H\n\n#include <memory>\n#include <uart_eth_modem.h>\n#include <esp_network.h>\n#inclu"
},
{
"path": "main/boards/common/power_save_timer.cc",
"chars": 4160,
"preview": "#include \"power_save_timer.h\"\n#include \"application.h\"\n#include \"settings.h\"\n\n#include <esp_log.h>\n\n#define TAG \"PowerSa"
},
{
"path": "main/boards/common/power_save_timer.h",
"chars": 899,
"preview": "#pragma once\n\n#include <functional>\n\n#include <esp_timer.h>\n#include <esp_pm.h>\n\nclass PowerSaveTimer {\npublic:\n Powe"
}
]
// ... and 1226 more files (download for full content)
About this extraction
This page contains the full source code of the 78/xiaozhi-esp32 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1426 files (3.7 MB), approximately 1.0M tokens, and a symbol index with 2663 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.