diff --git a/.gitignore b/.gitignore index 752db531..62655f1c 100644 --- a/.gitignore +++ b/.gitignore @@ -13,7 +13,6 @@ main/assets/lang_config.h main/mmap_generate_emoji.h .DS_Store .cache -main/mmap_generate_emoji.h *.pyc *.bin mmap_generate_*.h diff --git a/CMakeLists.txt b/CMakeLists.txt index db5f222e..2a248f4d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ # CMakeLists in this exact order for cmake to work correctly cmake_minimum_required(VERSION 3.16) -set(PROJECT_VER "1.9.0") +set(PROJECT_VER "2.0.0") # Add this line to disable the specific warning add_compile_options(-Wno-missing-field-initializers) diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index c3ae3485..baf86b2a 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -14,6 +14,7 @@ set(SOURCES "audio/audio_codec.cc" "display/display.cc" "display/lcd_display.cc" "display/oled_display.cc" + "display/emoji_collection.cc" "protocols/protocol.cc" "protocols/mqtt_protocol.cc" "protocols/websocket_protocol.cc" @@ -23,6 +24,7 @@ set(SOURCES "audio/audio_codec.cc" "ota.cc" "settings.cc" "device_state_event.cc" + "assets.cc" "main.cc" ) diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 45adc39c..a55b728b 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -6,6 +6,11 @@ config OTA_URL help The application will access this URL to check for new firmwares and server address. +config DEFAULT_ASSETS_URL_PREFIX + string "Default Assets URL Prefix" + default "https://files.xiaozhi.me/assets/default/" + help + The assets will be downloaded from this URL. choice prompt "Default Language" diff --git a/main/application.cc b/main/application.cc index adb4eb91..9bc89a31 100644 --- a/main/application.cc +++ b/main/application.cc @@ -7,6 +7,8 @@ #include "websocket_protocol.h" #include "assets/lang_config.h" #include "mcp_server.h" +#include "assets.h" +#include "settings.h" #include #include @@ -67,6 +69,65 @@ Application::~Application() { vEventGroupDelete(event_group_); } +void Application::CheckAssetsVersion() { + auto& board = Board::GetInstance(); + auto display = board.GetDisplay(); + auto assets = board.GetAssets(); + if (!assets) { + ESP_LOGE(TAG, "Assets is not set for board %s", BOARD_NAME); + return; + } + + if (!assets->partition_valid()) { + ESP_LOGE(TAG, "Assets partition is not valid 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"); + } + if (download_url.empty() && !assets->checksum_valid()) { + download_url = assets->default_assets_url(); + } + + if (!download_url.empty()) { + 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.SetPowerSaveMode(false); + display->SetChatMessage("system", Lang::Strings::PLEASE_WAIT); + + bool success = assets->Download(download_url, [display](int progress, size_t speed) -> void { + std::thread([display, progress, speed]() { + char buffer[32]; + snprintf(buffer, sizeof(buffer), "%d%% %uKB/s", progress, speed / 1024); + display->SetChatMessage("system", buffer); + }).detach(); + }); + + board.SetPowerSaveMode(true); + 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)); + return; + } + } + + // Apply assets + assets->Apply(); + display->SetChatMessage("system", ""); + display->SetEmotion("microchip_ai"); +} + void Application::CheckNewVersion(Ota& ota) { const int MAX_RETRY = 10; int retry_count = 0; @@ -358,6 +419,9 @@ void Application::Start() { // Update the status bar immediately to show the network state display->UpdateStatusBar(true); + // Check for new assets version + CheckAssetsVersion(); + // Check for new firmware version or get the MQTT broker address Ota ota; CheckNewVersion(ota); @@ -366,7 +430,9 @@ void Application::Start() { display->SetStatus(Lang::Strings::LOADING_PROTOCOL); // Add MCP common tools before initializing the protocol - McpServer::GetInstance().AddCommonTools(); + auto& mcp_server = McpServer::GetInstance(); + mcp_server.AddCommonTools(); + mcp_server.AddUserOnlyTools(); if (ota.HasMqttConfig()) { protocol_ = std::make_unique(); @@ -496,7 +562,6 @@ void Application::Start() { }); bool protocol_started = protocol_->Start(); - // Print heap stats SystemInfo::PrintHeapStats(); SetDeviceState(kDeviceStateIdle); @@ -541,7 +606,7 @@ void Application::MainEventLoop() { if (bits & MAIN_EVENT_SEND_AUDIO) { while (auto packet = audio_service_.PopPacketFromSendQueue()) { - if (!protocol_->SendAudio(std::move(packet))) { + if (protocol_ && !protocol_->SendAudio(std::move(packet))) { break; } } @@ -623,7 +688,9 @@ void Application::OnWakeWordDetected() { void Application::AbortSpeaking(AbortReason reason) { ESP_LOGI(TAG, "Abort speaking"); aborted_ = true; - protocol_->SendAbortSpeaking(reason); + if (protocol_) { + protocol_->SendAbortSpeaking(reason); + } } void Application::SetListeningMode(ListeningMode mode) { @@ -695,6 +762,12 @@ void Application::SetDeviceState(DeviceState state) { void Application::Reboot() { ESP_LOGI(TAG, "Rebooting..."); + // Disconnect the audio channel + if (protocol_ && protocol_->IsAudioChannelOpened()) { + protocol_->CloseAudioChannel(); + } + protocol_.reset(); + audio_service_.Stop(); esp_restart(); } diff --git a/main/application.h b/main/application.h index f5659d6b..0e79cf0b 100644 --- a/main/application.h +++ b/main/application.h @@ -85,6 +85,7 @@ private: void OnWakeWordDetected(); void CheckNewVersion(Ota& ota); + void CheckAssetsVersion(); void ShowActivationCode(const std::string& code, const std::string& message); void SetListeningMode(ListeningMode mode); }; diff --git a/main/assets.cc b/main/assets.cc new file mode 100644 index 00000000..1df1b73b --- /dev/null +++ b/main/assets.cc @@ -0,0 +1,355 @@ +#include "assets.h" +#include "board.h" +#include "display.h" +#include "application.h" + +#include +#include +#include +#include + + +#define TAG "Assets" + +struct mmap_assets_table { + char asset_name[32]; /*!< Name of the asset */ + uint32_t asset_size; /*!< Size of the asset */ + uint32_t asset_offset; /*!< Offset of the asset */ + uint16_t asset_width; /*!< Width of the asset */ + uint16_t asset_height; /*!< Height of the asset */ +}; + + +Assets::Assets(std::string default_assets_url) { + // If the default_assets_url is not a http url, add the prefix + if (default_assets_url.find("http") == 0) { + default_assets_url_ = default_assets_url; + } else { + default_assets_url_ = CONFIG_DEFAULT_ASSETS_URL_PREFIX + default_assets_url; + } + + // Initialize the partition + InitializePartition(); +} + +Assets::~Assets() { + if (custom_emoji_collection_ != nullptr) { + delete custom_emoji_collection_; + } + if (text_font_) { + cbin_font_delete(text_font_); + } + if (mmap_handle_ != 0) { + esp_partition_munmap(mmap_handle_); + } +} + +uint32_t Assets::CalculateChecksum(const char* data, uint32_t length) { + uint32_t checksum = 0; + for (uint32_t i = 0; i < length; i++) { + checksum += data[i]; + } + return checksum & 0xFFFF; +} + +bool Assets::InitializePartition() { + partition_valid_ = false; + checksum_valid_ = false; + assets_.clear(); + + partition_ = esp_partition_find_first(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, "assets"); + if (partition_ == nullptr) { + ESP_LOGI(TAG, "No assets partition found"); + return false; + } + + int free_pages = spi_flash_mmap_get_free_pages(SPI_FLASH_MMAP_DATA); + uint32_t storage_size = free_pages * 64 * 1024; + ESP_LOGI(TAG, "The storage free size is %ld KB", storage_size / 1024); + ESP_LOGI(TAG, "The partition size is %ld KB", partition_->size / 1024); + if (storage_size < partition_->size) { + ESP_LOGE(TAG, "The free size %ld KB is less than assets partition required %ld KB", storage_size / 1024, partition_->size / 1024); + return false; + } + + esp_err_t err = esp_partition_mmap(partition_, 0, partition_->size, ESP_PARTITION_MMAP_DATA, (const void**)&mmap_root_, &mmap_handle_); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to mmap assets partition: %s", esp_err_to_name(err)); + return false; + } + + partition_valid_ = true; + + uint32_t stored_files = *(uint32_t*)(mmap_root_ + 0); + uint32_t stored_chksum = *(uint32_t*)(mmap_root_ + 4); + uint32_t stored_len = *(uint32_t*)(mmap_root_ + 8); + + if (stored_len > partition_->size - 12) { + ESP_LOGD(TAG, "The stored_len (0x%lx) is greater than the partition size (0x%lx) - 12", stored_len, partition_->size); + return false; + } + + auto start_time = esp_timer_get_time(); + uint32_t calculated_checksum = CalculateChecksum(mmap_root_ + 12, stored_len); + auto end_time = esp_timer_get_time(); + ESP_LOGI(TAG, "The checksum calculation time is %d ms", int((end_time - start_time) / 1000)); + + if (calculated_checksum != stored_chksum) { + ESP_LOGE(TAG, "The calculated checksum (0x%lx) does not match the stored checksum (0x%lx)", calculated_checksum, stored_chksum); + return false; + } + + checksum_valid_ = true; + + for (uint32_t i = 0; i < stored_files; i++) { + auto item = (const mmap_assets_table*)(mmap_root_ + 12 + i * sizeof(mmap_assets_table)); + auto asset = Asset{ + .size = static_cast(item->asset_size), + .offset = static_cast(12 + sizeof(mmap_assets_table) * stored_files + item->asset_offset) + }; + assets_[item->asset_name] = asset; + } + return checksum_valid_; +} + +bool Assets::Apply() { + void* ptr = nullptr; + size_t size = 0; + if (!GetAssetData("index.json", ptr, size)) { + ESP_LOGE(TAG, "The index.json file is not found"); + return false; + } + cJSON* root = cJSON_ParseWithLength(static_cast(ptr), size); + if (root == nullptr) { + ESP_LOGE(TAG, "The index.json file is not valid"); + return false; + } + + cJSON* srmodels = cJSON_GetObjectItem(root, "srmodels"); + if (cJSON_IsString(srmodels)) { + std::string srmodels_file = srmodels->valuestring; + if (GetAssetData(srmodels_file, ptr, size)) { + if (models_list_ != nullptr) { + esp_srmodel_deinit(models_list_); + models_list_ = nullptr; + } + models_list_ = srmodel_load(static_cast(ptr)); + if (models_list_ != nullptr) { + auto& app = Application::GetInstance(); + app.GetAudioService().SetModelsList(models_list_); + } else { + ESP_LOGE(TAG, "Failed to load srmodels.bin"); + } + } else { + ESP_LOGE(TAG, "The srmodels file %s is not found", srmodels_file.c_str()); + } + } + + cJSON* font = cJSON_GetObjectItem(root, "text_font"); + if (cJSON_IsString(font)) { + std::string fonts_text_file = font->valuestring; + if (GetAssetData(fonts_text_file, ptr, size)) { + if (text_font_ != nullptr) { + cbin_font_delete(text_font_); + } + text_font_ = cbin_font_create(static_cast(ptr)); + if (text_font_ == nullptr) { + ESP_LOGE(TAG, "Failed to load fonts.bin"); + } + } else { + ESP_LOGE(TAG, "The font file %s is not found", fonts_text_file.c_str()); + } + } + + cJSON* emoji_collection = cJSON_GetObjectItem(root, "emoji_collection"); + if (cJSON_IsArray(emoji_collection)) { + if (custom_emoji_collection_ != nullptr) { + delete custom_emoji_collection_; + } + custom_emoji_collection_ = new CustomEmojiCollection(); + int emoji_count = cJSON_GetArraySize(emoji_collection); + for (int i = 0; i < emoji_count; i++) { + cJSON* emoji = cJSON_GetArrayItem(emoji_collection, i); + if (cJSON_IsObject(emoji)) { + cJSON* name = cJSON_GetObjectItem(emoji, "name"); + cJSON* file = cJSON_GetObjectItem(emoji, "file"); + if (cJSON_IsString(name) && cJSON_IsString(file)) { + if (!GetAssetData(file->valuestring, ptr, size)) { + ESP_LOGE(TAG, "Emoji %s image file %s is not found", name->valuestring, file->valuestring); + continue; + } + auto img = new lv_img_dsc_t { + .header = { + .magic = LV_IMAGE_HEADER_MAGIC, + .cf = LV_COLOR_FORMAT_RAW_ALPHA, + }, + .data_size = size, + .data = static_cast(ptr), + }; + custom_emoji_collection_->AddEmoji(name->valuestring, img); + } + } + } + } + + auto display = Board::GetInstance().GetDisplay(); + ESP_LOGI(TAG, "Applying new assets to display"); + display->UpdateStyle({ + .text_font = text_font_, + .icon_font = nullptr, + .emoji_collection = custom_emoji_collection_, + }); + + cJSON_Delete(root); + return true; +} + +bool Assets::Download(std::string url, std::function progress_callback) { + ESP_LOGI(TAG, "Downloading new version of assets from %s", url.c_str()); + + // 取消当前资源分区的内存映射 + if (mmap_handle_ != 0) { + esp_partition_munmap(mmap_handle_); + mmap_handle_ = 0; + mmap_root_ = nullptr; + } + partition_valid_ = false; + checksum_valid_ = false; + assets_.clear(); + + // 下载新的资源文件 + auto network = Board::GetInstance().GetNetwork(); + auto http = network->CreateHttp(0); + + if (!http->Open("GET", url)) { + ESP_LOGE(TAG, "Failed to open HTTP connection"); + return false; + } + + if (http->GetStatusCode() != 200) { + ESP_LOGE(TAG, "Failed to get assets, status code: %d", http->GetStatusCode()); + return false; + } + + size_t content_length = http->GetBodyLength(); + if (content_length == 0) { + ESP_LOGE(TAG, "Failed to get content length"); + return false; + } + + if (content_length > partition_->size) { + ESP_LOGE(TAG, "Assets file size (%u) is larger than partition size (%lu)", content_length, partition_->size); + return false; + } + + // 定义扇区大小为4KB(ESP32的标准扇区大小) + const size_t SECTOR_SIZE = esp_partition_get_main_flash_sector_size(); + + // 计算需要擦除的扇区数量 + size_t sectors_to_erase = (content_length + SECTOR_SIZE - 1) / SECTOR_SIZE; // 向上取整 + size_t total_erase_size = sectors_to_erase * SECTOR_SIZE; + + ESP_LOGI(TAG, "Sector size: %u, content length: %u, sectors to erase: %u, total erase size: %u", + SECTOR_SIZE, content_length, sectors_to_erase, total_erase_size); + + // 写入新的资源文件到分区,一边erase一边写入 + char buffer[512]; + size_t total_written = 0; + size_t recent_written = 0; + size_t current_sector = 0; + auto last_calc_time = esp_timer_get_time(); + + while (true) { + int ret = http->Read(buffer, sizeof(buffer)); + if (ret < 0) { + ESP_LOGE(TAG, "Failed to read HTTP data: %s", esp_err_to_name(ret)); + return false; + } + + if (ret == 0) { + break; + } + + // 检查是否需要擦除新的扇区 + size_t write_end_offset = total_written + ret; + size_t needed_sectors = (write_end_offset + SECTOR_SIZE - 1) / SECTOR_SIZE; + + // 擦除需要的新扇区 + while (current_sector < needed_sectors) { + size_t sector_start = current_sector * SECTOR_SIZE; + size_t sector_end = (current_sector + 1) * SECTOR_SIZE; + + // 确保擦除范围不超过分区大小 + if (sector_end > partition_->size) { + ESP_LOGE(TAG, "Sector end (%u) exceeds partition size (%lu)", sector_end, partition_->size); + return false; + } + + ESP_LOGD(TAG, "Erasing sector %u (offset: %u, size: %u)", current_sector, sector_start, SECTOR_SIZE); + esp_err_t err = esp_partition_erase_range(partition_, sector_start, SECTOR_SIZE); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to erase sector %u at offset %u: %s", current_sector, sector_start, esp_err_to_name(err)); + return false; + } + + current_sector++; + } + + // 写入数据到分区 + esp_err_t err = esp_partition_write(partition_, total_written, buffer, ret); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to write to assets partition at offset %u: %s", total_written, esp_err_to_name(err)); + return false; + } + + total_written += ret; + recent_written += ret; + + // 计算进度和速度 + if (esp_timer_get_time() - last_calc_time >= 1000000 || total_written == content_length || ret == 0) { + size_t progress = total_written * 100 / content_length; + size_t speed = recent_written; // 每秒的字节数 + ESP_LOGI(TAG, "Progress: %u%% (%u/%u), Speed: %u B/s, Sectors erased: %u", + progress, total_written, content_length, speed, current_sector); + if (progress_callback) { + progress_callback(progress, speed); + } + last_calc_time = esp_timer_get_time(); + recent_written = 0; // 重置最近写入的字节数 + } + } + + http->Close(); + + if (total_written != content_length) { + ESP_LOGE(TAG, "Downloaded size (%u) does not match expected size (%u)", total_written, content_length); + return false; + } + + ESP_LOGI(TAG, "Assets download completed, total written: %u bytes, total sectors erased: %u", + total_written, current_sector); + + // 重新初始化资源分区 + if (!InitializePartition()) { + ESP_LOGE(TAG, "Failed to re-initialize assets partition"); + return false; + } + + return true; +} + +bool Assets::GetAssetData(const std::string& name, void*& ptr, size_t& size) { + auto asset = assets_.find(name); + if (asset == assets_.end()) { + return false; + } + auto data = (const char*)(mmap_root_ + asset->second.offset); + if (data[0] != 'Z' || data[1] != 'Z') { + ESP_LOGE(TAG, "The asset %s is not valid with magic %02x%02x", name.c_str(), data[0], data[1]); + return false; + } + + ptr = static_cast(const_cast(data + 2)); + size = asset->second.size; + return true; +} diff --git a/main/assets.h b/main/assets.h new file mode 100644 index 00000000..fa944959 --- /dev/null +++ b/main/assets.h @@ -0,0 +1,68 @@ +#ifndef ASSETS_H +#define ASSETS_H + +#include "emoji_collection.h" + +#include +#include +#include + +#include +#include +#include +#include + + +// All combinations of wakenet_model, text_font, emoji_collection can be found from the following url: +// https://github.com/78/xiaozhi-fonts/releases/tag/assets + +#define ASSETS_PUHUI_COMMON_14_1 "none-font_puhui_common_14_1-none.bin" +#define ASSETS_XIAOZHI_WAKENET "wn9_nihaoxiaozhi_tts-none-none.bin" +#define ASSETS_XIAOZHI_WAKENET_SMALL "wn9s_nihaoxiaozhi-none-none.bin" +#define ASSETS_XIAOZHI_PUHUI_COMMON_14_1 "wn9_nihaoxiaozhi_tts-font_puhui_common_14_1-none.bin" +#define ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32 "wn9_nihaoxiaozhi_tts-font_puhui_common_16_4-emojis_32.bin" +#define ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_64 "wn9_nihaoxiaozhi_tts-font_puhui_common_16_4-emojis_64.bin" +#define ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64 "wn9_nihaoxiaozhi_tts-font_puhui_common_20_4-emojis_64.bin" +#define ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64 "wn9_nihaoxiaozhi_tts-font_puhui_common_30_4-emojis_64.bin" +#define ASSETS_XIAOZHI_S_PUHUI_COMMON_14_1 "wn9s_nihaoxiaozhi-font_puhui_common_14_1-none.bin" +#define ASSETS_XIAOZHI_S_PUHUI_COMMON_20_4_EMOJI_64 "wn9s_nihaoxiaozhi-font_puhui_common_20_4-emojis_64.bin" +#define ASSETS_XIAOZHI_S_PUHUI_COMMON_30_4_EMOJI_64 "wn9s_nihaoxiaozhi-font_puhui_common_30_4-emojis_64.bin" + +struct Asset { + size_t size; + size_t offset; +}; + +class Assets { +public: + Assets(std::string default_assets_url); + ~Assets(); + + bool Download(std::string url, std::function progress_callback); + bool Apply(); + + inline bool partition_valid() const { return partition_valid_; } + inline bool checksum_valid() const { return checksum_valid_; } + inline std::string default_assets_url() const { return default_assets_url_; } + +private: + Assets(const Assets&) = delete; + Assets& operator=(const Assets&) = delete; + + bool InitializePartition(); + uint32_t CalculateChecksum(const char* data, uint32_t length); + bool GetAssetData(const std::string& name, void*& ptr, size_t& size); + + const esp_partition_t* partition_ = nullptr; + esp_partition_mmap_handle_t mmap_handle_ = 0; + const char* mmap_root_ = nullptr; + bool partition_valid_ = false; + bool checksum_valid_ = false; + std::string default_assets_url_; + lv_font_t* text_font_ = nullptr; + srmodel_list_t* models_list_ = nullptr; + CustomEmojiCollection* custom_emoji_collection_ = nullptr; + std::map assets_; +}; + +#endif diff --git a/main/assets/locales/ar-SA/language.json b/main/assets/locales/ar-SA/language.json index 5811915a..88263e40 100644 --- a/main/assets/locales/ar-SA/language.json +++ b/main/assets/locales/ar-SA/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"ar-SA" + "type": "ar-SA" }, "strings": { - "WARNING":"تحذير", - "INFO":"معلومات", - "ERROR":"خطأ", + "WARNING": "تحذير", + "INFO": "معلومات", + "ERROR": "خطأ", "VERSION": "الإصدار ", - "LOADING_PROTOCOL":"الاتصال بالخادم...", - "INITIALIZING":"التهيئة...", - "PIN_ERROR":"يرجى إدخال بطاقة SIM", - "REG_ERROR":"لا يمكن الوصول إلى الشبكة، يرجى التحقق من حالة بطاقة البيانات", - "DETECTING_MODULE":"اكتشاف الوحدة...", - "REGISTERING_NETWORK":"انتظار الشبكة...", - "CHECKING_NEW_VERSION":"فحص الإصدار الجديد...", - "CHECK_NEW_VERSION_FAILED":"فشل فحص الإصدار الجديد، سيتم المحاولة خلال %d ثانية: %s", - "SWITCH_TO_WIFI_NETWORK":"التبديل إلى Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"التبديل إلى 4G...", - - "STANDBY":"في الانتظار", - "CONNECT_TO":"الاتصال بـ ", - "CONNECTING":"جاري الاتصال...", - "CONNECTED_TO":"متصل بـ ", - - "LISTENING":"الاستماع...", - "SPEAKING":"التحدث...", - - "SERVER_NOT_FOUND":"البحث عن خدمة متاحة", - "SERVER_NOT_CONNECTED":"لا يمكن الاتصال بالخدمة، يرجى المحاولة لاحقاً", - "SERVER_TIMEOUT":"انتهت مهلة الاستجابة", - "SERVER_ERROR":"فشل الإرسال، يرجى التحقق من الشبكة", - - "CONNECT_TO_HOTSPOT":"اتصل الهاتف بنقطة الاتصال ", - "ACCESS_VIA_BROWSER":"،الوصول عبر المتصفح ", - "WIFI_CONFIG_MODE":"وضع تكوين الشبكة", - "ENTERING_WIFI_CONFIG_MODE":"الدخول في وضع تكوين الشبكة...", - "SCANNING_WIFI":"فحص Wi-Fi...", - + "LOADING_PROTOCOL": "الاتصال بالخادم...", + "INITIALIZING": "التهيئة...", + "PIN_ERROR": "يرجى إدخال بطاقة SIM", + "REG_ERROR": "لا يمكن الوصول إلى الشبكة، يرجى التحقق من حالة بطاقة البيانات", + "DETECTING_MODULE": "اكتشاف الوحدة...", + "REGISTERING_NETWORK": "انتظار الشبكة...", + "CHECKING_NEW_VERSION": "فحص الإصدار الجديد...", + "CHECK_NEW_VERSION_FAILED": "فشل فحص الإصدار الجديد، سيتم المحاولة خلال %d ثانية: %s", + "SWITCH_TO_WIFI_NETWORK": "التبديل إلى Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "التبديل إلى 4G...", + "STANDBY": "في الانتظار", + "CONNECT_TO": "الاتصال بـ ", + "CONNECTING": "جاري الاتصال...", + "CONNECTED_TO": "متصل بـ ", + "LISTENING": "الاستماع...", + "SPEAKING": "التحدث...", + "SERVER_NOT_FOUND": "البحث عن خدمة متاحة", + "SERVER_NOT_CONNECTED": "لا يمكن الاتصال بالخدمة، يرجى المحاولة لاحقاً", + "SERVER_TIMEOUT": "انتهت مهلة الاستجابة", + "SERVER_ERROR": "فشل الإرسال، يرجى التحقق من الشبكة", + "CONNECT_TO_HOTSPOT": "اتصل الهاتف بنقطة الاتصال ", + "ACCESS_VIA_BROWSER": "،الوصول عبر المتصفح ", + "WIFI_CONFIG_MODE": "وضع تكوين الشبكة", + "ENTERING_WIFI_CONFIG_MODE": "الدخول في وضع تكوين الشبكة...", + "SCANNING_WIFI": "فحص Wi-Fi...", "NEW_VERSION": "إصدار جديد ", - "OTA_UPGRADE":"تحديث OTA", - "UPGRADING":"تحديث النظام...", - "UPGRADE_FAILED":"فشل التحديث", - "ACTIVATION":"تفعيل الجهاز", - - "BATTERY_LOW":"البطارية منخفضة", - "BATTERY_CHARGING":"جاري الشحن", - "BATTERY_FULL":"البطارية ممتلئة", - "BATTERY_NEED_CHARGE":"البطارية منخفضة، يرجى الشحن", - - "VOLUME":"الصوت ", - "MUTED":"صامت", - "MAX_VOLUME":"أقصى صوت", - - "RTC_MODE_OFF":"AEC مُوقف", - "RTC_MODE_ON":"AEC مُشغل" + "OTA_UPGRADE": "تحديث OTA", + "UPGRADING": "تحديث النظام...", + "UPGRADE_FAILED": "فشل التحديث", + "ACTIVATION": "تفعيل الجهاز", + "BATTERY_LOW": "البطارية منخفضة", + "BATTERY_CHARGING": "جاري الشحن", + "BATTERY_FULL": "البطارية ممتلئة", + "BATTERY_NEED_CHARGE": "البطارية منخفضة، يرجى الشحن", + "VOLUME": "الصوت ", + "MUTED": "صامت", + "MAX_VOLUME": "أقصى صوت", + "RTC_MODE_OFF": "AEC مُوقف", + "RTC_MODE_ON": "AEC مُشغل", + "DOWNLOAD_ASSETS_FAILED": "فشل في تنزيل الموارد", + "LOADING_ASSETS": "جاري تحميل الموارد...", + "PLEASE_WAIT": "يرجى الانتظار...", + "FOUND_NEW_ASSETS": "تم العثور على موارد جديدة: %s", + "HELLO_MY_FRIEND": "مرحباً، صديقي!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/cs-CZ/language.json b/main/assets/locales/cs-CZ/language.json index be2c59a4..1e18a5cd 100644 --- a/main/assets/locales/cs-CZ/language.json +++ b/main/assets/locales/cs-CZ/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"cs-CZ" + "type": "cs-CZ" }, "strings": { - "WARNING":"Varování", - "INFO":"Informace", - "ERROR":"Chyba", + "WARNING": "Varování", + "INFO": "Informace", + "ERROR": "Chyba", "VERSION": "Verze ", - "LOADING_PROTOCOL":"Připojování k serveru...", - "INITIALIZING":"Inicializace...", - "PIN_ERROR":"Prosím vložte SIM kartu", - "REG_ERROR":"Nelze se připojit k síti, zkontrolujte stav datové karty", - "DETECTING_MODULE":"Detekce modulu...", - "REGISTERING_NETWORK":"Čekání na síť...", - "CHECKING_NEW_VERSION":"Kontrola nové verze...", - "CHECK_NEW_VERSION_FAILED":"Kontrola nové verze selhala, opakování za %d sekund: %s", - "SWITCH_TO_WIFI_NETWORK":"Přepínání na Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"Přepínání na 4G...", - - "STANDBY":"Pohotovost", - "CONNECT_TO":"Připojit k ", - "CONNECTING":"Připojování...", - "CONNECTED_TO":"Připojeno k ", - - "LISTENING":"Naslouchání...", - "SPEAKING":"Mluvení...", - - "SERVER_NOT_FOUND":"Hledání dostupné služby", - "SERVER_NOT_CONNECTED":"Nelze se připojit ke službě, zkuste to později", - "SERVER_TIMEOUT":"Čas odpovědi vypršel", - "SERVER_ERROR":"Odeslání selhalo, zkontrolujte síť", - - "CONNECT_TO_HOTSPOT":"Připojte telefon k hotspotu ", - "ACCESS_VIA_BROWSER":",přístup přes prohlížeč ", - "WIFI_CONFIG_MODE":"Režim konfigurace sítě", - "ENTERING_WIFI_CONFIG_MODE":"Vstup do režimu konfigurace sítě...", - "SCANNING_WIFI":"Skenování Wi-Fi...", - + "LOADING_PROTOCOL": "Připojování k serveru...", + "INITIALIZING": "Inicializace...", + "PIN_ERROR": "Prosím vložte SIM kartu", + "REG_ERROR": "Nelze se připojit k síti, zkontrolujte stav datové karty", + "DETECTING_MODULE": "Detekce modulu...", + "REGISTERING_NETWORK": "Čekání na síť...", + "CHECKING_NEW_VERSION": "Kontrola nové verze...", + "CHECK_NEW_VERSION_FAILED": "Kontrola nové verze selhala, opakování za %d sekund: %s", + "SWITCH_TO_WIFI_NETWORK": "Přepínání na Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "Přepínání na 4G...", + "STANDBY": "Pohotovost", + "CONNECT_TO": "Připojit k ", + "CONNECTING": "Připojování...", + "CONNECTED_TO": "Připojeno k ", + "LISTENING": "Naslouchání...", + "SPEAKING": "Mluvení...", + "SERVER_NOT_FOUND": "Hledání dostupné služby", + "SERVER_NOT_CONNECTED": "Nelze se připojit ke službě, zkuste to později", + "SERVER_TIMEOUT": "Čas odpovědi vypršel", + "SERVER_ERROR": "Odeslání selhalo, zkontrolujte síť", + "CONNECT_TO_HOTSPOT": "Připojte telefon k hotspotu ", + "ACCESS_VIA_BROWSER": ",přístup přes prohlížeč ", + "WIFI_CONFIG_MODE": "Režim konfigurace sítě", + "ENTERING_WIFI_CONFIG_MODE": "Vstup do režimu konfigurace sítě...", + "SCANNING_WIFI": "Skenování Wi-Fi...", "NEW_VERSION": "Nová verze ", - "OTA_UPGRADE":"OTA upgrade", - "UPGRADING":"Aktualizace systému...", - "UPGRADE_FAILED":"Upgrade selhal", - "ACTIVATION":"Aktivace zařízení", - - "BATTERY_LOW":"Slabá baterie", - "BATTERY_CHARGING":"Nabíjení", - "BATTERY_FULL":"Baterie plná", - "BATTERY_NEED_CHARGE":"Slabá baterie, prosím nabijte", - - "VOLUME":"Hlasitost ", - "MUTED":"Ztlumeno", - "MAX_VOLUME":"Maximální hlasitost", - - "RTC_MODE_OFF":"AEC vypnuto", - "RTC_MODE_ON":"AEC zapnuto" + "OTA_UPGRADE": "OTA upgrade", + "UPGRADING": "Aktualizace systému...", + "UPGRADE_FAILED": "Upgrade selhal", + "ACTIVATION": "Aktivace zařízení", + "BATTERY_LOW": "Slabá baterie", + "BATTERY_CHARGING": "Nabíjení", + "BATTERY_FULL": "Baterie plná", + "BATTERY_NEED_CHARGE": "Slabá baterie, prosím nabijte", + "VOLUME": "Hlasitost ", + "MUTED": "Ztlumeno", + "MAX_VOLUME": "Maximální hlasitost", + "RTC_MODE_OFF": "AEC vypnuto", + "RTC_MODE_ON": "AEC zapnuto", + "DOWNLOAD_ASSETS_FAILED": "Nepodařilo se stáhnout prostředky", + "LOADING_ASSETS": "Načítání prostředků...", + "PLEASE_WAIT": "Prosím čekejte...", + "FOUND_NEW_ASSETS": "Nalezeny nové prostředky: %s", + "HELLO_MY_FRIEND": "Ahoj, můj příteli!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/de-DE/language.json b/main/assets/locales/de-DE/language.json index 8bc74df7..724e2676 100644 --- a/main/assets/locales/de-DE/language.json +++ b/main/assets/locales/de-DE/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"de-DE" + "type": "de-DE" }, "strings": { - "WARNING":"Warnung", - "INFO":"Information", - "ERROR":"Fehler", + "WARNING": "Warnung", + "INFO": "Information", + "ERROR": "Fehler", "VERSION": "Version ", - "LOADING_PROTOCOL":"Verbindung zum Server...", - "INITIALIZING":"Initialisierung...", - "PIN_ERROR":"Bitte SIM-Karte einlegen", - "REG_ERROR":"Netzwerkverbindung fehlgeschlagen, bitte Datenkartenstatus prüfen", - "DETECTING_MODULE":"Modul erkennen...", - "REGISTERING_NETWORK":"Auf Netzwerk warten...", - "CHECKING_NEW_VERSION":"Neue Version prüfen...", - "CHECK_NEW_VERSION_FAILED":"Neue Version prüfen fehlgeschlagen, Wiederholung in %d Sekunden: %s", - "SWITCH_TO_WIFI_NETWORK":"Zu Wi-Fi wechseln...", - "SWITCH_TO_4G_NETWORK":"Zu 4G wechseln...", - - "STANDBY":"Bereitschaft", - "CONNECT_TO":"Verbinden zu ", - "CONNECTING":"Verbindung wird hergestellt...", - "CONNECTED_TO":"Verbunden mit ", - - "LISTENING":"Zuhören...", - "SPEAKING":"Sprechen...", - - "SERVER_NOT_FOUND":"Verfügbaren Service suchen", - "SERVER_NOT_CONNECTED":"Service-Verbindung fehlgeschlagen, bitte später versuchen", - "SERVER_TIMEOUT":"Antwort-Timeout", - "SERVER_ERROR":"Senden fehlgeschlagen, bitte Netzwerk prüfen", - - "CONNECT_TO_HOTSPOT":"Handy mit Hotspot verbinden ", - "ACCESS_VIA_BROWSER":",Browser öffnen ", - "WIFI_CONFIG_MODE":"Netzwerkkonfigurationsmodus", - "ENTERING_WIFI_CONFIG_MODE":"Netzwerkkonfigurationsmodus eingeben...", - "SCANNING_WIFI":"Wi-Fi scannen...", - + "LOADING_PROTOCOL": "Verbindung zum Server...", + "INITIALIZING": "Initialisierung...", + "PIN_ERROR": "Bitte SIM-Karte einlegen", + "REG_ERROR": "Netzwerkverbindung fehlgeschlagen, bitte Datenkartenstatus prüfen", + "DETECTING_MODULE": "Modul erkennen...", + "REGISTERING_NETWORK": "Auf Netzwerk warten...", + "CHECKING_NEW_VERSION": "Neue Version prüfen...", + "CHECK_NEW_VERSION_FAILED": "Neue Version prüfen fehlgeschlagen, Wiederholung in %d Sekunden: %s", + "SWITCH_TO_WIFI_NETWORK": "Zu Wi-Fi wechseln...", + "SWITCH_TO_4G_NETWORK": "Zu 4G wechseln...", + "STANDBY": "Bereitschaft", + "CONNECT_TO": "Verbinden zu ", + "CONNECTING": "Verbindung wird hergestellt...", + "CONNECTED_TO": "Verbunden mit ", + "LISTENING": "Zuhören...", + "SPEAKING": "Sprechen...", + "SERVER_NOT_FOUND": "Verfügbaren Service suchen", + "SERVER_NOT_CONNECTED": "Service-Verbindung fehlgeschlagen, bitte später versuchen", + "SERVER_TIMEOUT": "Antwort-Timeout", + "SERVER_ERROR": "Senden fehlgeschlagen, bitte Netzwerk prüfen", + "CONNECT_TO_HOTSPOT": "Handy mit Hotspot verbinden ", + "ACCESS_VIA_BROWSER": ",Browser öffnen ", + "WIFI_CONFIG_MODE": "Netzwerkkonfigurationsmodus", + "ENTERING_WIFI_CONFIG_MODE": "Netzwerkkonfigurationsmodus eingeben...", + "SCANNING_WIFI": "Wi-Fi scannen...", "NEW_VERSION": "Neue Version ", - "OTA_UPGRADE":"OTA-Upgrade", - "UPGRADING":"System wird aktualisiert...", - "UPGRADE_FAILED":"Upgrade fehlgeschlagen", - "ACTIVATION":"Gerät aktivieren", - - "BATTERY_LOW":"Niedriger Batteriestand", - "BATTERY_CHARGING":"Wird geladen", - "BATTERY_FULL":"Batterie voll", - "BATTERY_NEED_CHARGE":"Niedriger Batteriestand, bitte aufladen", - - "VOLUME":"Lautstärke ", - "MUTED":"Stummgeschaltet", - "MAX_VOLUME":"Maximale Lautstärke", - - "RTC_MODE_OFF":"AEC aus", - "RTC_MODE_ON":"AEC ein" + "OTA_UPGRADE": "OTA-Upgrade", + "UPGRADING": "System wird aktualisiert...", + "UPGRADE_FAILED": "Upgrade fehlgeschlagen", + "ACTIVATION": "Gerät aktivieren", + "BATTERY_LOW": "Niedriger Batteriestand", + "BATTERY_CHARGING": "Wird geladen", + "BATTERY_FULL": "Batterie voll", + "BATTERY_NEED_CHARGE": "Niedriger Batteriestand, bitte aufladen", + "VOLUME": "Lautstärke ", + "MUTED": "Stummgeschaltet", + "MAX_VOLUME": "Maximale Lautstärke", + "RTC_MODE_OFF": "AEC aus", + "RTC_MODE_ON": "AEC ein", + "DOWNLOAD_ASSETS_FAILED": "Fehler beim Herunterladen der Ressourcen", + "LOADING_ASSETS": "Ressourcen werden geladen...", + "PLEASE_WAIT": "Bitte warten...", + "FOUND_NEW_ASSETS": "Neue Ressourcen gefunden: %s", + "HELLO_MY_FRIEND": "Hallo, mein Freund!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/en-US/language.json b/main/assets/locales/en-US/language.json index 54ffb0a0..1758d34c 100644 --- a/main/assets/locales/en-US/language.json +++ b/main/assets/locales/en-US/language.json @@ -17,43 +17,40 @@ "CHECK_NEW_VERSION_FAILED": "Check for new version failed, will retry in %d seconds: %s", "SWITCH_TO_WIFI_NETWORK": "Switching to Wi-Fi...", "SWITCH_TO_4G_NETWORK": "Switching to 4G...", - "STANDBY": "Standby", "CONNECT_TO": "Connect to ", "CONNECTING": "Connecting...", "CONNECTION_SUCCESSFUL": "Connection Successful", "CONNECTED_TO": "Connected to ", - "LISTENING": "Listening...", "SPEAKING": "Speaking...", - "SERVER_NOT_FOUND": "Looking for available service", "SERVER_NOT_CONNECTED": "Unable to connect to service, please try again later", "SERVER_TIMEOUT": "Waiting for response timeout", "SERVER_ERROR": "Sending failed, please check the network", - "CONNECT_TO_HOTSPOT": "Hotspot: ", "ACCESS_VIA_BROWSER": " Config URL: ", "WIFI_CONFIG_MODE": "Wi-Fi Configuration Mode", "ENTERING_WIFI_CONFIG_MODE": "Entering Wi-Fi configuration mode...", "SCANNING_WIFI": "Scanning Wi-Fi...", - "NEW_VERSION": "New version ", "OTA_UPGRADE": "OTA Upgrade", "UPGRADING": "System is upgrading...", "UPGRADE_FAILED": "Upgrade failed", "ACTIVATION": "Activation", - "BATTERY_LOW": "Low battery", "BATTERY_CHARGING": "Charging", "BATTERY_FULL": "Battery full", "BATTERY_NEED_CHARGE": "Low battery, please charge", - "VOLUME": "Volume ", "MUTED": "Muted", "MAX_VOLUME": "Max volume", - "RTC_MODE_OFF": "AEC Off", - "RTC_MODE_ON": "AEC On" + "RTC_MODE_ON": "AEC On", + "PLEASE_WAIT": "Please wait...", + "FOUND_NEW_ASSETS": "Found new assets: %s", + "DOWNLOAD_ASSETS_FAILED": "Failed to download assets", + "LOADING_ASSETS": "Loading assets...", + "HELLO_MY_FRIEND": "Hello, my friend!" } } \ No newline at end of file diff --git a/main/assets/locales/es-ES/language.json b/main/assets/locales/es-ES/language.json index 63205ae2..e7f349ba 100644 --- a/main/assets/locales/es-ES/language.json +++ b/main/assets/locales/es-ES/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"es-ES" + "type": "es-ES" }, "strings": { - "WARNING":"Advertencia", - "INFO":"Información", - "ERROR":"Error", + "WARNING": "Advertencia", + "INFO": "Información", + "ERROR": "Error", "VERSION": "Versión ", - "LOADING_PROTOCOL":"Conectando al servidor...", - "INITIALIZING":"Inicializando...", - "PIN_ERROR":"Por favor inserte la tarjeta SIM", - "REG_ERROR":"No se puede acceder a la red, verifique el estado de la tarjeta de datos", - "DETECTING_MODULE":"Detectando módulo...", - "REGISTERING_NETWORK":"Esperando red...", - "CHECKING_NEW_VERSION":"Verificando nueva versión...", - "CHECK_NEW_VERSION_FAILED":"Error al verificar nueva versión, reintentando en %d segundos: %s", - "SWITCH_TO_WIFI_NETWORK":"Cambiando a Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"Cambiando a 4G...", - - "STANDBY":"En espera", - "CONNECT_TO":"Conectar a ", - "CONNECTING":"Conectando...", - "CONNECTED_TO":"Conectado a ", - - "LISTENING":"Escuchando...", - "SPEAKING":"Hablando...", - - "SERVER_NOT_FOUND":"Buscando servicio disponible", - "SERVER_NOT_CONNECTED":"No se puede conectar al servicio, inténtelo más tarde", - "SERVER_TIMEOUT":"Tiempo de espera agotado", - "SERVER_ERROR":"Error de envío, verifique la red", - - "CONNECT_TO_HOTSPOT":"Conectar teléfono al punto de acceso ", - "ACCESS_VIA_BROWSER":",acceder mediante navegador ", - "WIFI_CONFIG_MODE":"Modo configuración de red", - "ENTERING_WIFI_CONFIG_MODE":"Entrando en modo configuración de red...", - "SCANNING_WIFI":"Escaneando Wi-Fi...", - + "LOADING_PROTOCOL": "Conectando al servidor...", + "INITIALIZING": "Inicializando...", + "PIN_ERROR": "Por favor inserte la tarjeta SIM", + "REG_ERROR": "No se puede acceder a la red, verifique el estado de la tarjeta de datos", + "DETECTING_MODULE": "Detectando módulo...", + "REGISTERING_NETWORK": "Esperando red...", + "CHECKING_NEW_VERSION": "Verificando nueva versión...", + "CHECK_NEW_VERSION_FAILED": "Error al verificar nueva versión, reintentando en %d segundos: %s", + "SWITCH_TO_WIFI_NETWORK": "Cambiando a Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "Cambiando a 4G...", + "STANDBY": "En espera", + "CONNECT_TO": "Conectar a ", + "CONNECTING": "Conectando...", + "CONNECTED_TO": "Conectado a ", + "LISTENING": "Escuchando...", + "SPEAKING": "Hablando...", + "SERVER_NOT_FOUND": "Buscando servicio disponible", + "SERVER_NOT_CONNECTED": "No se puede conectar al servicio, inténtelo más tarde", + "SERVER_TIMEOUT": "Tiempo de espera agotado", + "SERVER_ERROR": "Error de envío, verifique la red", + "CONNECT_TO_HOTSPOT": "Conectar teléfono al punto de acceso ", + "ACCESS_VIA_BROWSER": ",acceder mediante navegador ", + "WIFI_CONFIG_MODE": "Modo configuración de red", + "ENTERING_WIFI_CONFIG_MODE": "Entrando en modo configuración de red...", + "SCANNING_WIFI": "Escaneando Wi-Fi...", "NEW_VERSION": "Nueva versión ", - "OTA_UPGRADE":"Actualización OTA", - "UPGRADING":"Actualizando sistema...", - "UPGRADE_FAILED":"Actualización fallida", - "ACTIVATION":"Activación del dispositivo", - - "BATTERY_LOW":"Batería baja", - "BATTERY_CHARGING":"Cargando", - "BATTERY_FULL":"Batería llena", - "BATTERY_NEED_CHARGE":"Batería baja, por favor cargar", - - "VOLUME":"Volumen ", - "MUTED":"Silenciado", - "MAX_VOLUME":"Volumen máximo", - - "RTC_MODE_OFF":"AEC desactivado", - "RTC_MODE_ON":"AEC activado" + "OTA_UPGRADE": "Actualización OTA", + "UPGRADING": "Actualizando sistema...", + "UPGRADE_FAILED": "Actualización fallida", + "ACTIVATION": "Activación del dispositivo", + "BATTERY_LOW": "Batería baja", + "BATTERY_CHARGING": "Cargando", + "BATTERY_FULL": "Batería llena", + "BATTERY_NEED_CHARGE": "Batería baja, por favor cargar", + "VOLUME": "Volumen ", + "MUTED": "Silenciado", + "MAX_VOLUME": "Volumen máximo", + "RTC_MODE_OFF": "AEC desactivado", + "RTC_MODE_ON": "AEC activado", + "DOWNLOAD_ASSETS_FAILED": "Error al descargar recursos", + "LOADING_ASSETS": "Cargando recursos...", + "PLEASE_WAIT": "Por favor espere...", + "FOUND_NEW_ASSETS": "Encontrados nuevos recursos: %s", + "HELLO_MY_FRIEND": "¡Hola, mi amigo!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/fi-FI/language.json b/main/assets/locales/fi-FI/language.json index c30219e9..2326ee4c 100644 --- a/main/assets/locales/fi-FI/language.json +++ b/main/assets/locales/fi-FI/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"fi-FI" + "type": "fi-FI" }, "strings": { - "WARNING":"Varoitus", - "INFO":"Tieto", - "ERROR":"Virhe", + "WARNING": "Varoitus", + "INFO": "Tieto", + "ERROR": "Virhe", "VERSION": "Versio ", - "LOADING_PROTOCOL":"Yhdistetään palvelimeen...", - "INITIALIZING":"Alustetaan...", - "PIN_ERROR":"Ole hyvä ja aseta SIM-kortti", - "REG_ERROR":"Ei voi muodostaa yhteyttä verkkoon, tarkista datakortin tila", - "DETECTING_MODULE":"Tunnistetaan moduuli...", - "REGISTERING_NETWORK":"Odotetaan verkkoa...", - "CHECKING_NEW_VERSION":"Tarkistetaan uutta versiota...", - "CHECK_NEW_VERSION_FAILED":"Uuden version tarkistus epäonnistui, yritetään uudelleen %d sekunnin kuluttua: %s", - "SWITCH_TO_WIFI_NETWORK":"Vaihdetaan Wi-Fi:hin...", - "SWITCH_TO_4G_NETWORK":"Vaihdetaan 4G:hen...", - - "STANDBY":"Valmiustila", - "CONNECT_TO":"Yhdistä ", - "CONNECTING":"Yhdistetään...", - "CONNECTED_TO":"Yhdistetty ", - - "LISTENING":"Kuunnellaan...", - "SPEAKING":"Puhutaan...", - - "SERVER_NOT_FOUND":"Etsitään käytettävissä olevaa palvelua", - "SERVER_NOT_CONNECTED":"Ei voi yhdistää palveluun, yritä myöhemmin", - "SERVER_TIMEOUT":"Vastauksen aikakatkaisu", - "SERVER_ERROR":"Lähetys epäonnistui, tarkista verkko", - - "CONNECT_TO_HOTSPOT":"Yhdistä puhelin hotspottiin ", - "ACCESS_VIA_BROWSER":",pääsy selaimen kautta ", - "WIFI_CONFIG_MODE":"Verkon konfigurointitila", - "ENTERING_WIFI_CONFIG_MODE":"Siirrytään verkon konfigurointitilaan...", - "SCANNING_WIFI":"Skannataan Wi-Fi...", - + "LOADING_PROTOCOL": "Yhdistetään palvelimeen...", + "INITIALIZING": "Alustetaan...", + "PIN_ERROR": "Ole hyvä ja aseta SIM-kortti", + "REG_ERROR": "Ei voi muodostaa yhteyttä verkkoon, tarkista datakortin tila", + "DETECTING_MODULE": "Tunnistetaan moduuli...", + "REGISTERING_NETWORK": "Odotetaan verkkoa...", + "CHECKING_NEW_VERSION": "Tarkistetaan uutta versiota...", + "CHECK_NEW_VERSION_FAILED": "Uuden version tarkistus epäonnistui, yritetään uudelleen %d sekunnin kuluttua: %s", + "SWITCH_TO_WIFI_NETWORK": "Vaihdetaan Wi-Fi:hin...", + "SWITCH_TO_4G_NETWORK": "Vaihdetaan 4G:hen...", + "STANDBY": "Valmiustila", + "CONNECT_TO": "Yhdistä ", + "CONNECTING": "Yhdistetään...", + "CONNECTED_TO": "Yhdistetty ", + "LISTENING": "Kuunnellaan...", + "SPEAKING": "Puhutaan...", + "SERVER_NOT_FOUND": "Etsitään käytettävissä olevaa palvelua", + "SERVER_NOT_CONNECTED": "Ei voi yhdistää palveluun, yritä myöhemmin", + "SERVER_TIMEOUT": "Vastauksen aikakatkaisu", + "SERVER_ERROR": "Lähetys epäonnistui, tarkista verkko", + "CONNECT_TO_HOTSPOT": "Yhdistä puhelin hotspottiin ", + "ACCESS_VIA_BROWSER": ",pääsy selaimen kautta ", + "WIFI_CONFIG_MODE": "Verkon konfigurointitila", + "ENTERING_WIFI_CONFIG_MODE": "Siirrytään verkon konfigurointitilaan...", + "SCANNING_WIFI": "Skannataan Wi-Fi...", "NEW_VERSION": "Uusi versio ", - "OTA_UPGRADE":"OTA-päivitys", - "UPGRADING":"Päivitetään järjestelmää...", - "UPGRADE_FAILED":"Päivitys epäonnistui", - "ACTIVATION":"Laitteen aktivointi", - - "BATTERY_LOW":"Akku vähissä", - "BATTERY_CHARGING":"Ladataan", - "BATTERY_FULL":"Akku täynnä", - "BATTERY_NEED_CHARGE":"Akku vähissä, ole hyvä ja lataa", - - "VOLUME":"Äänenvoimakkuus ", - "MUTED":"Mykistetty", - "MAX_VOLUME":"Maksimi äänenvoimakkuus", - - "RTC_MODE_OFF":"AEC pois päältä", - "RTC_MODE_ON":"AEC päällä" + "OTA_UPGRADE": "OTA-päivitys", + "UPGRADING": "Päivitetään järjestelmää...", + "UPGRADE_FAILED": "Päivitys epäonnistui", + "ACTIVATION": "Laitteen aktivointi", + "BATTERY_LOW": "Akku vähissä", + "BATTERY_CHARGING": "Ladataan", + "BATTERY_FULL": "Akku täynnä", + "BATTERY_NEED_CHARGE": "Akku vähissä, ole hyvä ja lataa", + "VOLUME": "Äänenvoimakkuus ", + "MUTED": "Mykistetty", + "MAX_VOLUME": "Maksimi äänenvoimakkuus", + "RTC_MODE_OFF": "AEC pois päältä", + "RTC_MODE_ON": "AEC päällä", + "DOWNLOAD_ASSETS_FAILED": "Resurssien lataaminen epäonnistui", + "LOADING_ASSETS": "Ladataan resursseja...", + "PLEASE_WAIT": "Odota hetki...", + "FOUND_NEW_ASSETS": "Löydetty uusia resursseja: %s", + "HELLO_MY_FRIEND": "Hei, ystäväni!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/fr-FR/language.json b/main/assets/locales/fr-FR/language.json index 149a8aab..244cade0 100644 --- a/main/assets/locales/fr-FR/language.json +++ b/main/assets/locales/fr-FR/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"fr-FR" + "type": "fr-FR" }, "strings": { - "WARNING":"Avertissement", - "INFO":"Information", - "ERROR":"Erreur", + "WARNING": "Avertissement", + "INFO": "Information", + "ERROR": "Erreur", "VERSION": "Version ", - "LOADING_PROTOCOL":"Connexion au serveur...", - "INITIALIZING":"Initialisation...", - "PIN_ERROR":"Veuillez insérer la carte SIM", - "REG_ERROR":"Impossible d'accéder au réseau, veuillez vérifier l'état de la carte de données", - "DETECTING_MODULE":"Détection du module...", - "REGISTERING_NETWORK":"En attente du réseau...", - "CHECKING_NEW_VERSION":"Vérification de nouvelle version...", - "CHECK_NEW_VERSION_FAILED":"Échec de vérification de nouvelle version, nouvelle tentative dans %d secondes : %s", - "SWITCH_TO_WIFI_NETWORK":"Basculer vers Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"Basculer vers 4G...", - - "STANDBY":"En attente", - "CONNECT_TO":"Se connecter à ", - "CONNECTING":"Connexion en cours...", - "CONNECTED_TO":"Connecté à ", - - "LISTENING":"Écoute...", - "SPEAKING":"Parole...", - - "SERVER_NOT_FOUND":"Recherche d'un service disponible", - "SERVER_NOT_CONNECTED":"Impossible de se connecter au service, veuillez réessayer plus tard", - "SERVER_TIMEOUT":"Délai d'attente de réponse", - "SERVER_ERROR":"Échec d'envoi, veuillez vérifier le réseau", - - "CONNECT_TO_HOTSPOT":"Connecter le téléphone au point d'accès ", - "ACCESS_VIA_BROWSER":",accéder via le navigateur ", - "WIFI_CONFIG_MODE":"Mode configuration réseau", - "ENTERING_WIFI_CONFIG_MODE":"Entrer en mode configuration réseau...", - "SCANNING_WIFI":"Scan Wi-Fi...", - + "LOADING_PROTOCOL": "Connexion au serveur...", + "INITIALIZING": "Initialisation...", + "PIN_ERROR": "Veuillez insérer la carte SIM", + "REG_ERROR": "Impossible d'accéder au réseau, veuillez vérifier l'état de la carte de données", + "DETECTING_MODULE": "Détection du module...", + "REGISTERING_NETWORK": "En attente du réseau...", + "CHECKING_NEW_VERSION": "Vérification de nouvelle version...", + "CHECK_NEW_VERSION_FAILED": "Échec de vérification de nouvelle version, nouvelle tentative dans %d secondes : %s", + "SWITCH_TO_WIFI_NETWORK": "Basculer vers Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "Basculer vers 4G...", + "STANDBY": "En attente", + "CONNECT_TO": "Se connecter à ", + "CONNECTING": "Connexion en cours...", + "CONNECTED_TO": "Connecté à ", + "LISTENING": "Écoute...", + "SPEAKING": "Parole...", + "SERVER_NOT_FOUND": "Recherche d'un service disponible", + "SERVER_NOT_CONNECTED": "Impossible de se connecter au service, veuillez réessayer plus tard", + "SERVER_TIMEOUT": "Délai d'attente de réponse", + "SERVER_ERROR": "Échec d'envoi, veuillez vérifier le réseau", + "CONNECT_TO_HOTSPOT": "Connecter le téléphone au point d'accès ", + "ACCESS_VIA_BROWSER": ",accéder via le navigateur ", + "WIFI_CONFIG_MODE": "Mode configuration réseau", + "ENTERING_WIFI_CONFIG_MODE": "Entrer en mode configuration réseau...", + "SCANNING_WIFI": "Scan Wi-Fi...", "NEW_VERSION": "Nouvelle version ", - "OTA_UPGRADE":"Mise à jour OTA", - "UPGRADING":"Mise à jour du système...", - "UPGRADE_FAILED":"Échec de mise à jour", - "ACTIVATION":"Activation de l'appareil", - - "BATTERY_LOW":"Batterie faible", - "BATTERY_CHARGING":"En charge", - "BATTERY_FULL":"Batterie pleine", - "BATTERY_NEED_CHARGE":"Batterie faible, veuillez charger", - - "VOLUME":"Volume ", - "MUTED":"Muet", - "MAX_VOLUME":"Volume maximum", - - "RTC_MODE_OFF":"AEC désactivé", - "RTC_MODE_ON":"AEC activé" + "OTA_UPGRADE": "Mise à jour OTA", + "UPGRADING": "Mise à jour du système...", + "UPGRADE_FAILED": "Échec de mise à jour", + "ACTIVATION": "Activation de l'appareil", + "BATTERY_LOW": "Batterie faible", + "BATTERY_CHARGING": "En charge", + "BATTERY_FULL": "Batterie pleine", + "BATTERY_NEED_CHARGE": "Batterie faible, veuillez charger", + "VOLUME": "Volume ", + "MUTED": "Muet", + "MAX_VOLUME": "Volume maximum", + "RTC_MODE_OFF": "AEC désactivé", + "RTC_MODE_ON": "AEC activé", + "DOWNLOAD_ASSETS_FAILED": "Échec du téléchargement des ressources", + "LOADING_ASSETS": "Chargement des ressources...", + "PLEASE_WAIT": "Veuillez patienter...", + "FOUND_NEW_ASSETS": "Nouvelles ressources trouvées: %s", + "HELLO_MY_FRIEND": "Bonjour, mon ami !" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/hi-IN/language.json b/main/assets/locales/hi-IN/language.json index b1e09cfb..732176e4 100644 --- a/main/assets/locales/hi-IN/language.json +++ b/main/assets/locales/hi-IN/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"hi-IN" + "type": "hi-IN" }, "strings": { - "WARNING":"चेतावनी", - "INFO":"जानकारी", - "ERROR":"त्रुटि", + "WARNING": "चेतावनी", + "INFO": "जानकारी", + "ERROR": "त्रुटि", "VERSION": "संस्करण ", - "LOADING_PROTOCOL":"सर्वर से कनेक्ट हो रहे हैं...", - "INITIALIZING":"आरंभीकरण...", - "PIN_ERROR":"कृपया सिम कार्ड डालें", - "REG_ERROR":"नेटवर्क तक पहुंच नहीं हो सकती, कृपया डेटा कार्ड स्थिति जांचें", - "DETECTING_MODULE":"मॉड्यूल का पता लगाया जा रहा है...", - "REGISTERING_NETWORK":"नेटवर्क की प्रतीक्षा...", - "CHECKING_NEW_VERSION":"नया संस्करण जाँच रहे हैं...", - "CHECK_NEW_VERSION_FAILED":"नया संस्करण जाँचना असफल, %d सेकंड में पुनः प्रयास: %s", - "SWITCH_TO_WIFI_NETWORK":"Wi-Fi पर स्विच कर रहे हैं...", - "SWITCH_TO_4G_NETWORK":"4G पर स्विच कर रहे हैं...", - - "STANDBY":"स्टैंडबाय", - "CONNECT_TO":"कनेक्ट करें ", - "CONNECTING":"कनेक्ट हो रहे हैं...", - "CONNECTED_TO":"कनेक्ट हो गए ", - - "LISTENING":"सुन रहे हैं...", - "SPEAKING":"बोल रहे हैं...", - - "SERVER_NOT_FOUND":"उपलब्ध सेवा खोज रहे हैं", - "SERVER_NOT_CONNECTED":"सेवा से कनेक्ट नहीं हो सकते, कृपया बाद में कोशिश करें", - "SERVER_TIMEOUT":"प्रतिक्रिया का समय समाप्त", - "SERVER_ERROR":"भेजना असफल, कृपया नेटवर्क जांचें", - - "CONNECT_TO_HOTSPOT":"फोन को हॉटस्पॉट से कनेक्ट करें ", - "ACCESS_VIA_BROWSER":",ब्राउज़र के माध्यम से पहुंचें ", - "WIFI_CONFIG_MODE":"नेटवर्क कॉन्फ़िगरेशन मोड", - "ENTERING_WIFI_CONFIG_MODE":"नेटवर्क कॉन्फ़िगरेशन मोड में प्रवेश...", - "SCANNING_WIFI":"Wi-Fi स्कैन कर रहे हैं...", - + "LOADING_PROTOCOL": "सर्वर से कनेक्ट हो रहे हैं...", + "INITIALIZING": "आरंभीकरण...", + "PIN_ERROR": "कृपया सिम कार्ड डालें", + "REG_ERROR": "नेटवर्क तक पहुंच नहीं हो सकती, कृपया डेटा कार्ड स्थिति जांचें", + "DETECTING_MODULE": "मॉड्यूल का पता लगाया जा रहा है...", + "REGISTERING_NETWORK": "नेटवर्क की प्रतीक्षा...", + "CHECKING_NEW_VERSION": "नया संस्करण जाँच रहे हैं...", + "CHECK_NEW_VERSION_FAILED": "नया संस्करण जाँचना असफल, %d सेकंड में पुनः प्रयास: %s", + "SWITCH_TO_WIFI_NETWORK": "Wi-Fi पर स्विच कर रहे हैं...", + "SWITCH_TO_4G_NETWORK": "4G पर स्विच कर रहे हैं...", + "STANDBY": "स्टैंडबाय", + "CONNECT_TO": "कनेक्ट करें ", + "CONNECTING": "कनेक्ट हो रहे हैं...", + "CONNECTED_TO": "कनेक्ट हो गए ", + "LISTENING": "सुन रहे हैं...", + "SPEAKING": "बोल रहे हैं...", + "SERVER_NOT_FOUND": "उपलब्ध सेवा खोज रहे हैं", + "SERVER_NOT_CONNECTED": "सेवा से कनेक्ट नहीं हो सकते, कृपया बाद में कोशिश करें", + "SERVER_TIMEOUT": "प्रतिक्रिया का समय समाप्त", + "SERVER_ERROR": "भेजना असफल, कृपया नेटवर्क जांचें", + "CONNECT_TO_HOTSPOT": "फोन को हॉटस्पॉट से कनेक्ट करें ", + "ACCESS_VIA_BROWSER": ",ब्राउज़र के माध्यम से पहुंचें ", + "WIFI_CONFIG_MODE": "नेटवर्क कॉन्फ़िगरेशन मोड", + "ENTERING_WIFI_CONFIG_MODE": "नेटवर्क कॉन्फ़िगरेशन मोड में प्रवेश...", + "SCANNING_WIFI": "Wi-Fi स्कैन कर रहे हैं...", "NEW_VERSION": "नया संस्करण ", - "OTA_UPGRADE":"OTA अपग्रेड", - "UPGRADING":"सिस्टम अपग्रेड हो रहा है...", - "UPGRADE_FAILED":"अपग्रेड असफल", - "ACTIVATION":"डिवाइस सक्रियण", - - "BATTERY_LOW":"बैटरी कम", - "BATTERY_CHARGING":"चार्ज हो रही है", - "BATTERY_FULL":"बैटरी फुल", - "BATTERY_NEED_CHARGE":"बैटरी कम है, कृपया चार्ज करें", - - "VOLUME":"आवाज़ ", - "MUTED":"म्यूट", - "MAX_VOLUME":"अधिकतम आवाज़", - - "RTC_MODE_OFF":"AEC बंद", - "RTC_MODE_ON":"AEC चालू" + "OTA_UPGRADE": "OTA अपग्रेड", + "UPGRADING": "सिस्टम अपग्रेड हो रहा है...", + "UPGRADE_FAILED": "अपग्रेड असफल", + "ACTIVATION": "डिवाइस सक्रियण", + "BATTERY_LOW": "बैटरी कम", + "BATTERY_CHARGING": "चार्ज हो रही है", + "BATTERY_FULL": "बैटरी फुल", + "BATTERY_NEED_CHARGE": "बैटरी कम है, कृपया चार्ज करें", + "VOLUME": "आवाज़ ", + "MUTED": "म्यूट", + "MAX_VOLUME": "अधिकतम आवाज़", + "RTC_MODE_OFF": "AEC बंद", + "RTC_MODE_ON": "AEC चालू", + "DOWNLOAD_ASSETS_FAILED": "संसाधन डाउनलोड करने में विफल", + "LOADING_ASSETS": "संसाधन लोड हो रहे हैं...", + "PLEASE_WAIT": "कृपया प्रतीक्षा करें...", + "FOUND_NEW_ASSETS": "नए संसाधन मिले: %s", + "HELLO_MY_FRIEND": "नमस्ते, मेरे दोस्त!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/id-ID/language.json b/main/assets/locales/id-ID/language.json index 860c7dd4..11224a66 100644 --- a/main/assets/locales/id-ID/language.json +++ b/main/assets/locales/id-ID/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"id-ID" + "type": "id-ID" }, "strings": { - "WARNING":"Peringatan", - "INFO":"Informasi", - "ERROR":"Kesalahan", + "WARNING": "Peringatan", + "INFO": "Informasi", + "ERROR": "Kesalahan", "VERSION": "Versi ", - "LOADING_PROTOCOL":"Menghubungkan ke server...", - "INITIALIZING":"Menginisialisasi...", - "PIN_ERROR":"Silakan masukkan kartu SIM", - "REG_ERROR":"Tidak dapat mengakses jaringan, periksa status kartu data", - "DETECTING_MODULE":"Mendeteksi modul...", - "REGISTERING_NETWORK":"Menunggu jaringan...", - "CHECKING_NEW_VERSION":"Memeriksa versi baru...", - "CHECK_NEW_VERSION_FAILED":"Pemeriksaan versi baru gagal, mencoba lagi dalam %d detik: %s", - "SWITCH_TO_WIFI_NETWORK":"Beralih ke Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"Beralih ke 4G...", - - "STANDBY":"Siaga", - "CONNECT_TO":"Hubungkan ke ", - "CONNECTING":"Menghubungkan...", - "CONNECTED_TO":"Terhubung ke ", - - "LISTENING":"Mendengarkan...", - "SPEAKING":"Berbicara...", - - "SERVER_NOT_FOUND":"Mencari layanan yang tersedia", - "SERVER_NOT_CONNECTED":"Tidak dapat terhubung ke layanan, coba lagi nanti", - "SERVER_TIMEOUT":"Waktu respons habis", - "SERVER_ERROR":"Pengiriman gagal, periksa jaringan", - - "CONNECT_TO_HOTSPOT":"Hubungkan ponsel ke hotspot ", - "ACCESS_VIA_BROWSER":",akses melalui browser ", - "WIFI_CONFIG_MODE":"Mode konfigurasi jaringan", - "ENTERING_WIFI_CONFIG_MODE":"Memasuki mode konfigurasi jaringan...", - "SCANNING_WIFI":"Memindai Wi-Fi...", - + "LOADING_PROTOCOL": "Menghubungkan ke server...", + "INITIALIZING": "Menginisialisasi...", + "PIN_ERROR": "Silakan masukkan kartu SIM", + "REG_ERROR": "Tidak dapat mengakses jaringan, periksa status kartu data", + "DETECTING_MODULE": "Mendeteksi modul...", + "REGISTERING_NETWORK": "Menunggu jaringan...", + "CHECKING_NEW_VERSION": "Memeriksa versi baru...", + "CHECK_NEW_VERSION_FAILED": "Pemeriksaan versi baru gagal, mencoba lagi dalam %d detik: %s", + "SWITCH_TO_WIFI_NETWORK": "Beralih ke Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "Beralih ke 4G...", + "STANDBY": "Siaga", + "CONNECT_TO": "Hubungkan ke ", + "CONNECTING": "Menghubungkan...", + "CONNECTED_TO": "Terhubung ke ", + "LISTENING": "Mendengarkan...", + "SPEAKING": "Berbicara...", + "SERVER_NOT_FOUND": "Mencari layanan yang tersedia", + "SERVER_NOT_CONNECTED": "Tidak dapat terhubung ke layanan, coba lagi nanti", + "SERVER_TIMEOUT": "Waktu respons habis", + "SERVER_ERROR": "Pengiriman gagal, periksa jaringan", + "CONNECT_TO_HOTSPOT": "Hubungkan ponsel ke hotspot ", + "ACCESS_VIA_BROWSER": ",akses melalui browser ", + "WIFI_CONFIG_MODE": "Mode konfigurasi jaringan", + "ENTERING_WIFI_CONFIG_MODE": "Memasuki mode konfigurasi jaringan...", + "SCANNING_WIFI": "Memindai Wi-Fi...", "NEW_VERSION": "Versi baru ", - "OTA_UPGRADE":"Pembaruan OTA", - "UPGRADING":"Memperbarui sistem...", - "UPGRADE_FAILED":"Pembaruan gagal", - "ACTIVATION":"Aktivasi perangkat", - - "BATTERY_LOW":"Baterai lemah", - "BATTERY_CHARGING":"Mengisi", - "BATTERY_FULL":"Baterai penuh", - "BATTERY_NEED_CHARGE":"Baterai lemah, silakan isi", - - "VOLUME":"Volume ", - "MUTED":"Bisu", - "MAX_VOLUME":"Volume maksimum", - - "RTC_MODE_OFF":"AEC mati", - "RTC_MODE_ON":"AEC nyala" + "OTA_UPGRADE": "Pembaruan OTA", + "UPGRADING": "Memperbarui sistem...", + "UPGRADE_FAILED": "Pembaruan gagal", + "ACTIVATION": "Aktivasi perangkat", + "BATTERY_LOW": "Baterai lemah", + "BATTERY_CHARGING": "Mengisi", + "BATTERY_FULL": "Baterai penuh", + "BATTERY_NEED_CHARGE": "Baterai lemah, silakan isi", + "VOLUME": "Volume ", + "MUTED": "Bisu", + "MAX_VOLUME": "Volume maksimum", + "RTC_MODE_OFF": "AEC mati", + "RTC_MODE_ON": "AEC nyala", + "DOWNLOAD_ASSETS_FAILED": "Gagal mengunduh aset", + "LOADING_ASSETS": "Memuat aset...", + "PLEASE_WAIT": "Mohon tunggu...", + "FOUND_NEW_ASSETS": "Ditemukan aset baru: %s", + "HELLO_MY_FRIEND": "Halo, teman saya!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/it-IT/language.json b/main/assets/locales/it-IT/language.json index be1702d5..54cc9bcc 100644 --- a/main/assets/locales/it-IT/language.json +++ b/main/assets/locales/it-IT/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"it-IT" + "type": "it-IT" }, "strings": { - "WARNING":"Avviso", - "INFO":"Informazione", - "ERROR":"Errore", + "WARNING": "Avviso", + "INFO": "Informazione", + "ERROR": "Errore", "VERSION": "Versione ", - "LOADING_PROTOCOL":"Connessione al server...", - "INITIALIZING":"Inizializzazione...", - "PIN_ERROR":"Inserire la scheda SIM", - "REG_ERROR":"Impossibile accedere alla rete, controllare lo stato della scheda dati", - "DETECTING_MODULE":"Rilevamento modulo...", - "REGISTERING_NETWORK":"In attesa della rete...", - "CHECKING_NEW_VERSION":"Controllo nuova versione...", - "CHECK_NEW_VERSION_FAILED":"Controllo nuova versione fallito, riprovo tra %d secondi: %s", - "SWITCH_TO_WIFI_NETWORK":"Passaggio a Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"Passaggio a 4G...", - - "STANDBY":"In attesa", - "CONNECT_TO":"Connetti a ", - "CONNECTING":"Connessione...", - "CONNECTED_TO":"Connesso a ", - - "LISTENING":"In ascolto...", - "SPEAKING":"Parlando...", - - "SERVER_NOT_FOUND":"Ricerca servizio disponibile", - "SERVER_NOT_CONNECTED":"Impossibile connettersi al servizio, riprovare più tardi", - "SERVER_TIMEOUT":"Timeout risposta", - "SERVER_ERROR":"Invio fallito, controllare la rete", - - "CONNECT_TO_HOTSPOT":"Connetti telefono al hotspot ", - "ACCESS_VIA_BROWSER":",accedi tramite browser ", - "WIFI_CONFIG_MODE":"Modalità configurazione rete", - "ENTERING_WIFI_CONFIG_MODE":"Entrata in modalità configurazione rete...", - "SCANNING_WIFI":"Scansione Wi-Fi...", - + "LOADING_PROTOCOL": "Connessione al server...", + "INITIALIZING": "Inizializzazione...", + "PIN_ERROR": "Inserire la scheda SIM", + "REG_ERROR": "Impossibile accedere alla rete, controllare lo stato della scheda dati", + "DETECTING_MODULE": "Rilevamento modulo...", + "REGISTERING_NETWORK": "In attesa della rete...", + "CHECKING_NEW_VERSION": "Controllo nuova versione...", + "CHECK_NEW_VERSION_FAILED": "Controllo nuova versione fallito, riprovo tra %d secondi: %s", + "SWITCH_TO_WIFI_NETWORK": "Passaggio a Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "Passaggio a 4G...", + "STANDBY": "In attesa", + "CONNECT_TO": "Connetti a ", + "CONNECTING": "Connessione...", + "CONNECTED_TO": "Connesso a ", + "LISTENING": "In ascolto...", + "SPEAKING": "Parlando...", + "SERVER_NOT_FOUND": "Ricerca servizio disponibile", + "SERVER_NOT_CONNECTED": "Impossibile connettersi al servizio, riprovare più tardi", + "SERVER_TIMEOUT": "Timeout risposta", + "SERVER_ERROR": "Invio fallito, controllare la rete", + "CONNECT_TO_HOTSPOT": "Connetti telefono al hotspot ", + "ACCESS_VIA_BROWSER": ",accedi tramite browser ", + "WIFI_CONFIG_MODE": "Modalità configurazione rete", + "ENTERING_WIFI_CONFIG_MODE": "Entrata in modalità configurazione rete...", + "SCANNING_WIFI": "Scansione Wi-Fi...", "NEW_VERSION": "Nuova versione ", - "OTA_UPGRADE":"Aggiornamento OTA", - "UPGRADING":"Aggiornamento sistema...", - "UPGRADE_FAILED":"Aggiornamento fallito", - "ACTIVATION":"Attivazione dispositivo", - - "BATTERY_LOW":"Batteria scarica", - "BATTERY_CHARGING":"In carica", - "BATTERY_FULL":"Batteria piena", - "BATTERY_NEED_CHARGE":"Batteria scarica, ricaricare", - - "VOLUME":"Volume ", - "MUTED":"Silenziato", - "MAX_VOLUME":"Volume massimo", - - "RTC_MODE_OFF":"AEC disattivato", - "RTC_MODE_ON":"AEC attivato" + "OTA_UPGRADE": "Aggiornamento OTA", + "UPGRADING": "Aggiornamento sistema...", + "UPGRADE_FAILED": "Aggiornamento fallito", + "ACTIVATION": "Attivazione dispositivo", + "BATTERY_LOW": "Batteria scarica", + "BATTERY_CHARGING": "In carica", + "BATTERY_FULL": "Batteria piena", + "BATTERY_NEED_CHARGE": "Batteria scarica, ricaricare", + "VOLUME": "Volume ", + "MUTED": "Silenziato", + "MAX_VOLUME": "Volume massimo", + "RTC_MODE_OFF": "AEC disattivato", + "RTC_MODE_ON": "AEC attivato", + "DOWNLOAD_ASSETS_FAILED": "Impossibile scaricare le risorse", + "LOADING_ASSETS": "Caricamento risorse...", + "PLEASE_WAIT": "Attendere prego...", + "FOUND_NEW_ASSETS": "Trovate nuove risorse: %s", + "HELLO_MY_FRIEND": "Ciao, amico mio!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/ja-JP/language.json b/main/assets/locales/ja-JP/language.json index 7cf00cd2..1c2bd827 100644 --- a/main/assets/locales/ja-JP/language.json +++ b/main/assets/locales/ja-JP/language.json @@ -17,42 +17,39 @@ "CHECK_NEW_VERSION_FAILED": "更新確認に失敗しました。%d 秒後に再試行します: %s", "SWITCH_TO_WIFI_NETWORK": "Wi-Fiに切り替え中...", "SWITCH_TO_4G_NETWORK": "4Gに切り替え中...", - "STANDBY": "待機中", "CONNECT_TO": "接続先 ", "CONNECTING": "接続中...", "CONNECTED_TO": "接続完了 ", - "LISTENING": "リスニング中...", "SPEAKING": "話しています...", - "SERVER_NOT_FOUND": "利用可能なサーバーを探しています", "SERVER_NOT_CONNECTED": "サーバーに接続できません。後でもう一度お試しください", "SERVER_TIMEOUT": "応答待機時間が終了しました", "SERVER_ERROR": "送信に失敗しました。ネットワークを確認してください", - "CONNECT_TO_HOTSPOT": "スマートフォンをWi-Fi ", "ACCESS_VIA_BROWSER": " に接続し、ブラウザでアクセスしてください ", "WIFI_CONFIG_MODE": "ネットワーク設定モード", "ENTERING_WIFI_CONFIG_MODE": "ネットワーク設定中...", "SCANNING_WIFI": "Wi-Fiをスキャン中...", - "NEW_VERSION": "新しいバージョン ", "OTA_UPGRADE": "OTAアップグレード", "UPGRADING": "システムをアップグレード中...", "UPGRADE_FAILED": "アップグレード失敗", "ACTIVATION": "デバイスをアクティベート", - "BATTERY_LOW": "バッテリーが少なくなっています", "BATTERY_CHARGING": "充電中", "BATTERY_FULL": "バッテリー満タン", "BATTERY_NEED_CHARGE": "バッテリーが低下しています。充電してください", - "VOLUME": "音量 ", "MUTED": "ミュートされています", "MAX_VOLUME": "最大音量", - "RTC_MODE_OFF": "AEC 無効", - "RTC_MODE_ON": "AEC 有効" + "RTC_MODE_ON": "AEC 有効", + "DOWNLOAD_ASSETS_FAILED": "アセットのダウンロードに失敗しました", + "LOADING_ASSETS": "アセットを読み込み中...", + "PLEASE_WAIT": "お待ちください...", + "FOUND_NEW_ASSETS": "新しいアセットが見つかりました: %s", + "HELLO_MY_FRIEND": "こんにちは、友達!" } -} +} \ No newline at end of file diff --git a/main/assets/locales/ko-KR/language.json b/main/assets/locales/ko-KR/language.json index 9683c8a1..1d65bfb3 100644 --- a/main/assets/locales/ko-KR/language.json +++ b/main/assets/locales/ko-KR/language.json @@ -17,43 +17,40 @@ "CHECK_NEW_VERSION_FAILED": "새 버전 확인에 실패했습니다. %d초 후에 다시 시도합니다: %s", "SWITCH_TO_WIFI_NETWORK": "Wi-Fi로 전환 중...", "SWITCH_TO_4G_NETWORK": "4G로 전환 중...", - "STANDBY": "대기", "CONNECT_TO": "연결 대상: ", "CONNECTING": "연결 중...", "CONNECTION_SUCCESSFUL": "연결 성공", "CONNECTED_TO": "연결됨: ", - "LISTENING": "듣는 중...", "SPEAKING": "말하는 중...", - "SERVER_NOT_FOUND": "사용 가능한 서비스를 찾는 중", "SERVER_NOT_CONNECTED": "서비스에 연결할 수 없습니다. 나중에 다시 시도하세요", "SERVER_TIMEOUT": "응답 대기 시간 초과", "SERVER_ERROR": "전송 실패, 네트워크를 확인하세요", - "CONNECT_TO_HOTSPOT": "핫스팟: ", "ACCESS_VIA_BROWSER": " 설정 URL: ", "WIFI_CONFIG_MODE": "Wi-Fi 설정 모드", "ENTERING_WIFI_CONFIG_MODE": "Wi-Fi 설정 모드 진입 중...", "SCANNING_WIFI": "Wi-Fi 스캔 중...", - "NEW_VERSION": "새 버전 ", "OTA_UPGRADE": "OTA 업그레이드", "UPGRADING": "시스템 업그레이드 중...", "UPGRADE_FAILED": "업그레이드 실패", "ACTIVATION": "활성화", - "BATTERY_LOW": "배터리 부족", "BATTERY_CHARGING": "충전 중", "BATTERY_FULL": "배터리 완충", "BATTERY_NEED_CHARGE": "배터리 부족, 충전하세요", - "VOLUME": "볼륨 ", "MUTED": "음소거", "MAX_VOLUME": "최대 볼륨", - "RTC_MODE_OFF": "AEC 끄기", - "RTC_MODE_ON": "AEC 켜기" + "RTC_MODE_ON": "AEC 켜기", + "DOWNLOAD_ASSETS_FAILED": "에셋 다운로드 실패", + "LOADING_ASSETS": "에셋 로딩 중...", + "PLEASE_WAIT": "잠시 기다려 주세요...", + "FOUND_NEW_ASSETS": "새로운 에셋을 발견했습니다: %s", + "HELLO_MY_FRIEND": "안녕하세요, 친구!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/pl-PL/language.json b/main/assets/locales/pl-PL/language.json index 4f92dc48..b54c2929 100644 --- a/main/assets/locales/pl-PL/language.json +++ b/main/assets/locales/pl-PL/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"pl-PL" + "type": "pl-PL" }, "strings": { - "WARNING":"Ostrzeżenie", - "INFO":"Informacja", - "ERROR":"Błąd", + "WARNING": "Ostrzeżenie", + "INFO": "Informacja", + "ERROR": "Błąd", "VERSION": "Wersja ", - "LOADING_PROTOCOL":"Łączenie z serwerem...", - "INITIALIZING":"Inicjalizacja...", - "PIN_ERROR":"Proszę włożyć kartę SIM", - "REG_ERROR":"Nie można uzyskać dostępu do sieci, sprawdź stan karty danych", - "DETECTING_MODULE":"Wykrywanie modułu...", - "REGISTERING_NETWORK":"Oczekiwanie na sieć...", - "CHECKING_NEW_VERSION":"Sprawdzanie nowej wersji...", - "CHECK_NEW_VERSION_FAILED":"Sprawdzanie nowej wersji nie powiodło się, ponowna próba za %d sekund: %s", - "SWITCH_TO_WIFI_NETWORK":"Przełączanie na Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"Przełączanie na 4G...", - - "STANDBY":"Gotowość", - "CONNECT_TO":"Połącz z ", - "CONNECTING":"Łączenie...", - "CONNECTED_TO":"Połączono z ", - - "LISTENING":"Słuchanie...", - "SPEAKING":"Mówienie...", - - "SERVER_NOT_FOUND":"Szukanie dostępnej usługi", - "SERVER_NOT_CONNECTED":"Nie można połączyć się z usługą, spróbuj ponownie później", - "SERVER_TIMEOUT":"Przekroczono czas oczekiwania na odpowiedź", - "SERVER_ERROR":"Wysyłanie nie powiodło się, sprawdź sieć", - - "CONNECT_TO_HOTSPOT":"Podłącz telefon do hotspotu ", - "ACCESS_VIA_BROWSER":",dostęp przez przeglądarkę ", - "WIFI_CONFIG_MODE":"Tryb konfiguracji sieci", - "ENTERING_WIFI_CONFIG_MODE":"Wchodzenie w tryb konfiguracji sieci...", - "SCANNING_WIFI":"Skanowanie Wi-Fi...", - + "LOADING_PROTOCOL": "Łączenie z serwerem...", + "INITIALIZING": "Inicjalizacja...", + "PIN_ERROR": "Proszę włożyć kartę SIM", + "REG_ERROR": "Nie można uzyskać dostępu do sieci, sprawdź stan karty danych", + "DETECTING_MODULE": "Wykrywanie modułu...", + "REGISTERING_NETWORK": "Oczekiwanie na sieć...", + "CHECKING_NEW_VERSION": "Sprawdzanie nowej wersji...", + "CHECK_NEW_VERSION_FAILED": "Sprawdzanie nowej wersji nie powiodło się, ponowna próba za %d sekund: %s", + "SWITCH_TO_WIFI_NETWORK": "Przełączanie na Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "Przełączanie na 4G...", + "STANDBY": "Gotowość", + "CONNECT_TO": "Połącz z ", + "CONNECTING": "Łączenie...", + "CONNECTED_TO": "Połączono z ", + "LISTENING": "Słuchanie...", + "SPEAKING": "Mówienie...", + "SERVER_NOT_FOUND": "Szukanie dostępnej usługi", + "SERVER_NOT_CONNECTED": "Nie można połączyć się z usługą, spróbuj ponownie później", + "SERVER_TIMEOUT": "Przekroczono czas oczekiwania na odpowiedź", + "SERVER_ERROR": "Wysyłanie nie powiodło się, sprawdź sieć", + "CONNECT_TO_HOTSPOT": "Podłącz telefon do hotspotu ", + "ACCESS_VIA_BROWSER": ",dostęp przez przeglądarkę ", + "WIFI_CONFIG_MODE": "Tryb konfiguracji sieci", + "ENTERING_WIFI_CONFIG_MODE": "Wchodzenie w tryb konfiguracji sieci...", + "SCANNING_WIFI": "Skanowanie Wi-Fi...", "NEW_VERSION": "Nowa wersja ", - "OTA_UPGRADE":"Aktualizacja OTA", - "UPGRADING":"Aktualizacja systemu...", - "UPGRADE_FAILED":"Aktualizacja nie powiodła się", - "ACTIVATION":"Aktywacja urządzenia", - - "BATTERY_LOW":"Niski poziom baterii", - "BATTERY_CHARGING":"Ładowanie", - "BATTERY_FULL":"Bateria pełna", - "BATTERY_NEED_CHARGE":"Niski poziom baterii, proszę naładować", - - "VOLUME":"Głośność ", - "MUTED":"Wyciszony", - "MAX_VOLUME":"Maksymalna głośność", - - "RTC_MODE_OFF":"AEC wyłączony", - "RTC_MODE_ON":"AEC włączony" + "OTA_UPGRADE": "Aktualizacja OTA", + "UPGRADING": "Aktualizacja systemu...", + "UPGRADE_FAILED": "Aktualizacja nie powiodła się", + "ACTIVATION": "Aktywacja urządzenia", + "BATTERY_LOW": "Niski poziom baterii", + "BATTERY_CHARGING": "Ładowanie", + "BATTERY_FULL": "Bateria pełna", + "BATTERY_NEED_CHARGE": "Niski poziom baterii, proszę naładować", + "VOLUME": "Głośność ", + "MUTED": "Wyciszony", + "MAX_VOLUME": "Maksymalna głośność", + "RTC_MODE_OFF": "AEC wyłączony", + "RTC_MODE_ON": "AEC włączony", + "DOWNLOAD_ASSETS_FAILED": "Nie udało się pobrać zasobów", + "LOADING_ASSETS": "Ładowanie zasobów...", + "PLEASE_WAIT": "Proszę czekać...", + "FOUND_NEW_ASSETS": "Znaleziono nowe zasoby: %s", + "HELLO_MY_FRIEND": "Cześć, mój przyjacielu!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/pt-PT/language.json b/main/assets/locales/pt-PT/language.json index f3b5bac1..da0e0e21 100644 --- a/main/assets/locales/pt-PT/language.json +++ b/main/assets/locales/pt-PT/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"pt-PT" + "type": "pt-PT" }, "strings": { - "WARNING":"Aviso", - "INFO":"Informação", - "ERROR":"Erro", + "WARNING": "Aviso", + "INFO": "Informação", + "ERROR": "Erro", "VERSION": "Versão ", - "LOADING_PROTOCOL":"Ligando ao servidor...", - "INITIALIZING":"A inicializar...", - "PIN_ERROR":"Por favor insira o cartão SIM", - "REG_ERROR":"Não é possível aceder à rede, verifique o estado do cartão de dados", - "DETECTING_MODULE":"A detectar módulo...", - "REGISTERING_NETWORK":"À espera da rede...", - "CHECKING_NEW_VERSION":"A verificar nova versão...", - "CHECK_NEW_VERSION_FAILED":"Falha na verificação de nova versão, nova tentativa em %d segundos: %s", - "SWITCH_TO_WIFI_NETWORK":"A mudar para Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"A mudar para 4G...", - - "STANDBY":"Em espera", - "CONNECT_TO":"Ligar a ", - "CONNECTING":"A ligar...", - "CONNECTED_TO":"Ligado a ", - - "LISTENING":"A escutar...", - "SPEAKING":"A falar...", - - "SERVER_NOT_FOUND":"A procurar serviço disponível", - "SERVER_NOT_CONNECTED":"Não é possível ligar ao serviço, tente mais tarde", - "SERVER_TIMEOUT":"Tempo limite de resposta", - "SERVER_ERROR":"Falha no envio, verifique a rede", - - "CONNECT_TO_HOTSPOT":"Ligue o telefone ao hotspot ", - "ACCESS_VIA_BROWSER":",aceder através do navegador ", - "WIFI_CONFIG_MODE":"Modo de configuração de rede", - "ENTERING_WIFI_CONFIG_MODE":"A entrar no modo de configuração de rede...", - "SCANNING_WIFI":"A procurar Wi-Fi...", - + "LOADING_PROTOCOL": "Ligando ao servidor...", + "INITIALIZING": "A inicializar...", + "PIN_ERROR": "Por favor insira o cartão SIM", + "REG_ERROR": "Não é possível aceder à rede, verifique o estado do cartão de dados", + "DETECTING_MODULE": "A detectar módulo...", + "REGISTERING_NETWORK": "À espera da rede...", + "CHECKING_NEW_VERSION": "A verificar nova versão...", + "CHECK_NEW_VERSION_FAILED": "Falha na verificação de nova versão, nova tentativa em %d segundos: %s", + "SWITCH_TO_WIFI_NETWORK": "A mudar para Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "A mudar para 4G...", + "STANDBY": "Em espera", + "CONNECT_TO": "Ligar a ", + "CONNECTING": "A ligar...", + "CONNECTED_TO": "Ligado a ", + "LISTENING": "A escutar...", + "SPEAKING": "A falar...", + "SERVER_NOT_FOUND": "A procurar serviço disponível", + "SERVER_NOT_CONNECTED": "Não é possível ligar ao serviço, tente mais tarde", + "SERVER_TIMEOUT": "Tempo limite de resposta", + "SERVER_ERROR": "Falha no envio, verifique a rede", + "CONNECT_TO_HOTSPOT": "Ligue o telefone ao hotspot ", + "ACCESS_VIA_BROWSER": ",aceder através do navegador ", + "WIFI_CONFIG_MODE": "Modo de configuração de rede", + "ENTERING_WIFI_CONFIG_MODE": "A entrar no modo de configuração de rede...", + "SCANNING_WIFI": "A procurar Wi-Fi...", "NEW_VERSION": "Nova versão ", - "OTA_UPGRADE":"Atualização OTA", - "UPGRADING":"A atualizar sistema...", - "UPGRADE_FAILED":"Atualização falhada", - "ACTIVATION":"Ativação do dispositivo", - - "BATTERY_LOW":"Bateria fraca", - "BATTERY_CHARGING":"A carregar", - "BATTERY_FULL":"Bateria cheia", - "BATTERY_NEED_CHARGE":"Bateria fraca, por favor carregue", - - "VOLUME":"Volume ", - "MUTED":"Silenciado", - "MAX_VOLUME":"Volume máximo", - - "RTC_MODE_OFF":"AEC desligado", - "RTC_MODE_ON":"AEC ligado" + "OTA_UPGRADE": "Atualização OTA", + "UPGRADING": "A atualizar sistema...", + "UPGRADE_FAILED": "Atualização falhada", + "ACTIVATION": "Ativação do dispositivo", + "BATTERY_LOW": "Bateria fraca", + "BATTERY_CHARGING": "A carregar", + "BATTERY_FULL": "Bateria cheia", + "BATTERY_NEED_CHARGE": "Bateria fraca, por favor carregue", + "VOLUME": "Volume ", + "MUTED": "Silenciado", + "MAX_VOLUME": "Volume máximo", + "RTC_MODE_OFF": "AEC desligado", + "RTC_MODE_ON": "AEC ligado", + "DOWNLOAD_ASSETS_FAILED": "Falha ao descarregar recursos", + "LOADING_ASSETS": "A carregar recursos...", + "PLEASE_WAIT": "Por favor aguarde...", + "FOUND_NEW_ASSETS": "Encontrados novos recursos: %s", + "HELLO_MY_FRIEND": "Olá, meu amigo!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/ro-RO/language.json b/main/assets/locales/ro-RO/language.json index 2d4122d9..d8ec774a 100644 --- a/main/assets/locales/ro-RO/language.json +++ b/main/assets/locales/ro-RO/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"ro-RO" + "type": "ro-RO" }, "strings": { - "WARNING":"Avertisment", - "INFO":"Informație", - "ERROR":"Eroare", + "WARNING": "Avertisment", + "INFO": "Informație", + "ERROR": "Eroare", "VERSION": "Versiune ", - "LOADING_PROTOCOL":"Se conectează la server...", - "INITIALIZING":"Se inițializează...", - "PIN_ERROR":"Vă rugăm să introduceți cardul SIM", - "REG_ERROR":"Nu se poate accesa rețeaua, verificați starea cardului de date", - "DETECTING_MODULE":"Se detectează modulul...", - "REGISTERING_NETWORK":"Se așteaptă rețeaua...", - "CHECKING_NEW_VERSION":"Se verifică versiunea nouă...", - "CHECK_NEW_VERSION_FAILED":"Verificarea versiunii noi a eșuat, se reîncearcă în %d secunde: %s", - "SWITCH_TO_WIFI_NETWORK":"Se comută la Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"Se comută la 4G...", - - "STANDBY":"În așteptare", - "CONNECT_TO":"Conectare la ", - "CONNECTING":"Se conectează...", - "CONNECTED_TO":"Conectat la ", - - "LISTENING":"Se ascultă...", - "SPEAKING":"Se vorbește...", - - "SERVER_NOT_FOUND":"Se caută serviciul disponibil", - "SERVER_NOT_CONNECTED":"Nu se poate conecta la serviciu, încercați mai târziu", - "SERVER_TIMEOUT":"Timpul de răspuns a expirat", - "SERVER_ERROR":"Trimiterea a eșuat, verificați rețeaua", - - "CONNECT_TO_HOTSPOT":"Conectați telefonul la hotspot ", - "ACCESS_VIA_BROWSER":",accesați prin browser ", - "WIFI_CONFIG_MODE":"Modul de configurare rețea", - "ENTERING_WIFI_CONFIG_MODE":"Se intră în modul de configurare rețea...", - "SCANNING_WIFI":"Se scanează Wi-Fi...", - + "LOADING_PROTOCOL": "Se conectează la server...", + "INITIALIZING": "Se inițializează...", + "PIN_ERROR": "Vă rugăm să introduceți cardul SIM", + "REG_ERROR": "Nu se poate accesa rețeaua, verificați starea cardului de date", + "DETECTING_MODULE": "Se detectează modulul...", + "REGISTERING_NETWORK": "Se așteaptă rețeaua...", + "CHECKING_NEW_VERSION": "Se verifică versiunea nouă...", + "CHECK_NEW_VERSION_FAILED": "Verificarea versiunii noi a eșuat, se reîncearcă în %d secunde: %s", + "SWITCH_TO_WIFI_NETWORK": "Se comută la Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "Se comută la 4G...", + "STANDBY": "În așteptare", + "CONNECT_TO": "Conectare la ", + "CONNECTING": "Se conectează...", + "CONNECTED_TO": "Conectat la ", + "LISTENING": "Se ascultă...", + "SPEAKING": "Se vorbește...", + "SERVER_NOT_FOUND": "Se caută serviciul disponibil", + "SERVER_NOT_CONNECTED": "Nu se poate conecta la serviciu, încercați mai târziu", + "SERVER_TIMEOUT": "Timpul de răspuns a expirat", + "SERVER_ERROR": "Trimiterea a eșuat, verificați rețeaua", + "CONNECT_TO_HOTSPOT": "Conectați telefonul la hotspot ", + "ACCESS_VIA_BROWSER": ",accesați prin browser ", + "WIFI_CONFIG_MODE": "Modul de configurare rețea", + "ENTERING_WIFI_CONFIG_MODE": "Se intră în modul de configurare rețea...", + "SCANNING_WIFI": "Se scanează Wi-Fi...", "NEW_VERSION": "Versiune nouă ", - "OTA_UPGRADE":"Actualizare OTA", - "UPGRADING":"Se actualizează sistemul...", - "UPGRADE_FAILED":"Actualizarea a eșuat", - "ACTIVATION":"Activarea dispozitivului", - - "BATTERY_LOW":"Baterie scăzută", - "BATTERY_CHARGING":"Se încarcă", - "BATTERY_FULL":"Baterie plină", - "BATTERY_NEED_CHARGE":"Baterie scăzută, vă rugăm să încărcați", - - "VOLUME":"Volum ", - "MUTED":"Silențios", - "MAX_VOLUME":"Volum maxim", - - "RTC_MODE_OFF":"AEC oprit", - "RTC_MODE_ON":"AEC pornit" + "OTA_UPGRADE": "Actualizare OTA", + "UPGRADING": "Se actualizează sistemul...", + "UPGRADE_FAILED": "Actualizarea a eșuat", + "ACTIVATION": "Activarea dispozitivului", + "BATTERY_LOW": "Baterie scăzută", + "BATTERY_CHARGING": "Se încarcă", + "BATTERY_FULL": "Baterie plină", + "BATTERY_NEED_CHARGE": "Baterie scăzută, vă rugăm să încărcați", + "VOLUME": "Volum ", + "MUTED": "Silențios", + "MAX_VOLUME": "Volum maxim", + "RTC_MODE_OFF": "AEC oprit", + "RTC_MODE_ON": "AEC pornit", + "DOWNLOAD_ASSETS_FAILED": "Eșec la descărcarea resurselor", + "LOADING_ASSETS": "Se încarcă resursele...", + "PLEASE_WAIT": "Vă rugăm să așteptați...", + "FOUND_NEW_ASSETS": "S-au găsit resurse noi: %s", + "HELLO_MY_FRIEND": "Salut, prietenul meu!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/ru-RU/language.json b/main/assets/locales/ru-RU/language.json index e3af473e..ebac6069 100644 --- a/main/assets/locales/ru-RU/language.json +++ b/main/assets/locales/ru-RU/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"ru-RU" + "type": "ru-RU" }, "strings": { - "WARNING":"Предупреждение", - "INFO":"Информация", - "ERROR":"Ошибка", + "WARNING": "Предупреждение", + "INFO": "Информация", + "ERROR": "Ошибка", "VERSION": "Версия ", - "LOADING_PROTOCOL":"Подключение к серверу...", - "INITIALIZING":"Инициализация...", - "PIN_ERROR":"Пожалуйста, вставьте SIM-карту", - "REG_ERROR":"Невозможно подключиться к сети, проверьте состояние карты данных", - "DETECTING_MODULE":"Обнаружение модуля...", - "REGISTERING_NETWORK":"Ожидание сети...", - "CHECKING_NEW_VERSION":"Проверка новой версии...", - "CHECK_NEW_VERSION_FAILED":"Ошибка проверки новой версии, повтор через %d секунд: %s", - "SWITCH_TO_WIFI_NETWORK":"Переключение на Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"Переключение на 4G...", - - "STANDBY":"Ожидание", - "CONNECT_TO":"Подключение к ", - "CONNECTING":"Подключение...", - "CONNECTED_TO":"Подключено к ", - - "LISTENING":"Прослушивание...", - "SPEAKING":"Говорение...", - - "SERVER_NOT_FOUND":"Поиск доступного сервиса", - "SERVER_NOT_CONNECTED":"Невозможно подключиться к сервису, попробуйте позже", - "SERVER_TIMEOUT":"Тайм-аут ответа", - "SERVER_ERROR":"Ошибка отправки, проверьте сеть", - - "CONNECT_TO_HOTSPOT":"Подключите телефон к точке доступа ", - "ACCESS_VIA_BROWSER":",доступ через браузер ", - "WIFI_CONFIG_MODE":"Режим настройки сети", - "ENTERING_WIFI_CONFIG_MODE":"Вход в режим настройки сети...", - "SCANNING_WIFI":"Сканирование Wi-Fi...", - + "LOADING_PROTOCOL": "Подключение к серверу...", + "INITIALIZING": "Инициализация...", + "PIN_ERROR": "Пожалуйста, вставьте SIM-карту", + "REG_ERROR": "Невозможно подключиться к сети, проверьте состояние карты данных", + "DETECTING_MODULE": "Обнаружение модуля...", + "REGISTERING_NETWORK": "Ожидание сети...", + "CHECKING_NEW_VERSION": "Проверка новой версии...", + "CHECK_NEW_VERSION_FAILED": "Ошибка проверки новой версии, повтор через %d секунд: %s", + "SWITCH_TO_WIFI_NETWORK": "Переключение на Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "Переключение на 4G...", + "STANDBY": "Ожидание", + "CONNECT_TO": "Подключение к ", + "CONNECTING": "Подключение...", + "CONNECTED_TO": "Подключено к ", + "LISTENING": "Прослушивание...", + "SPEAKING": "Говорение...", + "SERVER_NOT_FOUND": "Поиск доступного сервиса", + "SERVER_NOT_CONNECTED": "Невозможно подключиться к сервису, попробуйте позже", + "SERVER_TIMEOUT": "Тайм-аут ответа", + "SERVER_ERROR": "Ошибка отправки, проверьте сеть", + "CONNECT_TO_HOTSPOT": "Подключите телефон к точке доступа ", + "ACCESS_VIA_BROWSER": ",доступ через браузер ", + "WIFI_CONFIG_MODE": "Режим настройки сети", + "ENTERING_WIFI_CONFIG_MODE": "Вход в режим настройки сети...", + "SCANNING_WIFI": "Сканирование Wi-Fi...", "NEW_VERSION": "Новая версия ", - "OTA_UPGRADE":"Обновление OTA", - "UPGRADING":"Обновление системы...", - "UPGRADE_FAILED":"Обновление не удалось", - "ACTIVATION":"Активация устройства", - - "BATTERY_LOW":"Низкий заряд батареи", - "BATTERY_CHARGING":"Зарядка", - "BATTERY_FULL":"Батарея полная", - "BATTERY_NEED_CHARGE":"Низкий заряд, пожалуйста, зарядите", - - "VOLUME":"Громкость ", - "MUTED":"Звук отключен", - "MAX_VOLUME":"Максимальная громкость", - - "RTC_MODE_OFF":"AEC выключен", - "RTC_MODE_ON":"AEC включен" + "OTA_UPGRADE": "Обновление OTA", + "UPGRADING": "Обновление системы...", + "UPGRADE_FAILED": "Обновление не удалось", + "ACTIVATION": "Активация устройства", + "BATTERY_LOW": "Низкий заряд батареи", + "BATTERY_CHARGING": "Зарядка", + "BATTERY_FULL": "Батарея полная", + "BATTERY_NEED_CHARGE": "Низкий заряд, пожалуйста, зарядите", + "VOLUME": "Громкость ", + "MUTED": "Звук отключен", + "MAX_VOLUME": "Максимальная громкость", + "RTC_MODE_OFF": "AEC выключен", + "RTC_MODE_ON": "AEC включен", + "DOWNLOAD_ASSETS_FAILED": "Не удалось загрузить ресурсы", + "LOADING_ASSETS": "Загрузка ресурсов...", + "PLEASE_WAIT": "Пожалуйста, подождите...", + "FOUND_NEW_ASSETS": "Найдены новые ресурсы: %s", + "HELLO_MY_FRIEND": "Привет, мой друг!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/th-TH/language.json b/main/assets/locales/th-TH/language.json index 6c0460f9..e97fed1a 100644 --- a/main/assets/locales/th-TH/language.json +++ b/main/assets/locales/th-TH/language.json @@ -17,43 +17,40 @@ "CHECK_NEW_VERSION_FAILED": "การตรวจสอบเวอร์ชันใหม่ล้มเหลว จะลองใหม่ใน %d วินาที: %s", "SWITCH_TO_WIFI_NETWORK": "กำลังเปลี่ยนเป็น Wi-Fi...", "SWITCH_TO_4G_NETWORK": "กำลังเปลี่ยนเป็น 4G...", - "STANDBY": "พร้อม", "CONNECT_TO": "เชื่อมต่อกับ ", "CONNECTING": "กำลังเชื่อมต่อ...", "CONNECTION_SUCCESSFUL": "เชื่อมต่อสำเร็จ", "CONNECTED_TO": "เชื่อมต่อกับ ", - "LISTENING": "กำลังฟัง...", "SPEAKING": "กำลังพูด...", - "SERVER_NOT_FOUND": "กำลังค้นหาบริการที่ใช้งานได้", "SERVER_NOT_CONNECTED": "ไม่สามารถเชื่อมต่อกับบริการได้ กรุณาลองใหม่ในภายหลัง", "SERVER_TIMEOUT": "หมดเวลารอการตอบกลับ", "SERVER_ERROR": "การส่งข้อมูลล้มเหลว กรุณาตรวจสอบเครือข่าย", - "CONNECT_TO_HOTSPOT": "ฮอตสปอต: ", "ACCESS_VIA_BROWSER": " URL การตั้งค่า: ", "WIFI_CONFIG_MODE": "โหมดการตั้งค่า Wi-Fi", "ENTERING_WIFI_CONFIG_MODE": "กำลังเข้าสู่โหมดการตั้งค่า Wi-Fi...", "SCANNING_WIFI": "กำลังสแกน Wi-Fi...", - "NEW_VERSION": "เวอร์ชันใหม่ ", "OTA_UPGRADE": "การอัปเกรด OTA", "UPGRADING": "ระบบกำลังอัปเกรด...", "UPGRADE_FAILED": "การอัปเกรดล้มเหลว", "ACTIVATION": "การเปิดใช้งาน", - "BATTERY_LOW": "แบตเตอรี่ต่ำ", "BATTERY_CHARGING": "กำลังชาร์จ", "BATTERY_FULL": "แบตเตอรี่เต็ม", "BATTERY_NEED_CHARGE": "แบตเตอรี่ต่ำ กรุณาชาร์จ", - "VOLUME": "เสียง ", "MUTED": "ปิดเสียง", "MAX_VOLUME": "เสียงสูงสุด", - "RTC_MODE_OFF": "ปิด AEC", - "RTC_MODE_ON": "เปิด AEC" + "RTC_MODE_ON": "เปิด AEC", + "DOWNLOAD_ASSETS_FAILED": "ดาวน์โหลดทรัพยากรล้มเหลว", + "LOADING_ASSETS": "กำลังโหลดทรัพยากร...", + "PLEASE_WAIT": "กรุณารอสักครู่...", + "FOUND_NEW_ASSETS": "พบทรัพยากรใหม่: %s", + "HELLO_MY_FRIEND": "สวัสดี เพื่อนของฉัน!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/tr-TR/language.json b/main/assets/locales/tr-TR/language.json index a028d80f..4d0f70f4 100644 --- a/main/assets/locales/tr-TR/language.json +++ b/main/assets/locales/tr-TR/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"tr-TR" + "type": "tr-TR" }, "strings": { - "WARNING":"Uyarı", - "INFO":"Bilgi", - "ERROR":"Hata", + "WARNING": "Uyarı", + "INFO": "Bilgi", + "ERROR": "Hata", "VERSION": "Sürüm ", - "LOADING_PROTOCOL":"Sunucuya bağlanıyor...", - "INITIALIZING":"Başlatılıyor...", - "PIN_ERROR":"Lütfen SIM kartı takın", - "REG_ERROR":"Ağa erişilemiyor, veri kartı durumunu kontrol edin", - "DETECTING_MODULE":"Modül algılanıyor...", - "REGISTERING_NETWORK":"Ağ bekleniyor...", - "CHECKING_NEW_VERSION":"Yeni sürüm kontrol ediliyor...", - "CHECK_NEW_VERSION_FAILED":"Yeni sürüm kontrolü başarısız, %d saniye sonra tekrar denenecek: %s", - "SWITCH_TO_WIFI_NETWORK":"Wi-Fi'ye geçiliyor...", - "SWITCH_TO_4G_NETWORK":"4G'ye geçiliyor...", - - "STANDBY":"Bekleme", - "CONNECT_TO":"Bağlan ", - "CONNECTING":"Bağlanıyor...", - "CONNECTED_TO":"Bağlandı ", - - "LISTENING":"Dinleniyor...", - "SPEAKING":"Konuşuluyor...", - - "SERVER_NOT_FOUND":"Mevcut hizmet aranıyor", - "SERVER_NOT_CONNECTED":"Hizmete bağlanılamıyor, lütfen daha sonra deneyin", - "SERVER_TIMEOUT":"Yanıt zaman aşımı", - "SERVER_ERROR":"Gönderme başarısız, ağı kontrol edin", - - "CONNECT_TO_HOTSPOT":"Telefonu hotspot'a bağlayın ", - "ACCESS_VIA_BROWSER":",tarayıcı üzerinden erişin ", - "WIFI_CONFIG_MODE":"Ağ yapılandırma modu", - "ENTERING_WIFI_CONFIG_MODE":"Ağ yapılandırma moduna giriliyor...", - "SCANNING_WIFI":"Wi-Fi taranıyor...", - + "LOADING_PROTOCOL": "Sunucuya bağlanıyor...", + "INITIALIZING": "Başlatılıyor...", + "PIN_ERROR": "Lütfen SIM kartı takın", + "REG_ERROR": "Ağa erişilemiyor, veri kartı durumunu kontrol edin", + "DETECTING_MODULE": "Modül algılanıyor...", + "REGISTERING_NETWORK": "Ağ bekleniyor...", + "CHECKING_NEW_VERSION": "Yeni sürüm kontrol ediliyor...", + "CHECK_NEW_VERSION_FAILED": "Yeni sürüm kontrolü başarısız, %d saniye sonra tekrar denenecek: %s", + "SWITCH_TO_WIFI_NETWORK": "Wi-Fi'ye geçiliyor...", + "SWITCH_TO_4G_NETWORK": "4G'ye geçiliyor...", + "STANDBY": "Bekleme", + "CONNECT_TO": "Bağlan ", + "CONNECTING": "Bağlanıyor...", + "CONNECTED_TO": "Bağlandı ", + "LISTENING": "Dinleniyor...", + "SPEAKING": "Konuşuluyor...", + "SERVER_NOT_FOUND": "Mevcut hizmet aranıyor", + "SERVER_NOT_CONNECTED": "Hizmete bağlanılamıyor, lütfen daha sonra deneyin", + "SERVER_TIMEOUT": "Yanıt zaman aşımı", + "SERVER_ERROR": "Gönderme başarısız, ağı kontrol edin", + "CONNECT_TO_HOTSPOT": "Telefonu hotspot'a bağlayın ", + "ACCESS_VIA_BROWSER": ",tarayıcı üzerinden erişin ", + "WIFI_CONFIG_MODE": "Ağ yapılandırma modu", + "ENTERING_WIFI_CONFIG_MODE": "Ağ yapılandırma moduna giriliyor...", + "SCANNING_WIFI": "Wi-Fi taranıyor...", "NEW_VERSION": "Yeni sürüm ", - "OTA_UPGRADE":"OTA güncelleme", - "UPGRADING":"Sistem güncelleniyor...", - "UPGRADE_FAILED":"Güncelleme başarısız", - "ACTIVATION":"Cihaz aktivasyonu", - - "BATTERY_LOW":"Pil düşük", - "BATTERY_CHARGING":"Şarj oluyor", - "BATTERY_FULL":"Pil dolu", - "BATTERY_NEED_CHARGE":"Pil düşük, lütfen şarj edin", - - "VOLUME":"Ses ", - "MUTED":"Sessiz", - "MAX_VOLUME":"Maksimum ses", - - "RTC_MODE_OFF":"AEC kapalı", - "RTC_MODE_ON":"AEC açık" + "OTA_UPGRADE": "OTA güncelleme", + "UPGRADING": "Sistem güncelleniyor...", + "UPGRADE_FAILED": "Güncelleme başarısız", + "ACTIVATION": "Cihaz aktivasyonu", + "BATTERY_LOW": "Pil düşük", + "BATTERY_CHARGING": "Şarj oluyor", + "BATTERY_FULL": "Pil dolu", + "BATTERY_NEED_CHARGE": "Pil düşük, lütfen şarj edin", + "VOLUME": "Ses ", + "MUTED": "Sessiz", + "MAX_VOLUME": "Maksimum ses", + "RTC_MODE_OFF": "AEC kapalı", + "RTC_MODE_ON": "AEC açık", + "DOWNLOAD_ASSETS_FAILED": "Varlıklar indirilemedi", + "LOADING_ASSETS": "Varlıklar yükleniyor...", + "PLEASE_WAIT": "Lütfen bekleyin...", + "FOUND_NEW_ASSETS": "Yeni varlıklar bulundu: %s", + "HELLO_MY_FRIEND": "Merhaba, arkadaşım!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/uk-UA/language.json b/main/assets/locales/uk-UA/language.json index 8fa3649f..d844a383 100644 --- a/main/assets/locales/uk-UA/language.json +++ b/main/assets/locales/uk-UA/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"uk-UA" + "type": "uk-UA" }, "strings": { - "WARNING":"Попередження", - "INFO":"Інформація", - "ERROR":"Помилка", + "WARNING": "Попередження", + "INFO": "Інформація", + "ERROR": "Помилка", "VERSION": "Версія ", - "LOADING_PROTOCOL":"Підключення до сервера...", - "INITIALIZING":"Ініціалізація...", - "PIN_ERROR":"Будь ласка, вставте SIM-карту", - "REG_ERROR":"Неможливо отримати доступ до мережі, перевірте стан карти даних", - "DETECTING_MODULE":"Виявлення модуля...", - "REGISTERING_NETWORK":"Очікування мережі...", - "CHECKING_NEW_VERSION":"Перевірка нової версії...", - "CHECK_NEW_VERSION_FAILED":"Перевірка нової версії не вдалася, повтор через %d секунд: %s", - "SWITCH_TO_WIFI_NETWORK":"Перемикання на Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"Перемикання на 4G...", - - "STANDBY":"Очікування", - "CONNECT_TO":"Підключитися до ", - "CONNECTING":"Підключення...", - "CONNECTED_TO":"Підключено до ", - - "LISTENING":"Прослуховування...", - "SPEAKING":"Говоріння...", - - "SERVER_NOT_FOUND":"Пошук доступного сервісу", - "SERVER_NOT_CONNECTED":"Неможливо підключитися до сервісу, спробуйте пізніше", - "SERVER_TIMEOUT":"Час очікування відповіді", - "SERVER_ERROR":"Помилка відправки, перевірте мережу", - - "CONNECT_TO_HOTSPOT":"Підключіть телефон до точки доступу ", - "ACCESS_VIA_BROWSER":",доступ через браузер ", - "WIFI_CONFIG_MODE":"Режим налаштування мережі", - "ENTERING_WIFI_CONFIG_MODE":"Вхід у режим налаштування мережі...", - "SCANNING_WIFI":"Сканування Wi-Fi...", - + "LOADING_PROTOCOL": "Підключення до сервера...", + "INITIALIZING": "Ініціалізація...", + "PIN_ERROR": "Будь ласка, вставте SIM-карту", + "REG_ERROR": "Неможливо отримати доступ до мережі, перевірте стан карти даних", + "DETECTING_MODULE": "Виявлення модуля...", + "REGISTERING_NETWORK": "Очікування мережі...", + "CHECKING_NEW_VERSION": "Перевірка нової версії...", + "CHECK_NEW_VERSION_FAILED": "Перевірка нової версії не вдалася, повтор через %d секунд: %s", + "SWITCH_TO_WIFI_NETWORK": "Перемикання на Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "Перемикання на 4G...", + "STANDBY": "Очікування", + "CONNECT_TO": "Підключитися до ", + "CONNECTING": "Підключення...", + "CONNECTED_TO": "Підключено до ", + "LISTENING": "Прослуховування...", + "SPEAKING": "Говоріння...", + "SERVER_NOT_FOUND": "Пошук доступного сервісу", + "SERVER_NOT_CONNECTED": "Неможливо підключитися до сервісу, спробуйте пізніше", + "SERVER_TIMEOUT": "Час очікування відповіді", + "SERVER_ERROR": "Помилка відправки, перевірте мережу", + "CONNECT_TO_HOTSPOT": "Підключіть телефон до точки доступу ", + "ACCESS_VIA_BROWSER": ",доступ через браузер ", + "WIFI_CONFIG_MODE": "Режим налаштування мережі", + "ENTERING_WIFI_CONFIG_MODE": "Вхід у режим налаштування мережі...", + "SCANNING_WIFI": "Сканування Wi-Fi...", "NEW_VERSION": "Нова версія ", - "OTA_UPGRADE":"Оновлення OTA", - "UPGRADING":"Оновлення системи...", - "UPGRADE_FAILED":"Оновлення не вдалося", - "ACTIVATION":"Активація пристрою", - - "BATTERY_LOW":"Низький заряд батареї", - "BATTERY_CHARGING":"Зарядка", - "BATTERY_FULL":"Батарея повна", - "BATTERY_NEED_CHARGE":"Низький заряд, будь ласка, зарядіть", - - "VOLUME":"Гучність ", - "MUTED":"Звук вимкнено", - "MAX_VOLUME":"Максимальна гучність", - - "RTC_MODE_OFF":"AEC вимкнено", - "RTC_MODE_ON":"AEC увімкнено" + "OTA_UPGRADE": "Оновлення OTA", + "UPGRADING": "Оновлення системи...", + "UPGRADE_FAILED": "Оновлення не вдалося", + "ACTIVATION": "Активація пристрою", + "BATTERY_LOW": "Низький заряд батареї", + "BATTERY_CHARGING": "Зарядка", + "BATTERY_FULL": "Батарея повна", + "BATTERY_NEED_CHARGE": "Низький заряд, будь ласка, зарядіть", + "VOLUME": "Гучність ", + "MUTED": "Звук вимкнено", + "MAX_VOLUME": "Максимальна гучність", + "RTC_MODE_OFF": "AEC вимкнено", + "RTC_MODE_ON": "AEC увімкнено", + "DOWNLOAD_ASSETS_FAILED": "Не вдалося завантажити ресурси", + "LOADING_ASSETS": "Завантаження ресурсів...", + "PLEASE_WAIT": "Будь ласка, зачекайте...", + "FOUND_NEW_ASSETS": "Знайдено нові ресурси: %s", + "HELLO_MY_FRIEND": "Привіт, мій друже!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/vi-VN/language.json b/main/assets/locales/vi-VN/language.json index 8fc7e3cd..e010b7be 100644 --- a/main/assets/locales/vi-VN/language.json +++ b/main/assets/locales/vi-VN/language.json @@ -17,43 +17,40 @@ "CHECK_NEW_VERSION_FAILED": "Kiểm tra phiên bản mới thất bại, sẽ thử lại sau %d giây: %s", "SWITCH_TO_WIFI_NETWORK": "Đang chuyển sang Wi-Fi...", "SWITCH_TO_4G_NETWORK": "Đang chuyển sang 4G...", - "STANDBY": "Chờ", "CONNECT_TO": "Kết nối đến ", "CONNECTING": "Đang kết nối...", "CONNECTION_SUCCESSFUL": "Kết nối thành công", "CONNECTED_TO": "Đã kết nối đến ", - "LISTENING": "Đang lắng nghe...", "SPEAKING": "Đang nói...", - "SERVER_NOT_FOUND": "Đang tìm dịch vụ khả dụng", "SERVER_NOT_CONNECTED": "Không thể kết nối đến dịch vụ, vui lòng thử lại sau", "SERVER_TIMEOUT": "Hết thời gian chờ phản hồi", "SERVER_ERROR": "Gửi thất bại, vui lòng kiểm tra mạng", - "CONNECT_TO_HOTSPOT": "Điểm phát sóng: ", "ACCESS_VIA_BROWSER": " URL cấu hình: ", "WIFI_CONFIG_MODE": "Chế độ cấu hình Wi-Fi", "ENTERING_WIFI_CONFIG_MODE": "Đang vào chế độ cấu hình Wi-Fi...", "SCANNING_WIFI": "Đang quét Wi-Fi...", - "NEW_VERSION": "Phiên bản mới ", "OTA_UPGRADE": "Nâng cấp OTA", "UPGRADING": "Hệ thống đang nâng cấp...", "UPGRADE_FAILED": "Nâng cấp thất bại", "ACTIVATION": "Kích hoạt", - "BATTERY_LOW": "Pin yếu", "BATTERY_CHARGING": "Đang sạc", "BATTERY_FULL": "Pin đầy", "BATTERY_NEED_CHARGE": "Pin yếu, vui lòng sạc", - "VOLUME": "Âm lượng ", "MUTED": "Tắt tiếng", "MAX_VOLUME": "Âm lượng tối đa", - "RTC_MODE_OFF": "Tắt AEC", - "RTC_MODE_ON": "Bật AEC" + "RTC_MODE_ON": "Bật AEC", + "DOWNLOAD_ASSETS_FAILED": "Tải xuống tài nguyên thất bại", + "LOADING_ASSETS": "Đang tải tài nguyên...", + "PLEASE_WAIT": "Vui lòng đợi...", + "FOUND_NEW_ASSETS": "Tìm thấy tài nguyên mới: %s", + "HELLO_MY_FRIEND": "Xin chào, bạn của tôi!" } -} \ No newline at end of file +} \ No newline at end of file diff --git a/main/assets/locales/zh-CN/language.json b/main/assets/locales/zh-CN/language.json index eeb61b4c..9eb619d1 100644 --- a/main/assets/locales/zh-CN/language.json +++ b/main/assets/locales/zh-CN/language.json @@ -1,58 +1,55 @@ { "language": { - "type" :"zh-CN" + "type": "zh-CN" }, "strings": { - "WARNING":"警告", - "INFO":"信息", - "ERROR":"错误", + "WARNING": "警告", + "INFO": "信息", + "ERROR": "错误", "VERSION": "版本 ", - "LOADING_PROTOCOL":"登录服务器...", - "INITIALIZING":"正在初始化...", - "PIN_ERROR":"请插入 SIM 卡", - "REG_ERROR":"无法接入网络,请检查流量卡状态", - "DETECTING_MODULE":"检测模组...", - "REGISTERING_NETWORK":"等待网络...", - "CHECKING_NEW_VERSION":"检查新版本...", - "CHECK_NEW_VERSION_FAILED":"检查新版本失败,将在 %d 秒后重试:%s", - "SWITCH_TO_WIFI_NETWORK":"切换到 Wi-Fi...", - "SWITCH_TO_4G_NETWORK":"切换到 4G...", - - "STANDBY":"待命", - "CONNECT_TO":"连接 ", - "CONNECTING":"连接中...", - "CONNECTED_TO":"已连接 ", - - "LISTENING":"聆听中...", - "SPEAKING":"说话中...", - - "SERVER_NOT_FOUND":"正在寻找可用服务", - "SERVER_NOT_CONNECTED":"无法连接服务,请稍后再试", - "SERVER_TIMEOUT":"等待响应超时", - "SERVER_ERROR":"发送失败,请检查网络", - - "CONNECT_TO_HOTSPOT":"手机连接热点 ", - "ACCESS_VIA_BROWSER":",浏览器访问 ", - "WIFI_CONFIG_MODE":"配网模式", - "ENTERING_WIFI_CONFIG_MODE":"进入配网模式...", - "SCANNING_WIFI":"扫描 Wi-Fi...", - + "LOADING_PROTOCOL": "登录服务器...", + "INITIALIZING": "正在初始化...", + "PIN_ERROR": "请插入 SIM 卡", + "REG_ERROR": "无法接入网络,请检查流量卡状态", + "DETECTING_MODULE": "检测模组...", + "REGISTERING_NETWORK": "等待网络...", + "CHECKING_NEW_VERSION": "检查新版本...", + "CHECK_NEW_VERSION_FAILED": "检查新版本失败,将在 %d 秒后重试:%s", + "SWITCH_TO_WIFI_NETWORK": "切换到 Wi-Fi...", + "SWITCH_TO_4G_NETWORK": "切换到 4G...", + "STANDBY": "待命", + "CONNECT_TO": "连接 ", + "CONNECTING": "连接中...", + "CONNECTED_TO": "已连接 ", + "LISTENING": "聆听中...", + "SPEAKING": "说话中...", + "SERVER_NOT_FOUND": "正在寻找可用服务", + "SERVER_NOT_CONNECTED": "无法连接服务,请稍后再试", + "SERVER_TIMEOUT": "等待响应超时", + "SERVER_ERROR": "发送失败,请检查网络", + "CONNECT_TO_HOTSPOT": "手机连接热点 ", + "ACCESS_VIA_BROWSER": ",浏览器访问 ", + "WIFI_CONFIG_MODE": "配网模式", + "ENTERING_WIFI_CONFIG_MODE": "进入配网模式...", + "SCANNING_WIFI": "扫描 Wi-Fi...", "NEW_VERSION": "新版本 ", - "OTA_UPGRADE":"OTA 升级", - "UPGRADING":"正在升级系统...", - "UPGRADE_FAILED":"升级失败", - "ACTIVATION":"激活设备", - - "BATTERY_LOW":"电量不足", - "BATTERY_CHARGING":"正在充电", - "BATTERY_FULL":"电量已满", - "BATTERY_NEED_CHARGE":"电量低,请充电", - - "VOLUME":"音量 ", - "MUTED":"已静音", - "MAX_VOLUME":"最大音量", - - "RTC_MODE_OFF":"AEC 关闭", - "RTC_MODE_ON":"AEC 开启" + "OTA_UPGRADE": "OTA 升级", + "UPGRADING": "正在升级系统...", + "UPGRADE_FAILED": "升级失败", + "ACTIVATION": "激活设备", + "BATTERY_LOW": "电量不足", + "BATTERY_CHARGING": "正在充电", + "BATTERY_FULL": "电量已满", + "BATTERY_NEED_CHARGE": "电量低,请充电", + "VOLUME": "音量 ", + "MUTED": "已静音", + "MAX_VOLUME": "最大音量", + "RTC_MODE_OFF": "AEC 关闭", + "RTC_MODE_ON": "AEC 开启", + "DOWNLOAD_ASSETS_FAILED": "下载资源失败", + "LOADING_ASSETS": "加载资源...", + "PLEASE_WAIT": "请稍候...", + "FOUND_NEW_ASSETS": "发现新资源: %s", + "HELLO_MY_FRIEND": "你好,我的朋友!" } -} +} \ No newline at end of file diff --git a/main/assets/locales/zh-TW/language.json b/main/assets/locales/zh-TW/language.json index 51175a1c..f035b366 100644 --- a/main/assets/locales/zh-TW/language.json +++ b/main/assets/locales/zh-TW/language.json @@ -17,42 +17,39 @@ "CHECK_NEW_VERSION_FAILED": "檢查新版本失敗,將在 %d 秒後重試:%s", "SWITCH_TO_WIFI_NETWORK": "切換到 Wi-Fi...", "SWITCH_TO_4G_NETWORK": "切換到 4G...", - "STANDBY": "待命", "CONNECT_TO": "連接 ", "CONNECTING": "連接中...", "CONNECTED_TO": "已連接 ", - "LISTENING": "聆聽中...", "SPEAKING": "說話中...", - "SERVER_NOT_FOUND": "正在尋找可用服務", "SERVER_NOT_CONNECTED": "無法連接服務,請稍後再試", "SERVER_TIMEOUT": "等待響應超時", "SERVER_ERROR": "發送失敗,請檢查網絡", - "CONNECT_TO_HOTSPOT": "手機連接WiFi ", "ACCESS_VIA_BROWSER": ",瀏覽器訪問 ", "WIFI_CONFIG_MODE": "網路設定模式", "ENTERING_WIFI_CONFIG_MODE": "正在設定網路...", "SCANNING_WIFI": "掃描 Wi-Fi...", - "NEW_VERSION": "新版本 ", "OTA_UPGRADE": "OTA 升級", "UPGRADING": "正在升級系統...", "UPGRADE_FAILED": "升級失敗", "ACTIVATION": "啟用設備", - "BATTERY_LOW": "電量不足", "BATTERY_CHARGING": "正在充電", "BATTERY_FULL": "電量已滿", "BATTERY_NEED_CHARGE": "電量低,請充電", - "VOLUME": "音量 ", "MUTED": "已靜音", "MAX_VOLUME": "最大音量", - "RTC_MODE_OFF": "AEC 關閉", - "RTC_MODE_ON": "AEC 開啟" + "RTC_MODE_ON": "AEC 開啟", + "DOWNLOAD_ASSETS_FAILED": "下載資源失敗", + "LOADING_ASSETS": "載入資源...", + "PLEASE_WAIT": "請稍候...", + "FOUND_NEW_ASSETS": "發現新資源: %s", + "HELLO_MY_FRIEND": "你好,我的朋友!" } -} +} \ No newline at end of file diff --git a/main/audio/audio_processor.h b/main/audio/audio_processor.h index 266bf99a..543c7ae0 100644 --- a/main/audio/audio_processor.h +++ b/main/audio/audio_processor.h @@ -5,13 +5,14 @@ #include #include +#include #include "audio_codec.h" class AudioProcessor { public: virtual ~AudioProcessor() = default; - virtual void Initialize(AudioCodec* codec, int frame_duration_ms) = 0; + virtual void Initialize(AudioCodec* codec, int frame_duration_ms, srmodel_list_t* models_list) = 0; virtual void Feed(std::vector&& data) = 0; virtual void Start() = 0; virtual void Stop() = 0; diff --git a/main/audio/audio_service.cc b/main/audio/audio_service.cc index 3081e6ad..c819b3a9 100644 --- a/main/audio/audio_service.cc +++ b/main/audio/audio_service.cc @@ -479,7 +479,7 @@ void AudioService::EnableWakeWordDetection(bool enable) { ESP_LOGD(TAG, "%s wake word detection", enable ? "Enabling" : "Disabling"); if (enable) { if (!wake_word_initialized_) { - if (!wake_word_->Initialize(codec_)) { + if (!wake_word_->Initialize(codec_, models_list_)) { ESP_LOGE(TAG, "Failed to initialize wake word"); return; } @@ -497,7 +497,7 @@ void AudioService::EnableVoiceProcessing(bool enable) { ESP_LOGD(TAG, "%s voice processing", enable ? "Enabling" : "Disabling"); if (enable) { if (!audio_processor_initialized_) { - audio_processor_->Initialize(codec_, OPUS_FRAME_DURATION_MS); + audio_processor_->Initialize(codec_, OPUS_FRAME_DURATION_MS, models_list_); audio_processor_initialized_ = true; } @@ -528,7 +528,7 @@ void AudioService::EnableAudioTesting(bool enable) { void AudioService::EnableDeviceAec(bool enable) { ESP_LOGI(TAG, "%s device AEC", enable ? "Enabling" : "Disabling"); if (!audio_processor_initialized_) { - audio_processor_->Initialize(codec_, OPUS_FRAME_DURATION_MS); + audio_processor_->Initialize(codec_, OPUS_FRAME_DURATION_MS, models_list_); audio_processor_initialized_ = true; } @@ -666,4 +666,8 @@ void AudioService::CheckAndUpdateAudioPowerState() { if (!codec_->input_enabled() && !codec_->output_enabled()) { esp_timer_stop(audio_power_timer_); } +} + +void AudioService::SetModelsList(srmodel_list_t* models_list) { + models_list_ = models_list; } \ No newline at end of file diff --git a/main/audio/audio_service.h b/main/audio/audio_service.h index 62859626..7ecf9eb2 100644 --- a/main/audio/audio_service.h +++ b/main/audio/audio_service.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -106,6 +107,7 @@ public: void PlaySound(const std::string_view& sound); bool ReadAudioData(std::vector& data, int sample_rate, int samples); void ResetDecoder(); + void SetModelsList(srmodel_list_t* models_list); private: AudioCodec* codec_ = nullptr; @@ -119,6 +121,7 @@ private: OpusResampler reference_resampler_; OpusResampler output_resampler_; DebugStatistics debug_statistics_; + srmodel_list_t* models_list_ = nullptr; EventGroupHandle_t event_group_; diff --git a/main/audio/processors/afe_audio_processor.cc b/main/audio/processors/afe_audio_processor.cc index 4462f9e2..a9145bed 100644 --- a/main/audio/processors/afe_audio_processor.cc +++ b/main/audio/processors/afe_audio_processor.cc @@ -10,7 +10,7 @@ AfeAudioProcessor::AfeAudioProcessor() event_group_ = xEventGroupCreate(); } -void AfeAudioProcessor::Initialize(AudioCodec* codec, int frame_duration_ms) { +void AfeAudioProcessor::Initialize(AudioCodec* codec, int frame_duration_ms, srmodel_list_t* models_list) { codec_ = codec; frame_samples_ = frame_duration_ms * 16000 / 1000; @@ -27,7 +27,13 @@ void AfeAudioProcessor::Initialize(AudioCodec* codec, int frame_duration_ms) { input_format.push_back('R'); } - srmodel_list_t *models = esp_srmodel_init("model"); + srmodel_list_t *models; + if (models_list == nullptr) { + models = esp_srmodel_init("model"); + } else { + models = models_list; + } + char* ns_model_name = esp_srmodel_filter(models, ESP_NSNET_PREFIX, NULL); char* vad_model_name = esp_srmodel_filter(models, ESP_VADN_PREFIX, NULL); diff --git a/main/audio/processors/afe_audio_processor.h b/main/audio/processors/afe_audio_processor.h index b4a378ad..38b1dad3 100644 --- a/main/audio/processors/afe_audio_processor.h +++ b/main/audio/processors/afe_audio_processor.h @@ -18,7 +18,7 @@ public: AfeAudioProcessor(); ~AfeAudioProcessor(); - void Initialize(AudioCodec* codec, int frame_duration_ms) override; + void Initialize(AudioCodec* codec, int frame_duration_ms, srmodel_list_t* models_list) override; void Feed(std::vector&& data) override; void Start() override; void Stop() override; diff --git a/main/audio/processors/no_audio_processor.cc b/main/audio/processors/no_audio_processor.cc index df0dc0be..bac5bad6 100644 --- a/main/audio/processors/no_audio_processor.cc +++ b/main/audio/processors/no_audio_processor.cc @@ -3,7 +3,7 @@ #define TAG "NoAudioProcessor" -void NoAudioProcessor::Initialize(AudioCodec* codec, int frame_duration_ms) { +void NoAudioProcessor::Initialize(AudioCodec* codec, int frame_duration_ms, srmodel_list_t* models_list) { codec_ = codec; frame_samples_ = frame_duration_ms * 16000 / 1000; } diff --git a/main/audio/processors/no_audio_processor.h b/main/audio/processors/no_audio_processor.h index d77dfdc2..d326d505 100644 --- a/main/audio/processors/no_audio_processor.h +++ b/main/audio/processors/no_audio_processor.h @@ -12,7 +12,7 @@ public: NoAudioProcessor() = default; ~NoAudioProcessor() = default; - void Initialize(AudioCodec* codec, int frame_duration_ms) override; + void Initialize(AudioCodec* codec, int frame_duration_ms, srmodel_list_t* models_list) override; void Feed(std::vector&& data) override; void Start() override; void Stop() override; diff --git a/main/audio/wake_word.h b/main/audio/wake_word.h index 71138f71..9b8986ac 100644 --- a/main/audio/wake_word.h +++ b/main/audio/wake_word.h @@ -5,13 +5,14 @@ #include #include +#include #include "audio_codec.h" class WakeWord { public: virtual ~WakeWord() = default; - virtual bool Initialize(AudioCodec* codec) = 0; + virtual bool Initialize(AudioCodec* codec, srmodel_list_t* models_list) = 0; virtual void Feed(const std::vector& data) = 0; virtual void OnWakeWordDetected(std::function callback) = 0; virtual void Start() = 0; diff --git a/main/audio/wake_words/afe_wake_word.cc b/main/audio/wake_words/afe_wake_word.cc index debbe6f3..bcdc697c 100644 --- a/main/audio/wake_words/afe_wake_word.cc +++ b/main/audio/wake_words/afe_wake_word.cc @@ -36,11 +36,16 @@ AfeWakeWord::~AfeWakeWord() { vEventGroupDelete(event_group_); } -bool AfeWakeWord::Initialize(AudioCodec* codec) { +bool AfeWakeWord::Initialize(AudioCodec* codec, srmodel_list_t* models_list) { codec_ = codec; int ref_num = codec_->input_reference() ? 1 : 0; - models_ = esp_srmodel_init("model"); + if (models_list == nullptr) { + models_ = esp_srmodel_init("model"); + } else { + models_ = models_list; + } + if (models_ == nullptr || models_->num == -1) { ESP_LOGE(TAG, "Failed to initialize wakenet model"); return false; diff --git a/main/audio/wake_words/afe_wake_word.h b/main/audio/wake_words/afe_wake_word.h index ca8c6767..65ac1f82 100644 --- a/main/audio/wake_words/afe_wake_word.h +++ b/main/audio/wake_words/afe_wake_word.h @@ -24,7 +24,7 @@ public: AfeWakeWord(); ~AfeWakeWord(); - bool Initialize(AudioCodec* codec); + bool Initialize(AudioCodec* codec, srmodel_list_t* models_list); void Feed(const std::vector& data); void OnWakeWordDetected(std::function callback); void Start(); diff --git a/main/audio/wake_words/custom_wake_word.cc b/main/audio/wake_words/custom_wake_word.cc index e0478919..7c7f3fb3 100644 --- a/main/audio/wake_words/custom_wake_word.cc +++ b/main/audio/wake_words/custom_wake_word.cc @@ -34,10 +34,15 @@ CustomWakeWord::~CustomWakeWord() { } } -bool CustomWakeWord::Initialize(AudioCodec* codec) { +bool CustomWakeWord::Initialize(AudioCodec* codec, srmodel_list_t* models_list) { codec_ = codec; - models_ = esp_srmodel_init("model"); + if (models_list == nullptr) { + models_ = esp_srmodel_init("model"); + } else { + models_ = models_list; + } + if (models_ == nullptr || models_->num == -1) { ESP_LOGE(TAG, "Failed to initialize wakenet model"); return false; diff --git a/main/audio/wake_words/custom_wake_word.h b/main/audio/wake_words/custom_wake_word.h index 824d7fd1..e7157470 100644 --- a/main/audio/wake_words/custom_wake_word.h +++ b/main/audio/wake_words/custom_wake_word.h @@ -22,7 +22,7 @@ public: CustomWakeWord(); ~CustomWakeWord(); - bool Initialize(AudioCodec* codec); + bool Initialize(AudioCodec* codec, srmodel_list_t* models_list); void Feed(const std::vector& data); void OnWakeWordDetected(std::function callback); void Start(); diff --git a/main/audio/wake_words/esp_wake_word.cc b/main/audio/wake_words/esp_wake_word.cc index 79d9ad80..d4aaf9d0 100644 --- a/main/audio/wake_words/esp_wake_word.cc +++ b/main/audio/wake_words/esp_wake_word.cc @@ -14,10 +14,15 @@ EspWakeWord::~EspWakeWord() { } } -bool EspWakeWord::Initialize(AudioCodec* codec) { +bool EspWakeWord::Initialize(AudioCodec* codec, srmodel_list_t* models_list) { codec_ = codec; - wakenet_model_ = esp_srmodel_init("model"); + if (models_list == nullptr) { + wakenet_model_ = esp_srmodel_init("model"); + } else { + wakenet_model_ = models_list; + } + if (wakenet_model_ == nullptr || wakenet_model_->num == -1) { ESP_LOGE(TAG, "Failed to initialize wakenet model"); return false; diff --git a/main/audio/wake_words/esp_wake_word.h b/main/audio/wake_words/esp_wake_word.h index 475ec2dc..9a1d73aa 100644 --- a/main/audio/wake_words/esp_wake_word.h +++ b/main/audio/wake_words/esp_wake_word.h @@ -18,7 +18,7 @@ public: EspWakeWord(); ~EspWakeWord(); - bool Initialize(AudioCodec* codec); + bool Initialize(AudioCodec* codec, srmodel_list_t* models_list); void Feed(const std::vector& data); void OnWakeWordDetected(std::function callback); void Start(); diff --git a/main/boards/README.md b/main/boards/README.md index bb14eab7..800d5d04 100644 --- a/main/boards/README.md +++ b/main/boards/README.md @@ -98,7 +98,7 @@ mkdir main/boards/my-custom-board "sdkconfig_append": [ // 额外需要的编译配置 "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", - "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/8m.csv\"" + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"" ] } ] @@ -132,8 +132,8 @@ mkdir main/boards/my-custom-board #define TAG "MyCustomBoard" // 声明字体 -LV_FONT_DECLARE(font_puhui_16_4); -LV_FONT_DECLARE(font_awesome_16_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); +LV_FONT_DECLARE(font_awesome_20_4); class MyCustomBoard : public WifiBoard { private: @@ -213,11 +213,7 @@ private: DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } // MCP Tools 初始化 @@ -236,6 +232,12 @@ public: GetBacklight()->SetBrightness(100); } + // 动态加载资源文件(包括字体、唤醒词、表情包) + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + // 获取音频编解码器 virtual AudioCodec* GetAudioCodec() override { static Es8311AudioCodec audio_codec( diff --git a/main/boards/atk-dnesp32s3-box/atk_dnesp32s3_box.cc b/main/boards/atk-dnesp32s3-box/atk_dnesp32s3_box.cc index 9f561e6f..94a82c36 100644 --- a/main/boards/atk-dnesp32s3-box/atk_dnesp32s3_box.cc +++ b/main/boards/atk-dnesp32s3-box/atk_dnesp32s3_box.cc @@ -20,7 +20,7 @@ #define TAG "atk_dnesp32s3_box" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); @@ -244,15 +244,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - #if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), - #else - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), - #endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeButtons() { @@ -274,6 +266,11 @@ public: InitializeButtons(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { /* 根据探测结果初始化编解码器 */ if (es8311_detected_) { diff --git a/main/boards/atk-dnesp32s3-box0/atk_dnesp32s3_box0.cc b/main/boards/atk-dnesp32s3-box0/atk_dnesp32s3_box0.cc index f5752d2f..c3b45a0a 100644 --- a/main/boards/atk-dnesp32s3-box0/atk_dnesp32s3_box0.cc +++ b/main/boards/atk-dnesp32s3-box0/atk_dnesp32s3_box0.cc @@ -20,7 +20,7 @@ #define TAG "atk_dnesp32s3_box0" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); class atk_dnesp32s3_box0 : public WifiBoard { @@ -326,11 +326,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -348,6 +344,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8311AudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/atk-dnesp32s3-box2-4g/atk_dnesp32s3_box2.cc b/main/boards/atk-dnesp32s3-box2-4g/atk_dnesp32s3_box2.cc index a93e229e..cb46b3e6 100644 --- a/main/boards/atk-dnesp32s3-box2-4g/atk_dnesp32s3_box2.cc +++ b/main/boards/atk-dnesp32s3-box2-4g/atk_dnesp32s3_box2.cc @@ -21,7 +21,7 @@ #define TAG "atk_dnesp32s3_box2_4g" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); class atk_dnesp32s3_box2_4g : public DualNetworkBoard { @@ -413,11 +413,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -433,6 +429,11 @@ public: InitializeBoardPowerManager(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8389AudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/atk-dnesp32s3-box2-wifi/atk_dnesp32s3_box2.cc b/main/boards/atk-dnesp32s3-box2-wifi/atk_dnesp32s3_box2.cc index be9265ea..8276684d 100644 --- a/main/boards/atk-dnesp32s3-box2-wifi/atk_dnesp32s3_box2.cc +++ b/main/boards/atk-dnesp32s3-box2-wifi/atk_dnesp32s3_box2.cc @@ -21,7 +21,7 @@ #define TAG "atk_dnesp32s3_box2_wifi" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); class atk_dnesp32s3_box2_wifi : public WifiBoard { @@ -393,11 +393,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -412,6 +408,11 @@ public: InitializeBoardPowerManager(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8389AudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/atk-dnesp32s3/atk_dnesp32s3.cc b/main/boards/atk-dnesp32s3/atk_dnesp32s3.cc index 73470e11..7d7bc278 100644 --- a/main/boards/atk-dnesp32s3/atk_dnesp32s3.cc +++ b/main/boards/atk-dnesp32s3/atk_dnesp32s3.cc @@ -16,7 +16,7 @@ #define TAG "atk_dnesp32s3" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); class XL9555 : public I2cDevice { @@ -132,15 +132,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - #if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), - #else - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), - #endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } // 初始化摄像头:ov2640; @@ -209,6 +201,11 @@ public: InitializeCamera(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/atk-dnesp32s3m-4g/atk_dnesp32s3m.cc b/main/boards/atk-dnesp32s3m-4g/atk_dnesp32s3m.cc index 1a60ca96..ba287950 100644 --- a/main/boards/atk-dnesp32s3m-4g/atk_dnesp32s3m.cc +++ b/main/boards/atk-dnesp32s3m-4g/atk_dnesp32s3m.cc @@ -20,7 +20,7 @@ #define TAG "atk_dnesp32s3m_4g" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class atk_dnesp32s3m_4g : public Ml307Board { @@ -168,11 +168,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } public: @@ -190,6 +186,11 @@ public: } } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/atk-dnesp32s3m-wifi/atk_dnesp32s3m.cc b/main/boards/atk-dnesp32s3m-wifi/atk_dnesp32s3m.cc index 92b5945e..2146e00e 100644 --- a/main/boards/atk-dnesp32s3m-wifi/atk_dnesp32s3m.cc +++ b/main/boards/atk-dnesp32s3m-wifi/atk_dnesp32s3m.cc @@ -19,7 +19,7 @@ #define TAG "atk_dnesp32s3m_wifi" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class atk_dnesp32s3m_wifi : public WifiBoard { @@ -178,11 +178,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } public: @@ -200,6 +196,11 @@ public: } } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/atom-echos3r/README.md b/main/boards/atom-echos3r/README.md index 5340cdfe..ccb452f4 100644 --- a/main/boards/atom-echos3r/README.md +++ b/main/boards/atom-echos3r/README.md @@ -22,7 +22,7 @@ idf.py menuconfig 分别配置如下选项: - `Xiaozhi Assistant` → `Board Type` → 选择 `AtomEchoS3R` -- `Partition Table` → `Custom partition CSV file` → 删除原有内容,输入 `partitions/v1/8m.csv` +- `Partition Table` → `Custom partition CSV file` → 删除原有内容,输入 `partitions/v2/8m.csv` - `Serial flasher config` → `Flash size` → 选择 `8 MB` - `Component config` → `ESP PSRAM` → `Support for external, SPI-connected RAM` → `SPI RAM config` → 选择 `Octal Mode PSRAM` diff --git a/main/boards/atom-echos3r/atom_echos3r.cc b/main/boards/atom-echos3r/atom_echos3r.cc index 7f6ff675..22103d98 100644 --- a/main/boards/atom-echos3r/atom_echos3r.cc +++ b/main/boards/atom-echos3r/atom_echos3r.cc @@ -71,6 +71,11 @@ public: InitializeButtons(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_WAKENET); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8311AudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/atom-echos3r/config.json b/main/boards/atom-echos3r/config.json index ca1367ea..7e7328d5 100644 --- a/main/boards/atom-echos3r/config.json +++ b/main/boards/atom-echos3r/config.json @@ -5,7 +5,7 @@ "name": "atom-echos3r", "sdkconfig_append": [ "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", - "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/8m.csv\"" + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"" ] } ] diff --git a/main/boards/atoms3-echo-base/README.md b/main/boards/atoms3-echo-base/README.md index 9e1a4079..ef2ad28b 100644 --- a/main/boards/atoms3-echo-base/README.md +++ b/main/boards/atoms3-echo-base/README.md @@ -33,7 +33,7 @@ Serial flasher config -> Flash size -> 8 MB **修改分区表:** ``` -Partition Table -> Custom partition CSV file -> partitions/v1/8m.csv +Partition Table -> Custom partition CSV file -> partitions/v2/8m.csv ``` **关闭片外 PSRAM:** diff --git a/main/boards/atoms3-echo-base/atoms3_echo_base.cc b/main/boards/atoms3-echo-base/atoms3_echo_base.cc index 3c56aef2..f288b9dd 100644 --- a/main/boards/atoms3-echo-base/atoms3_echo_base.cc +++ b/main/boards/atoms3-echo-base/atoms3_echo_base.cc @@ -16,7 +16,7 @@ #define TAG "AtomS3+EchoBase" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); static const gc9a01_lcd_init_cmd_t gc9107_lcd_init_cmds[] = { @@ -179,11 +179,7 @@ private: display_ = new SpiLcdDisplay(io_handle, panel_handle, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void InitializeButtons() { @@ -207,6 +203,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8311AudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/atoms3-echo-base/config.json b/main/boards/atoms3-echo-base/config.json index dd3ddbfa..69bcafc5 100644 --- a/main/boards/atoms3-echo-base/config.json +++ b/main/boards/atoms3-echo-base/config.json @@ -7,7 +7,7 @@ "CONFIG_SPIRAM=n", "CONFIG_USE_AFE=n", "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", - "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/8m.csv\"" + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"" ] } ] diff --git a/main/boards/atoms3r-cam-m12-echo-base/README.md b/main/boards/atoms3r-cam-m12-echo-base/README.md index 2083779f..6da32806 100644 --- a/main/boards/atoms3r-cam-m12-echo-base/README.md +++ b/main/boards/atoms3r-cam-m12-echo-base/README.md @@ -32,7 +32,7 @@ idf.py menuconfig - `Xiaozhi Assistant` → `Board Type` → 选择 `AtomS3R CAM/M12 + Echo Base` - `Xiaozhi Assistant` → `IoT Protocol` → 选择 `MCP协议` 可开启摄像头识别功能 -- `Partition Table` → `Custom partition CSV file` → 删除原有内容,输入 `partitions/v1/8m.csv` +- `Partition Table` → `Custom partition CSV file` → 删除原有内容,输入 `partitions/v2/8m.csv` - `Serial flasher config` → `Flash size` → 选择 `8 MB` 按 `S` 保存,按 `Q` 退出。 diff --git a/main/boards/atoms3r-cam-m12-echo-base/atoms3r_cam_m12_echo_base.cc b/main/boards/atoms3r-cam-m12-echo-base/atoms3r_cam_m12_echo_base.cc index f7acca00..5e55782e 100644 --- a/main/boards/atoms3r-cam-m12-echo-base/atoms3r_cam_m12_echo_base.cc +++ b/main/boards/atoms3r-cam-m12-echo-base/atoms3r_cam_m12_echo_base.cc @@ -169,6 +169,11 @@ public: InitializePi4ioe(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_WAKENET); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8311AudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/atoms3r-cam-m12-echo-base/config.json b/main/boards/atoms3r-cam-m12-echo-base/config.json index 26f88b7f..b8d66299 100644 --- a/main/boards/atoms3r-cam-m12-echo-base/config.json +++ b/main/boards/atoms3r-cam-m12-echo-base/config.json @@ -5,7 +5,7 @@ "name": "atoms3r-cam-m12-echo-base", "sdkconfig_append": [ "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", - "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/8m.csv\"" + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"" ] } ] diff --git a/main/boards/atoms3r-echo-base/README.md b/main/boards/atoms3r-echo-base/README.md index 820c60fa..13e8a36f 100644 --- a/main/boards/atoms3r-echo-base/README.md +++ b/main/boards/atoms3r-echo-base/README.md @@ -27,7 +27,7 @@ Serial flasher config -> Flash size -> 8 MB **修改分区表:** ``` -Partition Table -> Custom partition CSV file -> partitions/v1/8m.csv +Partition Table -> Custom partition CSV file -> partitions/v2/8m.csv ``` **修改 psram 配置:** diff --git a/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc b/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc index d1b27b7a..e105ce12 100644 --- a/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc +++ b/main/boards/atoms3r-echo-base/atoms3r_echo_base.cc @@ -23,7 +23,7 @@ #define PI4IOE_REG_IO_OUT 0x05 #define PI4IOE_REG_IO_PULLUP 0x0D -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class Pi4ioe : public I2cDevice { @@ -114,6 +114,7 @@ private: Display* display_ = nullptr; Button boot_button_; bool is_echo_base_connected_ = false; + void InitializeI2c() { // Initialize I2C peripheral i2c_master_bus_config_t i2c_bus_cfg = { @@ -255,11 +256,7 @@ private: display_ = new SpiLcdDisplay(io_handle, panel_handle, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void InitializeButtons() { @@ -285,6 +282,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8311AudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/atoms3r-echo-base/config.json b/main/boards/atoms3r-echo-base/config.json index 8862a63a..d3b1549f 100644 --- a/main/boards/atoms3r-echo-base/config.json +++ b/main/boards/atoms3r-echo-base/config.json @@ -5,7 +5,7 @@ "name": "atoms3r-echo-base", "sdkconfig_append": [ "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", - "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/8m.csv\"" + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"" ] } ] diff --git a/main/boards/bread-compact-esp32-lcd/esp32_bread_board_lcd.cc b/main/boards/bread-compact-esp32-lcd/esp32_bread_board_lcd.cc index bd212491..a1ecd8c7 100644 --- a/main/boards/bread-compact-esp32-lcd/esp32_bread_board_lcd.cc +++ b/main/boards/bread-compact-esp32-lcd/esp32_bread_board_lcd.cc @@ -125,11 +125,7 @@ private: #endif 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, - { - .text_font = &font_puhui_14_1, - .icon_font = &font_awesome_14_1, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_14_1, &font_awesome_14_1, new Twemoji32()}); } diff --git a/main/boards/bread-compact-ml307/compact_ml307_board.cc b/main/boards/bread-compact-ml307/compact_ml307_board.cc index e91a1d0e..78cf063f 100644 --- a/main/boards/bread-compact-ml307/compact_ml307_board.cc +++ b/main/boards/bread-compact-ml307/compact_ml307_board.cc @@ -18,7 +18,7 @@ #define TAG "CompactMl307Board" -LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_puhui_basic_14_1); LV_FONT_DECLARE(font_awesome_14_1); class CompactMl307Board : public DualNetworkBoard { @@ -93,7 +93,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_, true)); display_ = new OledDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, - {&font_puhui_14_1, &font_awesome_14_1}); + {&font_puhui_basic_14_1, &font_awesome_14_1}); } void InitializeButtons() { @@ -171,6 +171,11 @@ public: InitializeTools(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_14_1); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/bread-compact-wifi-lcd/compact_wifi_board_lcd.cc b/main/boards/bread-compact-wifi-lcd/compact_wifi_board_lcd.cc index da6112c2..df4d272f 100644 --- a/main/boards/bread-compact-wifi-lcd/compact_wifi_board_lcd.cc +++ b/main/boards/bread-compact-wifi-lcd/compact_wifi_board_lcd.cc @@ -60,7 +60,7 @@ static const gc9a01_lcd_init_cmd_t gc9107_lcd_init_cmds[] = { #define TAG "CompactWifiBoardLCD" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class CompactWifiBoardLCD : public WifiBoard { @@ -125,15 +125,7 @@ private: #endif 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), -#endif - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } @@ -166,6 +158,11 @@ public: } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/bread-compact-wifi-s3cam/compact_wifi_board_s3cam.cc b/main/boards/bread-compact-wifi-s3cam/compact_wifi_board_s3cam.cc index 45115408..e0be492a 100644 --- a/main/boards/bread-compact-wifi-s3cam/compact_wifi_board_s3cam.cc +++ b/main/boards/bread-compact-wifi-s3cam/compact_wifi_board_s3cam.cc @@ -61,7 +61,7 @@ static const gc9a01_lcd_init_cmd_t gc9107_lcd_init_cmds[] = { #define TAG "CompactWifiBoardS3Cam" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class CompactWifiBoardS3Cam : public WifiBoard { @@ -127,15 +127,7 @@ private: #endif 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), -#endif - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void InitializeCamera() { @@ -191,6 +183,11 @@ public: } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_64); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/bread-compact-wifi/compact_wifi_board.cc b/main/boards/bread-compact-wifi/compact_wifi_board.cc index 25536af2..01878403 100644 --- a/main/boards/bread-compact-wifi/compact_wifi_board.cc +++ b/main/boards/bread-compact-wifi/compact_wifi_board.cc @@ -22,7 +22,7 @@ #define TAG "CompactWifiBoard" -LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_puhui_basic_14_1); LV_FONT_DECLARE(font_awesome_14_1); class CompactWifiBoard : public WifiBoard { @@ -102,7 +102,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_, true)); display_ = new OledDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, - {&font_puhui_14_1, &font_awesome_14_1}); + {&font_puhui_basic_14_1, &font_awesome_14_1}); } void InitializeButtons() { @@ -168,6 +168,11 @@ public: InitializeTools(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_14_1); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/common/board.cc b/main/boards/common/board.cc index ccdf2903..2443bf2e 100644 --- a/main/boards/common/board.cc +++ b/main/boards/common/board.cc @@ -66,7 +66,7 @@ Led* Board::GetLed() { return &led; } -std::string Board::GetJson() { +std::string Board::GetSystemInfoJson() { /* { "version": 2, @@ -159,4 +159,8 @@ std::string Board::GetJson() { // Close the JSON object json += R"(})"; return json; +} + +Assets* Board::GetAssets() { + return nullptr; } \ No newline at end of file diff --git a/main/boards/common/board.h b/main/boards/common/board.h index a095cf17..db04b037 100644 --- a/main/boards/common/board.h +++ b/main/boards/common/board.h @@ -11,6 +11,8 @@ #include "led/led.h" #include "backlight.h" #include "camera.h" +#include "assets.h" + void* create_board(); class AudioCodec; @@ -46,10 +48,11 @@ public: virtual void StartNetwork() = 0; virtual const char* GetNetworkStateIcon() = 0; virtual bool GetBatteryLevel(int &level, bool& charging, bool& discharging); - virtual std::string GetJson(); + virtual std::string GetSystemInfoJson(); virtual void SetPowerSaveMode(bool enabled) = 0; virtual std::string GetBoardJson() = 0; virtual std::string GetDeviceStatusJson() = 0; + virtual Assets* GetAssets(); }; #define DECLARE_BOARD(BOARD_CLASS_NAME) \ diff --git a/main/boards/common/esp32_camera.cc b/main/boards/common/esp32_camera.cc index 68bde38a..c274b167 100644 --- a/main/boards/common/esp32_camera.cc +++ b/main/boards/common/esp32_camera.cc @@ -23,48 +23,6 @@ Esp32Camera::Esp32Camera(const camera_config_t& config) { if (s->id.PID == GC0308_PID) { s->set_hmirror(s, 0); // 这里控制摄像头镜像 写1镜像 写0不镜像 } - - // 初始化预览图片的内存 - memset(&preview_image_, 0, sizeof(preview_image_)); - preview_image_.header.magic = LV_IMAGE_HEADER_MAGIC; - preview_image_.header.cf = LV_COLOR_FORMAT_RGB565; - preview_image_.header.flags = 0; - - switch (config.frame_size) { - case FRAMESIZE_SVGA: - preview_image_.header.w = 800; - preview_image_.header.h = 600; - break; - case FRAMESIZE_VGA: - preview_image_.header.w = 640; - preview_image_.header.h = 480; - break; - case FRAMESIZE_QVGA: - preview_image_.header.w = 320; - preview_image_.header.h = 240; - break; - case FRAMESIZE_128X128: - preview_image_.header.w = 128; - preview_image_.header.h = 128; - break; - case FRAMESIZE_240X240: - preview_image_.header.w = 240; - preview_image_.header.h = 240; - break; - default: - ESP_LOGE(TAG, "Unsupported frame size: %d, image preview will not be shown", config.frame_size); - preview_image_.data_size = 0; - preview_image_.data = nullptr; - return; - } - - preview_image_.header.stride = preview_image_.header.w * 2; - preview_image_.data_size = preview_image_.header.w * preview_image_.header.h * 2; - preview_image_.data = (uint8_t*)heap_caps_malloc(preview_image_.data_size, MALLOC_CAP_SPIRAM); - if (preview_image_.data == nullptr) { - ESP_LOGE(TAG, "Failed to allocate memory for preview image"); - return; - } } Esp32Camera::~Esp32Camera() { @@ -72,10 +30,6 @@ Esp32Camera::~Esp32Camera() { esp_camera_fb_return(fb_); fb_ = nullptr; } - if (preview_image_.data) { - heap_caps_free((void*)preview_image_.data); - preview_image_.data = nullptr; - } esp_camera_deinit(); } @@ -105,27 +59,33 @@ bool Esp32Camera::Capture() { auto end_time = esp_timer_get_time(); ESP_LOGI(TAG, "Camera captured %d frames in %d ms", frames_to_get, int((end_time - start_time) / 1000)); - // 如果预览图片 buffer 为空,则跳过预览 - // 但仍返回 true,因为此时图像可以上传至服务器 - if (preview_image_.data_size == 0) { - ESP_LOGW(TAG, "Skip preview because of unsupported frame size"); - return true; - } - if (preview_image_.data == nullptr) { - ESP_LOGE(TAG, "Preview image data is not initialized"); - return true; - } // 显示预览图片 auto display = Board::GetInstance().GetDisplay(); if (display != nullptr) { + // Create a new preview image + auto img_dsc = (lv_img_dsc_t*)heap_caps_calloc(1, sizeof(lv_img_dsc_t), MALLOC_CAP_8BIT); + img_dsc->header.magic = LV_IMAGE_HEADER_MAGIC; + img_dsc->header.cf = LV_COLOR_FORMAT_RGB565; + img_dsc->header.flags = 0; + img_dsc->header.w = fb_->width; + img_dsc->header.h = fb_->height; + img_dsc->header.stride = fb_->width * 2; + img_dsc->data_size = fb_->width * fb_->height * 2; + img_dsc->data = (uint8_t*)heap_caps_malloc(img_dsc->data_size, MALLOC_CAP_SPIRAM); + if (img_dsc->data == nullptr) { + ESP_LOGE(TAG, "Failed to allocate memory for preview image"); + heap_caps_free(img_dsc); + return false; + } + auto src = (uint16_t*)fb_->buf; - auto dst = (uint16_t*)preview_image_.data; + auto dst = (uint16_t*)img_dsc->data; size_t pixel_count = fb_->len / 2; for (size_t i = 0; i < pixel_count; i++) { // 交换每个16位字内的字节 dst[i] = __builtin_bswap16(src[i]); } - display->SetPreviewImage(&preview_image_); + display->SetPreviewImage(img_dsc); } return true; } @@ -188,14 +148,14 @@ bool Esp32Camera::SetVFlip(bool enabled) { */ std::string Esp32Camera::Explain(const std::string& question) { if (explain_url_.empty()) { - return "{\"success\": false, \"message\": \"Image explain URL or token is not set\"}"; + throw std::runtime_error("Image explain URL or token is not set"); } // 创建局部的 JPEG 队列, 40 entries is about to store 512 * 40 = 20480 bytes of JPEG data QueueHandle_t jpeg_queue = xQueueCreate(40, sizeof(JpegChunk)); if (jpeg_queue == nullptr) { ESP_LOGE(TAG, "Failed to create JPEG queue"); - return "{\"success\": false, \"message\": \"Failed to create JPEG queue\"}"; + throw std::runtime_error("Failed to create JPEG queue"); } // We spawn a thread to encode the image to JPEG @@ -238,7 +198,7 @@ std::string Esp32Camera::Explain(const std::string& question) { } } vQueueDelete(jpeg_queue); - return "{\"success\": false, \"message\": \"Failed to connect to explain URL\"}"; + throw std::runtime_error("Failed to connect to explain URL"); } { @@ -291,7 +251,7 @@ std::string Esp32Camera::Explain(const std::string& question) { if (http->GetStatusCode() != 200) { ESP_LOGE(TAG, "Failed to upload photo, status code: %d", http->GetStatusCode()); - return "{\"success\": false, \"message\": \"Failed to upload photo\"}"; + throw std::runtime_error("Failed to upload photo"); } std::string result = http->ReadAll(); diff --git a/main/boards/common/esp32_camera.h b/main/boards/common/esp32_camera.h index dc64c731..7d5c63fe 100644 --- a/main/boards/common/esp32_camera.h +++ b/main/boards/common/esp32_camera.h @@ -19,7 +19,6 @@ struct JpegChunk { class Esp32Camera : public Camera { private: camera_fb_t* fb_ = nullptr; - lv_img_dsc_t preview_image_; std::string explain_url_; std::string explain_token_; std::thread encoder_thread_; diff --git a/main/boards/df-k10/df_k10_board.cc b/main/boards/df-k10/df_k10_board.cc index 36ca006a..ca17c66e 100644 --- a/main/boards/df-k10/df_k10_board.cc +++ b/main/boards/df-k10/df_k10_board.cc @@ -21,7 +21,7 @@ #define TAG "DF-K10" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); class Df_K10Board : public WifiBoard { @@ -104,6 +104,7 @@ private: ESP_LOGE(TAG, "Set direction failed: %s", esp_err_to_name(ret)); } } + void InitializeButtons() { instance_ = this; @@ -234,11 +235,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } // 物联网初始化,添加对 AI 可见设备 @@ -258,7 +255,12 @@ public: InitializeCamera(); } - virtual Led* GetLed() override { + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + + virtual Led* GetLed() override { return led_strip_; } diff --git a/main/boards/df-s3-ai-cam/df_s3_ai_cam.cc b/main/boards/df-s3-ai-cam/df_s3_ai_cam.cc index 855f055f..7b6942c2 100644 --- a/main/boards/df-s3-ai-cam/df_s3_ai_cam.cc +++ b/main/boards/df-s3-ai-cam/df_s3_ai_cam.cc @@ -69,6 +69,12 @@ class DfrobotEsp32S3AiCam : public WifiBoard { InitializeCamera(); } + // Wakenet model only + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_WAKENET); + return &assets; + } + virtual Led* GetLed() override { static GpioLed led(BUILTIN_LED_GPIO, 0); return &led; diff --git a/main/boards/doit-s3-aibox/doit_s3_aibox.cc b/main/boards/doit-s3-aibox/doit_s3_aibox.cc index 04da3bac..81efaf7e 100644 --- a/main/boards/doit-s3-aibox/doit_s3_aibox.cc +++ b/main/boards/doit-s3-aibox/doit_s3_aibox.cc @@ -123,6 +123,11 @@ public: InitializeButtons(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_WAKENET); + return &assets; + } + virtual Led* GetLed() override { static GpioLed led(BUILTIN_LED_GPIO, 1); return &led; diff --git a/main/boards/du-chatx/du-chatx-wifi.cc b/main/boards/du-chatx/du-chatx-wifi.cc index a1f2e16a..40e26951 100644 --- a/main/boards/du-chatx/du-chatx-wifi.cc +++ b/main/boards/du-chatx/du-chatx-wifi.cc @@ -19,7 +19,7 @@ #define TAG "DuChatX" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class DuChatX : public WifiBoard { @@ -102,11 +102,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void InitializeButtons() { @@ -130,6 +126,11 @@ public: InitializePowerManager(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual Led *GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/echoear/EchoEar.cc b/main/boards/echoear/EchoEar.cc index 6c417a08..5e13627e 100644 --- a/main/boards/echoear/EchoEar.cc +++ b/main/boards/echoear/EchoEar.cc @@ -562,11 +562,8 @@ private: #if USE_LVGL_DEFAULT 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, { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, + {&font_puhui_20_4, &font_awesome_20_4, new Twemoji64()}); #else display_ = new anim::EmoteDisplay(panel, panel_io); #endif diff --git a/main/boards/electron-bot/config.json b/main/boards/electron-bot/config.json index b23b6bf8..08fc3419 100644 --- a/main/boards/electron-bot/config.json +++ b/main/boards/electron-bot/config.json @@ -4,6 +4,7 @@ { "name": "electron-bot", "sdkconfig_append": [ + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/16m.csv\"" ] } ] diff --git a/main/boards/electron-bot/electron_bot.cc b/main/boards/electron-bot/electron_bot.cc index 70fd2a93..81ff7b27 100644 --- a/main/boards/electron-bot/electron_bot.cc +++ b/main/boards/electron-bot/electron_bot.cc @@ -74,11 +74,7 @@ private: display_ = new ElectronEmojiDisplay(io_handle, panel_handle, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_20_4, &font_awesome_20_4, new Twemoji64()}); } void InitializeButtons() { diff --git a/main/boards/electron-bot/electron_emoji_display.cc b/main/boards/electron-bot/electron_emoji_display.cc index e72cc16b..7a8d438d 100644 --- a/main/boards/electron-bot/electron_emoji_display.cc +++ b/main/boards/electron-bot/electron_emoji_display.cc @@ -51,9 +51,9 @@ const ElectronEmojiDisplay::EmotionMap ElectronEmojiDisplay::emotion_maps_[] = { ElectronEmojiDisplay::ElectronEmojiDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, - bool swap_xy, DisplayFonts fonts) + bool swap_xy, DisplayStyle style) : SpiLcdDisplay(panel_io, panel, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - fonts), + style), emotion_gif_(nullptr) { SetupGifContainer(); } @@ -144,27 +144,4 @@ void ElectronEmojiDisplay::SetChatMessage(const char* role, const char* content) lv_obj_remove_flag(chat_message_label_, LV_OBJ_FLAG_HIDDEN); ESP_LOGI(TAG, "设置聊天消息 [%s]: %s", role, content); -} - -void ElectronEmojiDisplay::SetIcon(const char* icon) { - if (!icon) { - return; - } - - DisplayLockGuard lock(this); - - if (chat_message_label_ != nullptr) { - std::string icon_message = std::string(icon) + " "; - - if (strcmp(icon, FONT_AWESOME_DOWNLOAD) == 0) { - icon_message += "正在升级..."; - } else { - icon_message += "系统状态"; - } - - lv_label_set_text(chat_message_label_, icon_message.c_str()); - lv_obj_remove_flag(chat_message_label_, LV_OBJ_FLAG_HIDDEN); - - ESP_LOGI(TAG, "设置图标: %s", icon); - } } \ No newline at end of file diff --git a/main/boards/electron-bot/electron_emoji_display.h b/main/boards/electron-bot/electron_emoji_display.h index b88d5ed8..0e293214 100644 --- a/main/boards/electron-bot/electron_emoji_display.h +++ b/main/boards/electron-bot/electron_emoji_display.h @@ -23,7 +23,7 @@ public: */ ElectronEmojiDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, - bool mirror_y, bool swap_xy, DisplayFonts fonts); + bool mirror_y, bool swap_xy, DisplayStyle style); virtual ~ElectronEmojiDisplay() = default; @@ -33,9 +33,6 @@ public: // 重写聊天消息设置方法 virtual void SetChatMessage(const char* role, const char* content) override; - // 重写图标设置方法 - virtual void SetIcon(const char* icon) override; - private: void SetupGifContainer(); diff --git a/main/boards/esp-box-3/esp_box3_board.cc b/main/boards/esp-box-3/esp_box3_board.cc index 88786668..18f35a73 100644 --- a/main/boards/esp-box-3/esp_box3_board.cc +++ b/main/boards/esp-box-3/esp_box3_board.cc @@ -14,7 +14,7 @@ #define TAG "EspBox3Board" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); // Init ili9341 by custom cmd @@ -130,15 +130,7 @@ private: esp_lcd_panel_disp_on_off(panel, true); 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -150,6 +142,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static BoxAudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/esp-box-lite/config.json b/main/boards/esp-box-lite/config.json index a3004371..870fabed 100644 --- a/main/boards/esp-box-lite/config.json +++ b/main/boards/esp-box-lite/config.json @@ -3,7 +3,9 @@ "builds": [ { "name": "esp-box-lite", - "sdkconfig_append": ["CONFIG_SOC_ADC_SUPPORTED=y"] + "sdkconfig_append": [ + "CONFIG_SOC_ADC_SUPPORTED=y" + ] } ] } \ No newline at end of file diff --git a/main/boards/esp-box-lite/esp_box_lite_board.cc b/main/boards/esp-box-lite/esp_box_lite_board.cc index 2f4cc870..1cebe86d 100644 --- a/main/boards/esp-box-lite/esp_box_lite_board.cc +++ b/main/boards/esp-box-lite/esp_box_lite_board.cc @@ -16,7 +16,7 @@ #define TAG "EspBoxBoardLite" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); /* ADC Buttons */ @@ -192,15 +192,7 @@ private: esp_lcd_panel_disp_on_off(panel, true); 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -221,6 +213,11 @@ public: } } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static BoxAudioCodecLite audio_codec( i2c_bus_, diff --git a/main/boards/esp-box/esp_box_board.cc b/main/boards/esp-box/esp_box_board.cc index 9676ef98..34d29e91 100644 --- a/main/boards/esp-box/esp_box_board.cc +++ b/main/boards/esp-box/esp_box_board.cc @@ -14,7 +14,7 @@ #define TAG "EspBoxBoard" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); // Init ili9341 by custom cmd @@ -130,15 +130,7 @@ private: esp_lcd_panel_disp_on_off(panel, true); 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -150,6 +142,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static BoxAudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/esp-s3-lcd-ev-board-2/esp-s3-lcd-ev-board-2.cc b/main/boards/esp-s3-lcd-ev-board-2/esp-s3-lcd-ev-board-2.cc index af3e5534..4f436856 100644 --- a/main/boards/esp-s3-lcd-ev-board-2/esp-s3-lcd-ev-board-2.cc +++ b/main/boards/esp-s3-lcd-ev-board-2/esp-s3-lcd-ev-board-2.cc @@ -22,7 +22,7 @@ #define TAG "ESP_S3_LCD_EV_Board_2" -LV_FONT_DECLARE(font_puhui_30_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); LV_FONT_DECLARE(font_awesome_30_4); class ESP_S3_LCD_EV_Board_2 : public WifiBoard { @@ -127,12 +127,9 @@ private: display_ = new RgbLcdDisplay(panel_io, panel_handle, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_30_4, - .icon_font = &font_awesome_30_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_30_4, &font_awesome_30_4}); } + void InitializeCodecI2c() { // Initialize I2C peripheral i2c_master_bus_config_t i2c_bus_cfg = { @@ -211,8 +208,11 @@ public: InitializeTouch(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } - //es7210用作音频采集 virtual AudioCodec* GetAudioCodec() override { static BoxAudioCodec audio_codec( i2c_bus_, @@ -230,8 +230,6 @@ public: return &audio_codec; } - - virtual Display* GetDisplay() override { return display_; } diff --git a/main/boards/esp-s3-lcd-ev-board/esp-s3-lcd-ev-board.cc b/main/boards/esp-s3-lcd-ev-board/esp-s3-lcd-ev-board.cc index 18164397..dc5adb4b 100644 --- a/main/boards/esp-s3-lcd-ev-board/esp-s3-lcd-ev-board.cc +++ b/main/boards/esp-s3-lcd-ev-board/esp-s3-lcd-ev-board.cc @@ -20,7 +20,7 @@ #define TAG "ESP_S3_LCD_EV_Board" -LV_FONT_DECLARE(font_puhui_30_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); LV_FONT_DECLARE(font_awesome_30_4); class ESP_S3_LCD_EV_Board : public WifiBoard { @@ -127,12 +127,9 @@ private: display_ = new RgbLcdDisplay(panel_io, panel_handle, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_30_4, - .icon_font = &font_awesome_30_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_30_4, &font_awesome_30_4}); } + void InitializeCodecI2c() { // Initialize I2C peripheral i2c_master_bus_config_t i2c_bus_cfg = { @@ -180,8 +177,11 @@ public: InitializeRGB_GC9503V_Display(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } - //es7210用作音频采集 virtual AudioCodec* GetAudioCodec() override { static BoxAudioCodec audio_codec( codec_i2c_bus_, @@ -199,8 +199,6 @@ public: return &audio_codec; } - - virtual Display* GetDisplay() override { return display_; } diff --git a/main/boards/esp-sparkbot/esp_sparkbot_board.cc b/main/boards/esp-sparkbot/esp_sparkbot_board.cc index 65880192..cee974cf 100644 --- a/main/boards/esp-sparkbot/esp_sparkbot_board.cc +++ b/main/boards/esp-sparkbot/esp_sparkbot_board.cc @@ -19,7 +19,7 @@ #define TAG "esp_sparkbot" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); class SparkBotEs8311AudioCodec : public Es8311AudioCodec { @@ -121,11 +121,7 @@ private: esp_lcd_panel_disp_on_off(panel, true); 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeCamera() { @@ -279,6 +275,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static SparkBotEs8311AudioCodec audio_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, diff --git a/main/boards/esp-spot-s3/esp_spot_s3_board.cc b/main/boards/esp-spot-s3/esp_spot_s3_board.cc index 0ff61397..178227a0 100644 --- a/main/boards/esp-spot-s3/esp_spot_s3_board.cc +++ b/main/boards/esp-spot-s3/esp_spot_s3_board.cc @@ -195,6 +195,11 @@ public: InitializeButtons(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_WAKENET); + return &assets; + } + virtual Led* GetLed() override { static CircularStrip led(LED_PIN, 1); return &led; diff --git a/main/boards/esp32-cgc-144/esp32_cgc_144_board.cc b/main/boards/esp32-cgc-144/esp32_cgc_144_board.cc index f3b50d04..5f59f325 100644 --- a/main/boards/esp32-cgc-144/esp32_cgc_144_board.cc +++ b/main/boards/esp32-cgc-144/esp32_cgc_144_board.cc @@ -123,18 +123,10 @@ void InitializePowerManager() { 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, - { - .text_font = &font_puhui_14_1, - .icon_font = &font_awesome_14_1, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_14_1, &font_awesome_14_1, new Twemoji32()}); } - - - void InitializeButtons() { - boot_button_.OnClick([this]() { power_save_timer_->WakeUp(); auto& app = Application::GetInstance(); @@ -149,7 +141,6 @@ void InitializePowerManager() { std::string wake_word="你好小智"; Application::GetInstance().WakeWordInvoke(wake_word); }); - } // 物联网初始化,添加对 AI 可见设备 @@ -169,8 +160,7 @@ public: GetBacklight()->RestoreBrightness(); } - virtual AudioCodec* GetAudioCodec() override - { + virtual AudioCodec* GetAudioCodec() override { static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN); return &audio_codec; diff --git a/main/boards/esp32-cgc/esp32_cgc_board.cc b/main/boards/esp32-cgc/esp32_cgc_board.cc index 12f7e6ae..77360d52 100644 --- a/main/boards/esp32-cgc/esp32_cgc_board.cc +++ b/main/boards/esp32-cgc/esp32_cgc_board.cc @@ -125,11 +125,7 @@ private: #endif 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, - { - .text_font = &font_puhui_14_1, - .icon_font = &font_awesome_14_1, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_14_1, &font_awesome_14_1, new Twemoji32()}); } diff --git a/main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc b/main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc index 523abbe9..ed943cad 100644 --- a/main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc +++ b/main/boards/esp32-s3-touch-amoled-1.8/esp32-s3-touch-amoled-1.8.cc @@ -26,7 +26,7 @@ #define TAG "WaveshareEsp32s3TouchAMOLED1inch8" -LV_FONT_DECLARE(font_puhui_30_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); LV_FONT_DECLARE(font_awesome_30_4); class Pmic : public Axp2101 { @@ -87,15 +87,7 @@ public: bool swap_xy) : SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_30_4, - .icon_font = &font_awesome_30_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }) { + {&font_puhui_basic_30_4, &font_awesome_30_4}) { DisplayLockGuard lock(this); lv_obj_set_style_pad_left(status_bar_, LV_HOR_RES * 0.1, 0); lv_obj_set_style_pad_right(status_bar_, LV_HOR_RES * 0.1, 0); @@ -308,6 +300,11 @@ public: InitializeTools(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } + 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, diff --git a/main/boards/esp32-s3-touch-lcd-1.46/esp32-s3-touch-lcd-1.46.cc b/main/boards/esp32-s3-touch-lcd-1.46/esp32-s3-touch-lcd-1.46.cc index f5082e65..bc6b2bb1 100644 --- a/main/boards/esp32-s3-touch-lcd-1.46/esp32-s3-touch-lcd-1.46.cc +++ b/main/boards/esp32-s3-touch-lcd-1.46/esp32-s3-touch-lcd-1.46.cc @@ -21,7 +21,7 @@ #define TAG "waveshare_lcd_1_46" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); @@ -48,11 +48,7 @@ public: bool swap_xy) : SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_64_init(), - }) { + {&font_puhui_basic_16_4, &font_awesome_16_4}) { DisplayLockGuard lock(this); lv_display_add_event_cb(display_, rounder_event_cb, LV_EVENT_INVALIDATE_AREA, NULL); } @@ -160,6 +156,7 @@ private: // gpio_set_level(PWR_Control_PIN, false); gpio_set_level(PWR_Control_PIN, true); } + void InitializeButtons() { instance_ = this; InitializeButtonsCustom(); @@ -224,6 +221,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, I2S_STD_SLOT_LEFT, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN, I2S_STD_SLOT_RIGHT); // I2S_STD_SLOT_LEFT / I2S_STD_SLOT_RIGHT / I2S_STD_SLOT_BOTH diff --git a/main/boards/esp32-s3-touch-lcd-1.85/esp32-s3-touch-lcd-1.85.cc b/main/boards/esp32-s3-touch-lcd-1.85/esp32-s3-touch-lcd-1.85.cc index fd252473..4fa9c827 100644 --- a/main/boards/esp32-s3-touch-lcd-1.85/esp32-s3-touch-lcd-1.85.cc +++ b/main/boards/esp32-s3-touch-lcd-1.85/esp32-s3-touch-lcd-1.85.cc @@ -23,7 +23,7 @@ #define LCD_OPCODE_READ_CMD (0x0BULL) #define LCD_OPCODE_WRITE_COLOR (0x32ULL) -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); static const st77916_lcd_init_cmd_t vendor_specific_init_new[] = { @@ -359,11 +359,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void InitializeButtonsCustom() { @@ -434,6 +430,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, I2S_STD_SLOT_BOTH, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN, I2S_STD_SLOT_RIGHT); // I2S_STD_SLOT_LEFT / I2S_STD_SLOT_RIGHT / I2S_STD_SLOT_BOTH diff --git a/main/boards/esp32-s3-touch-lcd-1.85c/esp32-s3-touch-lcd-1.85c.cc b/main/boards/esp32-s3-touch-lcd-1.85c/esp32-s3-touch-lcd-1.85c.cc index 2e23b9d1..405ca4d7 100644 --- a/main/boards/esp32-s3-touch-lcd-1.85c/esp32-s3-touch-lcd-1.85c.cc +++ b/main/boards/esp32-s3-touch-lcd-1.85c/esp32-s3-touch-lcd-1.85c.cc @@ -23,7 +23,7 @@ #define LCD_OPCODE_READ_CMD (0x0BULL) #define LCD_OPCODE_WRITE_COLOR (0x32ULL) -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); static const st77916_lcd_init_cmd_t vendor_specific_init_new[] = { @@ -356,11 +356,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void InitializeButtons() { @@ -384,6 +380,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, I2S_STD_SLOT_LEFT, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN, I2S_STD_SLOT_RIGHT); // I2S_STD_SLOT_LEFT / I2S_STD_SLOT_RIGHT / I2S_STD_SLOT_BOTH diff --git a/main/boards/esp32-s3-touch-lcd-3.5/esp32-s3-touch-lcd-3.5.cc b/main/boards/esp32-s3-touch-lcd-3.5/esp32-s3-touch-lcd-3.5.cc index 59836180..13a22375 100644 --- a/main/boards/esp32-s3-touch-lcd-3.5/esp32-s3-touch-lcd-3.5.cc +++ b/main/boards/esp32-s3-touch-lcd-3.5/esp32-s3-touch-lcd-3.5.cc @@ -30,8 +30,8 @@ #define TAG "waveshare_lcd_3_5" -LV_FONT_DECLARE(font_puhui_16_4); -LV_FONT_DECLARE(font_awesome_16_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); +LV_FONT_DECLARE(font_awesome_20_4); class Pmic : public Axp2101 { @@ -304,11 +304,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeButtons() { @@ -354,6 +350,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8311AudioCodec audio_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, diff --git a/main/boards/esp32s3-korvo2-v3/esp32s3_korvo2_v3_board.cc b/main/boards/esp32s3-korvo2-v3/esp32s3_korvo2_v3_board.cc index d9b852c6..739488f6 100644 --- a/main/boards/esp32s3-korvo2-v3/esp32s3_korvo2_v3_board.cc +++ b/main/boards/esp32s3-korvo2-v3/esp32s3_korvo2_v3_board.cc @@ -17,7 +17,7 @@ #define TAG "esp32s3_korvo2_v3" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); // Init ili9341 by custom cmd @@ -190,11 +190,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel, true)); 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeSt7789Display() { @@ -228,11 +224,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeCamera() { @@ -285,6 +277,11 @@ public: #endif } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static BoxAudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/genjutech-s3-1.54tft/genjutech-s3-1.54tft.cc b/main/boards/genjutech-s3-1.54tft/genjutech-s3-1.54tft.cc index 1b6a29b7..87bbd869 100644 --- a/main/boards/genjutech-s3-1.54tft/genjutech-s3-1.54tft.cc +++ b/main/boards/genjutech-s3-1.54tft/genjutech-s3-1.54tft.cc @@ -21,7 +21,7 @@ #define TAG "GenJuTech_s3_1_54TFT" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); class SparkBotEs8311AudioCodec : public Es8311AudioCodec { @@ -201,11 +201,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -223,6 +219,10 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); diff --git a/main/boards/jiuchuan-s3/README.md b/main/boards/jiuchuan-s3/README.md index 4ae7cbd5..2b2d7553 100644 --- a/main/boards/jiuchuan-s3/README.md +++ b/main/boards/jiuchuan-s3/README.md @@ -13,7 +13,7 @@ 4. 点击 VSCode 右下角提示,生成 [compile_commands.json] 文件; 5. 设置目标设备为 `[esp32s3] -> [JTAG]`; 6. 打开 **SDK Configuration Editor**; -7. 配置自定义分区表路径为:`partitions/v1/16m.csv`; +7. 配置自定义分区表路径为:`partitions/v2/16m.csv`; 8. 设置 **Board Type** 为 **九川科技**; 9. 保存配置并开始编译。 diff --git a/main/boards/jiuchuan-s3/jiuchuan_dev_board.cc b/main/boards/jiuchuan-s3/jiuchuan_dev_board.cc index 94e9b890..ebe4f4b9 100644 --- a/main/boards/jiuchuan-s3/jiuchuan_dev_board.cc +++ b/main/boards/jiuchuan-s3/jiuchuan_dev_board.cc @@ -25,7 +25,7 @@ #define BOARD_TAG "JiuchuanDevBoard" #define __USER_GPIO_PWRDOWN__ -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); // 自定义LCD显示器类,用于圆形屏幕适配 @@ -41,8 +41,8 @@ public: bool mirror_x, bool mirror_y, bool swap_xy, - DisplayFonts fonts) - : SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, fonts) + DisplayStyle style) + : SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, style) { DisplayLockGuard lock(this); @@ -316,15 +316,7 @@ private: esp_lcd_panel_mirror(panel, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y); display_ = new CustomLcdDisplay(panel_io, panel, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -343,6 +335,11 @@ public: } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/kevin-box-1/kevin_box_board.cc b/main/boards/kevin-box-1/kevin_box_board.cc index c55d3f7b..24f2ff45 100644 --- a/main/boards/kevin-box-1/kevin_box_board.cc +++ b/main/boards/kevin-box-1/kevin_box_board.cc @@ -16,7 +16,7 @@ #define TAG "KevinBoxBoard" -LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_puhui_basic_14_1); LV_FONT_DECLARE(font_awesome_14_1); class KevinBoxBoard : public Ml307Board { @@ -116,7 +116,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_, true)); display_ = new OledDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, - {&font_puhui_14_1, &font_awesome_14_1}); + {&font_puhui_basic_14_1, &font_awesome_14_1}); } void InitializeCodecI2c() { @@ -188,6 +188,11 @@ public: InitializeButtons(); } + + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_14_1); + return &assets; + } virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); diff --git a/main/boards/kevin-box-2/kevin_box_board.cc b/main/boards/kevin-box-2/kevin_box_board.cc index 014e23e3..fa011f13 100644 --- a/main/boards/kevin-box-2/kevin_box_board.cc +++ b/main/boards/kevin-box-2/kevin_box_board.cc @@ -18,7 +18,7 @@ #define TAG "KevinBoxBoard" -LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_puhui_basic_14_1); LV_FONT_DECLARE(font_awesome_14_1); @@ -146,7 +146,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_, true)); display_ = new OledDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, - {&font_puhui_14_1, &font_awesome_14_1}); + {&font_puhui_basic_14_1, &font_awesome_14_1}); } void InitializeCodecI2c() { @@ -244,6 +244,11 @@ public: InitializePowerSaveTimer(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_14_1); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/kevin-c3/kevin_c3_board.cc b/main/boards/kevin-c3/kevin_c3_board.cc index df7e82c2..c7dac4f1 100644 --- a/main/boards/kevin-c3/kevin_c3_board.cc +++ b/main/boards/kevin-c3/kevin_c3_board.cc @@ -75,6 +75,11 @@ public: esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_WAKENET_SMALL); + return &assets; + } + virtual Led* GetLed() override { return led_strip_; } diff --git a/main/boards/kevin-sp-v3-dev/kevin-sp-v3_board.cc b/main/boards/kevin-sp-v3-dev/kevin-sp-v3_board.cc index 1f50ba7b..54ddfc42 100644 --- a/main/boards/kevin-sp-v3-dev/kevin-sp-v3_board.cc +++ b/main/boards/kevin-sp-v3-dev/kevin-sp-v3_board.cc @@ -17,7 +17,7 @@ #define TAG "kevin-sp-v3" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); @@ -85,11 +85,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeCamera() { @@ -135,7 +131,11 @@ public: InitializeCamera(); GetBacklight()->RestoreBrightness(); } - + + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); diff --git a/main/boards/kevin-sp-v4-dev/kevin-sp-v4_board.cc b/main/boards/kevin-sp-v4-dev/kevin-sp-v4_board.cc index fb962d7e..ae9cfbe1 100644 --- a/main/boards/kevin-sp-v4-dev/kevin-sp-v4_board.cc +++ b/main/boards/kevin-sp-v4-dev/kevin-sp-v4_board.cc @@ -15,7 +15,7 @@ #define TAG "kevin-sp-v4" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); class KEVIN_SP_V4Board : public WifiBoard { @@ -25,6 +25,7 @@ private: LcdDisplay* display_; i2c_master_bus_handle_t codec_i2c_bus_; Esp32Camera* camera_; + void InitializeCodecI2c() { // Initialize I2C peripheral i2c_master_bus_config_t i2c_bus_cfg = { @@ -98,11 +99,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeCamera() { @@ -149,7 +146,11 @@ public: InitializeCamera(); GetBacklight()->RestoreBrightness(); } - + + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); diff --git a/main/boards/kevin-yuying-313lcd/kevin_yuying_313lcd.cc b/main/boards/kevin-yuying-313lcd/kevin_yuying_313lcd.cc index 7162de22..97586f63 100644 --- a/main/boards/kevin-yuying-313lcd/kevin_yuying_313lcd.cc +++ b/main/boards/kevin-yuying-313lcd/kevin_yuying_313lcd.cc @@ -17,7 +17,7 @@ #define TAG "Yuying_313lcd" -LV_FONT_DECLARE(font_puhui_30_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); LV_FONT_DECLARE(font_awesome_30_4); class Yuying_313lcd : public WifiBoard { @@ -104,12 +104,9 @@ private: display_ = new RgbLcdDisplay(panel_io, panel_handle, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_30_4, - .icon_font = &font_awesome_30_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_30_4, &font_awesome_30_4}); } + void InitializeCodecI2c() { // Initialize I2C peripheral i2c_master_bus_config_t i2c_bus_cfg = { @@ -150,6 +147,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } + 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, diff --git a/main/boards/labplus-ledong-v2/labplus_ledong_v2.cc b/main/boards/labplus-ledong-v2/labplus_ledong_v2.cc index d242d08d..327ed534 100644 --- a/main/boards/labplus-ledong-v2/labplus_ledong_v2.cc +++ b/main/boards/labplus-ledong-v2/labplus_ledong_v2.cc @@ -18,8 +18,9 @@ #define BOARD_STM8_ADDR 17 #define BOARD_STM8_CMD 4 -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); + class labplus_ledong_v2 : public WifiBoard { private: i2c_master_bus_handle_t i2c_bus_; @@ -119,15 +120,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - #if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), - #else - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), - #endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -139,6 +132,11 @@ public: GetBacklight()->SetBrightness(100); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/labplus-mpython-v3/mpython_pro.cc b/main/boards/labplus-mpython-v3/mpython_pro.cc index 293a986f..d3422faf 100644 --- a/main/boards/labplus-mpython-v3/mpython_pro.cc +++ b/main/boards/labplus-mpython-v3/mpython_pro.cc @@ -15,8 +15,9 @@ #define TAG "mpython_v3" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); + class mpython_v3 : public WifiBoard { private: i2c_master_bus_handle_t i2c_bus_; @@ -99,15 +100,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - #if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), - #else - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), - #endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -119,6 +112,11 @@ public: GetBacklight()->SetBrightness(100); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/lichuang-c3-dev/config.json b/main/boards/lichuang-c3-dev/config.json index f10aa79c..6000c33a 100644 --- a/main/boards/lichuang-c3-dev/config.json +++ b/main/boards/lichuang-c3-dev/config.json @@ -5,7 +5,7 @@ "name": "lichuang-c3-dev", "sdkconfig_append": [ "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", - "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/8m.csv\"", + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"", "CONFIG_USE_ESP_WAKE_WORD=y", "CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y" ] diff --git a/main/boards/lichuang-c3-dev/lichuang_c3_dev_board.cc b/main/boards/lichuang-c3-dev/lichuang_c3_dev_board.cc index 0eb7759e..6d913048 100644 --- a/main/boards/lichuang-c3-dev/lichuang_c3_dev_board.cc +++ b/main/boards/lichuang-c3-dev/lichuang_c3_dev_board.cc @@ -14,8 +14,8 @@ #define TAG "LichuangC3DevBoard" -LV_FONT_DECLARE(font_puhui_16_4); -LV_FONT_DECLARE(font_awesome_16_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); +LV_FONT_DECLARE(font_awesome_20_4); class LichuangC3DevBoard : public WifiBoard { private: @@ -92,11 +92,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -108,6 +104,11 @@ public: GetBacklight()->SetBrightness(100); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8311AudioCodec audio_codec( codec_i2c_bus_, diff --git a/main/boards/lichuang-dev/config.json b/main/boards/lichuang-dev/config.json index e2a7090e..32eedc4e 100644 --- a/main/boards/lichuang-dev/config.json +++ b/main/boards/lichuang-dev/config.json @@ -4,7 +4,8 @@ { "name": "lichuang-dev", "sdkconfig_append": [ - "CONFIG_USE_DEVICE_AEC=y" + "CONFIG_USE_DEVICE_AEC=y", + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/16m.csv\"" ] } ] diff --git a/main/boards/lichuang-dev/lichuang_dev_board.cc b/main/boards/lichuang-dev/lichuang_dev_board.cc index 9b682d6b..0c40d73d 100644 --- a/main/boards/lichuang-dev/lichuang_dev_board.cc +++ b/main/boards/lichuang-dev/lichuang_dev_board.cc @@ -19,7 +19,7 @@ #define TAG "LichuangDevBoard" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); class Pca9557 : public I2cDevice { @@ -158,15 +158,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeTouch() @@ -251,6 +243,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static CustomAudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/lilygo-t-cameraplus-s3/lilygo-t-cameraplus-s3.cc b/main/boards/lilygo-t-cameraplus-s3/lilygo-t-cameraplus-s3.cc index 2e620657..7e982482 100644 --- a/main/boards/lilygo-t-cameraplus-s3/lilygo-t-cameraplus-s3.cc +++ b/main/boards/lilygo-t-cameraplus-s3/lilygo-t-cameraplus-s3.cc @@ -18,8 +18,8 @@ #define TAG "LilygoTCameraPlusS3Board" -LV_FONT_DECLARE(font_puhui_16_4); -LV_FONT_DECLARE(font_awesome_16_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); +LV_FONT_DECLARE(font_awesome_20_4); class Cst816x : public I2cDevice { public: @@ -208,11 +208,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeButtons() { @@ -290,6 +286,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec *GetAudioCodec() override { static Tcamerapluss3AudioCodec audio_codec( AUDIO_INPUT_SAMPLE_RATE, diff --git a/main/boards/lilygo-t-circle-s3/lilygo-t-circle-s3.cc b/main/boards/lilygo-t-circle-s3/lilygo-t-circle-s3.cc index 877bc3cd..9ed29cab 100644 --- a/main/boards/lilygo-t-circle-s3/lilygo-t-circle-s3.cc +++ b/main/boards/lilygo-t-circle-s3/lilygo-t-circle-s3.cc @@ -16,7 +16,7 @@ #define TAG "LilygoTCircleS3Board" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class Cst816x : public I2cDevice { @@ -186,11 +186,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); gpio_config_t config; config.pin_bit_mask = BIT64(DISPLAY_BL); @@ -228,6 +224,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual AudioCodec *GetAudioCodec() override { static Tcircles3AudioCodec audio_codec( AUDIO_INPUT_SAMPLE_RATE, diff --git a/main/boards/lilygo-t-display-s3-pro-mvsrlora/lilygo-t-display-s3-pro-mvsrlora.cc b/main/boards/lilygo-t-display-s3-pro-mvsrlora/lilygo-t-display-s3-pro-mvsrlora.cc index de335050..ef2b96f2 100644 --- a/main/boards/lilygo-t-display-s3-pro-mvsrlora/lilygo-t-display-s3-pro-mvsrlora.cc +++ b/main/boards/lilygo-t-display-s3-pro-mvsrlora/lilygo-t-display-s3-pro-mvsrlora.cc @@ -16,8 +16,8 @@ #define TAG "LilygoTDisplays3ProMVSRLoraBoard" -LV_FONT_DECLARE(font_puhui_16_4); -LV_FONT_DECLARE(font_awesome_16_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); +LV_FONT_DECLARE(font_awesome_20_4); class Cst2xxse : public I2cDevice { public: @@ -210,11 +210,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); gpio_config_t config; config.pin_bit_mask = BIT64(DISPLAY_BL); @@ -253,6 +249,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec *GetAudioCodec() override { static Tdisplays3promvsrloraAudioCodec audio_codec( AUDIO_INPUT_SAMPLE_RATE, diff --git a/main/boards/m5stack-core-s3/README.md b/main/boards/m5stack-core-s3/README.md index 01286702..d7aa9b8c 100644 --- a/main/boards/m5stack-core-s3/README.md +++ b/main/boards/m5stack-core-s3/README.md @@ -1,22 +1,18 @@ # 使用说明 -1. 设置编译目标为 esp32s3 +**编译** -```shell -idf.py set-target esp32s3 +```bash +python ./scripts/release.py m5stack-core-s3 ``` -2. 修改配置 +如需手动编译,请参考 `m5stack-core-s3/config.json` 修改 menuconfig 对应选项。 -```shell -cp main/boards/m5stack-core-s3/sdkconfig.cores3 sdkconfig -``` +**烧录** -3. 编译烧录程序 - -```shell -idf.py build flash monitor +```bash +idf.py flash ``` > [!NOTE] diff --git a/main/boards/m5stack-core-s3/m5stack_core_s3.cc b/main/boards/m5stack-core-s3/m5stack_core_s3.cc index e380cde7..6531c6ff 100644 --- a/main/boards/m5stack-core-s3/m5stack_core_s3.cc +++ b/main/boards/m5stack-core-s3/m5stack_core_s3.cc @@ -19,7 +19,7 @@ #define TAG "M5StackCoreS3Board" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); class Pmic : public Axp2101 { @@ -295,15 +295,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeCamera() { @@ -350,6 +342,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static CoreS3AudioCodec audio_codec(i2c_bus_, AUDIO_INPUT_SAMPLE_RATE, diff --git a/main/boards/m5stack-core-s3/sdkconfig.cores3 b/main/boards/m5stack-core-s3/sdkconfig.cores3 deleted file mode 100644 index 8f382ee1..00000000 --- a/main/boards/m5stack-core-s3/sdkconfig.cores3 +++ /dev/null @@ -1,2953 +0,0 @@ -# -# Automatically generated file. DO NOT EDIT. -# Espressif IoT Development Framework (ESP-IDF) 5.4.0 Project Configuration -# -CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000 -CONFIG_SOC_MPU_REGIONS_MAX_NUM=8 -CONFIG_SOC_ADC_SUPPORTED=y -CONFIG_SOC_UART_SUPPORTED=y -CONFIG_SOC_PCNT_SUPPORTED=y -CONFIG_SOC_PHY_SUPPORTED=y -CONFIG_SOC_WIFI_SUPPORTED=y -CONFIG_SOC_TWAI_SUPPORTED=y -CONFIG_SOC_GDMA_SUPPORTED=y -CONFIG_SOC_AHB_GDMA_SUPPORTED=y -CONFIG_SOC_GPTIMER_SUPPORTED=y -CONFIG_SOC_LCDCAM_SUPPORTED=y -CONFIG_SOC_LCDCAM_I80_LCD_SUPPORTED=y -CONFIG_SOC_LCDCAM_RGB_LCD_SUPPORTED=y -CONFIG_SOC_MCPWM_SUPPORTED=y -CONFIG_SOC_DEDICATED_GPIO_SUPPORTED=y -CONFIG_SOC_CACHE_SUPPORT_WRAP=y -CONFIG_SOC_ULP_SUPPORTED=y -CONFIG_SOC_ULP_FSM_SUPPORTED=y -CONFIG_SOC_RISCV_COPROC_SUPPORTED=y -CONFIG_SOC_BT_SUPPORTED=y -CONFIG_SOC_USB_OTG_SUPPORTED=y -CONFIG_SOC_USB_SERIAL_JTAG_SUPPORTED=y -CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y -CONFIG_SOC_ASYNC_MEMCPY_SUPPORTED=y -CONFIG_SOC_SUPPORTS_SECURE_DL_MODE=y -CONFIG_SOC_EFUSE_KEY_PURPOSE_FIELD=y -CONFIG_SOC_EFUSE_SUPPORTED=y -CONFIG_SOC_SDMMC_HOST_SUPPORTED=y -CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y -CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y -CONFIG_SOC_RTC_MEM_SUPPORTED=y -CONFIG_SOC_PSRAM_DMA_CAPABLE=y -CONFIG_SOC_XT_WDT_SUPPORTED=y -CONFIG_SOC_I2S_SUPPORTED=y -CONFIG_SOC_RMT_SUPPORTED=y -CONFIG_SOC_SDM_SUPPORTED=y -CONFIG_SOC_GPSPI_SUPPORTED=y -CONFIG_SOC_LEDC_SUPPORTED=y -CONFIG_SOC_I2C_SUPPORTED=y -CONFIG_SOC_SYSTIMER_SUPPORTED=y -CONFIG_SOC_SUPPORT_COEXISTENCE=y -CONFIG_SOC_TEMP_SENSOR_SUPPORTED=y -CONFIG_SOC_AES_SUPPORTED=y -CONFIG_SOC_MPI_SUPPORTED=y -CONFIG_SOC_SHA_SUPPORTED=y -CONFIG_SOC_HMAC_SUPPORTED=y -CONFIG_SOC_DIG_SIGN_SUPPORTED=y -CONFIG_SOC_FLASH_ENC_SUPPORTED=y -CONFIG_SOC_SECURE_BOOT_SUPPORTED=y -CONFIG_SOC_MEMPROT_SUPPORTED=y -CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y -CONFIG_SOC_BOD_SUPPORTED=y -CONFIG_SOC_CLK_TREE_SUPPORTED=y -CONFIG_SOC_MPU_SUPPORTED=y -CONFIG_SOC_WDT_SUPPORTED=y -CONFIG_SOC_SPI_FLASH_SUPPORTED=y -CONFIG_SOC_RNG_SUPPORTED=y -CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y -CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y -CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y -CONFIG_SOC_PM_SUPPORTED=y -CONFIG_SOC_XTAL_SUPPORT_40M=y -CONFIG_SOC_APPCPU_HAS_CLOCK_GATING_BUG=y -CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y -CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y -CONFIG_SOC_ADC_ARBITER_SUPPORTED=y -CONFIG_SOC_ADC_DIG_IIR_FILTER_SUPPORTED=y -CONFIG_SOC_ADC_MONITOR_SUPPORTED=y -CONFIG_SOC_ADC_DMA_SUPPORTED=y -CONFIG_SOC_ADC_PERIPH_NUM=2 -CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10 -CONFIG_SOC_ADC_ATTEN_NUM=4 -CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2 -CONFIG_SOC_ADC_PATT_LEN_MAX=24 -CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=12 -CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12 -CONFIG_SOC_ADC_DIGI_RESULT_BYTES=4 -CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4 -CONFIG_SOC_ADC_DIGI_IIR_FILTER_NUM=2 -CONFIG_SOC_ADC_DIGI_MONITOR_NUM=2 -CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=83333 -CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=611 -CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=12 -CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12 -CONFIG_SOC_ADC_CALIBRATION_V1_SUPPORTED=y -CONFIG_SOC_ADC_SELF_HW_CALI_SUPPORTED=y -CONFIG_SOC_ADC_SHARED_POWER=y -CONFIG_SOC_APB_BACKUP_DMA=y -CONFIG_SOC_BROWNOUT_RESET_SUPPORTED=y -CONFIG_SOC_CACHE_WRITEBACK_SUPPORTED=y -CONFIG_SOC_CACHE_FREEZE_SUPPORTED=y -CONFIG_SOC_CPU_CORES_NUM=2 -CONFIG_SOC_CPU_INTR_NUM=32 -CONFIG_SOC_CPU_HAS_FPU=y -CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y -CONFIG_SOC_CPU_BREAKPOINTS_NUM=2 -CONFIG_SOC_CPU_WATCHPOINTS_NUM=2 -CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=64 -CONFIG_SOC_DS_SIGNATURE_MAX_BIT_LEN=4096 -CONFIG_SOC_DS_KEY_PARAM_MD_IV_LENGTH=16 -CONFIG_SOC_DS_KEY_CHECK_MAX_WAIT_US=1100 -CONFIG_SOC_AHB_GDMA_VERSION=1 -CONFIG_SOC_GDMA_NUM_GROUPS_MAX=1 -CONFIG_SOC_GDMA_PAIRS_PER_GROUP=5 -CONFIG_SOC_GDMA_PAIRS_PER_GROUP_MAX=5 -CONFIG_SOC_AHB_GDMA_SUPPORT_PSRAM=y -CONFIG_SOC_GPIO_PORT=1 -CONFIG_SOC_GPIO_PIN_COUNT=49 -CONFIG_SOC_GPIO_SUPPORT_PIN_GLITCH_FILTER=y -CONFIG_SOC_GPIO_FILTER_CLK_SUPPORT_APB=y -CONFIG_SOC_GPIO_SUPPORT_RTC_INDEPENDENT=y -CONFIG_SOC_GPIO_SUPPORT_FORCE_HOLD=y -CONFIG_SOC_GPIO_VALID_GPIO_MASK=0x1FFFFFFFFFFFF -CONFIG_SOC_GPIO_IN_RANGE_MAX=48 -CONFIG_SOC_GPIO_OUT_RANGE_MAX=48 -CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0x0001FFFFFC000000 -CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y -CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3 -CONFIG_SOC_GPIO_SUPPORT_HOLD_IO_IN_DSLP=y -CONFIG_SOC_DEDIC_GPIO_OUT_CHANNELS_NUM=8 -CONFIG_SOC_DEDIC_GPIO_IN_CHANNELS_NUM=8 -CONFIG_SOC_DEDIC_GPIO_OUT_AUTO_ENABLE=y -CONFIG_SOC_I2C_NUM=2 -CONFIG_SOC_HP_I2C_NUM=2 -CONFIG_SOC_I2C_FIFO_LEN=32 -CONFIG_SOC_I2C_CMD_REG_NUM=8 -CONFIG_SOC_I2C_SUPPORT_SLAVE=y -CONFIG_SOC_I2C_SUPPORT_HW_CLR_BUS=y -CONFIG_SOC_I2C_SUPPORT_XTAL=y -CONFIG_SOC_I2C_SUPPORT_RTC=y -CONFIG_SOC_I2C_SUPPORT_10BIT_ADDR=y -CONFIG_SOC_I2C_SLAVE_SUPPORT_BROADCAST=y -CONFIG_SOC_I2C_SLAVE_SUPPORT_I2CRAM_ACCESS=y -CONFIG_SOC_I2C_SLAVE_CAN_GET_STRETCH_CAUSE=y -CONFIG_SOC_I2S_NUM=2 -CONFIG_SOC_I2S_HW_VERSION_2=y -CONFIG_SOC_I2S_SUPPORTS_XTAL=y -CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y -CONFIG_SOC_I2S_SUPPORTS_PCM=y -CONFIG_SOC_I2S_SUPPORTS_PDM=y -CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y -CONFIG_SOC_I2S_PDM_MAX_TX_LINES=2 -CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y -CONFIG_SOC_I2S_PDM_MAX_RX_LINES=4 -CONFIG_SOC_I2S_SUPPORTS_TDM=y -CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y -CONFIG_SOC_LEDC_SUPPORT_XTAL_CLOCK=y -CONFIG_SOC_LEDC_TIMER_NUM=4 -CONFIG_SOC_LEDC_CHANNEL_NUM=8 -CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=14 -CONFIG_SOC_LEDC_SUPPORT_FADE_STOP=y -CONFIG_SOC_MCPWM_GROUPS=2 -CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3 -CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3 -CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2 -CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3 -CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y -CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3 -CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3 -CONFIG_SOC_MCPWM_SWSYNC_CAN_PROPAGATE=y -CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=1 -CONFIG_SOC_MMU_PERIPH_NUM=1 -CONFIG_SOC_PCNT_GROUPS=1 -CONFIG_SOC_PCNT_UNITS_PER_GROUP=4 -CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2 -CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2 -CONFIG_SOC_RMT_GROUPS=1 -CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=4 -CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=4 -CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8 -CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=48 -CONFIG_SOC_RMT_SUPPORT_RX_PINGPONG=y -CONFIG_SOC_RMT_SUPPORT_RX_DEMODULATION=y -CONFIG_SOC_RMT_SUPPORT_TX_ASYNC_STOP=y -CONFIG_SOC_RMT_SUPPORT_TX_LOOP_COUNT=y -CONFIG_SOC_RMT_SUPPORT_TX_LOOP_AUTO_STOP=y -CONFIG_SOC_RMT_SUPPORT_TX_SYNCHRO=y -CONFIG_SOC_RMT_SUPPORT_TX_CARRIER_DATA_ONLY=y -CONFIG_SOC_RMT_SUPPORT_XTAL=y -CONFIG_SOC_RMT_SUPPORT_RC_FAST=y -CONFIG_SOC_RMT_SUPPORT_APB=y -CONFIG_SOC_RMT_SUPPORT_DMA=y -CONFIG_SOC_LCD_I80_SUPPORTED=y -CONFIG_SOC_LCD_RGB_SUPPORTED=y -CONFIG_SOC_LCD_I80_BUSES=1 -CONFIG_SOC_LCD_RGB_PANELS=1 -CONFIG_SOC_LCD_I80_BUS_WIDTH=16 -CONFIG_SOC_LCD_RGB_DATA_WIDTH=16 -CONFIG_SOC_LCD_SUPPORT_RGB_YUV_CONV=y -CONFIG_SOC_LCDCAM_I80_NUM_BUSES=1 -CONFIG_SOC_LCDCAM_I80_BUS_WIDTH=16 -CONFIG_SOC_LCDCAM_RGB_NUM_PANELS=1 -CONFIG_SOC_LCDCAM_RGB_DATA_WIDTH=16 -CONFIG_SOC_RTC_CNTL_CPU_PD_DMA_BUS_WIDTH=128 -CONFIG_SOC_RTC_CNTL_CPU_PD_REG_FILE_NUM=549 -CONFIG_SOC_RTC_CNTL_TAGMEM_PD_DMA_BUS_WIDTH=128 -CONFIG_SOC_RTCIO_PIN_COUNT=22 -CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y -CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y -CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y -CONFIG_SOC_SDM_GROUPS=y -CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8 -CONFIG_SOC_SDM_CLK_SUPPORT_APB=y -CONFIG_SOC_SPI_PERIPH_NUM=3 -CONFIG_SOC_SPI_MAX_CS_NUM=6 -CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64 -CONFIG_SOC_SPI_SUPPORT_DDRCLK=y -CONFIG_SOC_SPI_SLAVE_SUPPORT_SEG_TRANS=y -CONFIG_SOC_SPI_SUPPORT_CD_SIG=y -CONFIG_SOC_SPI_SUPPORT_CONTINUOUS_TRANS=y -CONFIG_SOC_SPI_SUPPORT_SLAVE_HD_VER2=y -CONFIG_SOC_SPI_SUPPORT_CLK_APB=y -CONFIG_SOC_SPI_SUPPORT_CLK_XTAL=y -CONFIG_SOC_SPI_PERIPH_SUPPORT_CONTROL_DUMMY_OUT=y -CONFIG_SOC_MEMSPI_IS_INDEPENDENT=y -CONFIG_SOC_SPI_MAX_PRE_DIVIDER=16 -CONFIG_SOC_SPI_SUPPORT_OCT=y -CONFIG_SOC_SPI_SCT_SUPPORTED=y -CONFIG_SOC_SPI_SCT_REG_NUM=14 -CONFIG_SOC_SPI_SCT_BUFFER_NUM_MAX=y -CONFIG_SOC_SPI_SCT_CONF_BITLEN_MAX=0x3FFFA -CONFIG_SOC_MEMSPI_SRC_FREQ_120M=y -CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y -CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y -CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y -CONFIG_SOC_SPIRAM_SUPPORTED=y -CONFIG_SOC_SPIRAM_XIP_SUPPORTED=y -CONFIG_SOC_SYSTIMER_COUNTER_NUM=2 -CONFIG_SOC_SYSTIMER_ALARM_NUM=3 -CONFIG_SOC_SYSTIMER_BIT_WIDTH_LO=32 -CONFIG_SOC_SYSTIMER_BIT_WIDTH_HI=20 -CONFIG_SOC_SYSTIMER_FIXED_DIVIDER=y -CONFIG_SOC_SYSTIMER_INT_LEVEL=y -CONFIG_SOC_SYSTIMER_ALARM_MISS_COMPENSATE=y -CONFIG_SOC_TIMER_GROUPS=2 -CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2 -CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=54 -CONFIG_SOC_TIMER_GROUP_SUPPORT_XTAL=y -CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y -CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4 -CONFIG_SOC_TOUCH_SENSOR_VERSION=2 -CONFIG_SOC_TOUCH_SENSOR_NUM=15 -CONFIG_SOC_TOUCH_SUPPORT_SLEEP_WAKEUP=y -CONFIG_SOC_TOUCH_SUPPORT_WATERPROOF=y -CONFIG_SOC_TOUCH_SUPPORT_PROX_SENSING=y -CONFIG_SOC_TOUCH_PROXIMITY_CHANNEL_NUM=3 -CONFIG_SOC_TOUCH_PROXIMITY_MEAS_DONE_SUPPORTED=y -CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1 -CONFIG_SOC_TWAI_CONTROLLER_NUM=1 -CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y -CONFIG_SOC_TWAI_BRP_MIN=2 -CONFIG_SOC_TWAI_BRP_MAX=16384 -CONFIG_SOC_TWAI_SUPPORTS_RX_STATUS=y -CONFIG_SOC_UART_NUM=3 -CONFIG_SOC_UART_HP_NUM=3 -CONFIG_SOC_UART_FIFO_LEN=128 -CONFIG_SOC_UART_BITRATE_MAX=5000000 -CONFIG_SOC_UART_SUPPORT_FSM_TX_WAIT_SEND=y -CONFIG_SOC_UART_SUPPORT_WAKEUP_INT=y -CONFIG_SOC_UART_SUPPORT_APB_CLK=y -CONFIG_SOC_UART_SUPPORT_RTC_CLK=y -CONFIG_SOC_UART_SUPPORT_XTAL_CLK=y -CONFIG_SOC_USB_OTG_PERIPH_NUM=1 -CONFIG_SOC_SHA_DMA_MAX_BUFFER_SIZE=3968 -CONFIG_SOC_SHA_SUPPORT_DMA=y -CONFIG_SOC_SHA_SUPPORT_RESUME=y -CONFIG_SOC_SHA_GDMA=y -CONFIG_SOC_SHA_SUPPORT_SHA1=y -CONFIG_SOC_SHA_SUPPORT_SHA224=y -CONFIG_SOC_SHA_SUPPORT_SHA256=y -CONFIG_SOC_SHA_SUPPORT_SHA384=y -CONFIG_SOC_SHA_SUPPORT_SHA512=y -CONFIG_SOC_SHA_SUPPORT_SHA512_224=y -CONFIG_SOC_SHA_SUPPORT_SHA512_256=y -CONFIG_SOC_SHA_SUPPORT_SHA512_T=y -CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4 -CONFIG_SOC_MPI_OPERATIONS_NUM=3 -CONFIG_SOC_RSA_MAX_BIT_LEN=4096 -CONFIG_SOC_AES_SUPPORT_DMA=y -CONFIG_SOC_AES_GDMA=y -CONFIG_SOC_AES_SUPPORT_AES_128=y -CONFIG_SOC_AES_SUPPORT_AES_256=y -CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_WIFI_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_BT_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y -CONFIG_SOC_PM_SUPPORT_CPU_PD=y -CONFIG_SOC_PM_SUPPORT_TAGMEM_PD=y -CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y -CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y -CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y -CONFIG_SOC_PM_SUPPORT_MAC_BB_PD=y -CONFIG_SOC_PM_SUPPORT_MODEM_PD=y -CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y -CONFIG_SOC_PM_SUPPORT_DEEPSLEEP_CHECK_STUB_ONLY=y -CONFIG_SOC_PM_CPU_RETENTION_BY_RTCCNTL=y -CONFIG_SOC_PM_MODEM_RETENTION_BY_BACKUPDMA=y -CONFIG_SOC_PM_MODEM_PD_BY_SW=y -CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y -CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y -CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y -CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y -CONFIG_SOC_EFUSE_DIS_DOWNLOAD_ICACHE=y -CONFIG_SOC_EFUSE_DIS_DOWNLOAD_DCACHE=y -CONFIG_SOC_EFUSE_HARD_DIS_JTAG=y -CONFIG_SOC_EFUSE_DIS_USB_JTAG=y -CONFIG_SOC_EFUSE_SOFT_DIS_JTAG=y -CONFIG_SOC_EFUSE_DIS_DIRECT_BOOT=y -CONFIG_SOC_EFUSE_DIS_ICACHE=y -CONFIG_SOC_EFUSE_BLOCK9_KEY_PURPOSE_QUIRK=y -CONFIG_SOC_SECURE_BOOT_V2_RSA=y -CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=3 -CONFIG_SOC_EFUSE_REVOKE_BOOT_KEY_DIGESTS=y -CONFIG_SOC_SUPPORT_SECURE_BOOT_REVOKE_KEY=y -CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=64 -CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES=y -CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_OPTIONS=y -CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_128=y -CONFIG_SOC_FLASH_ENCRYPTION_XTS_AES_256=y -CONFIG_SOC_MEMPROT_CPU_PREFETCH_PAD_SIZE=16 -CONFIG_SOC_MEMPROT_MEM_ALIGN_SIZE=256 -CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21 -CONFIG_SOC_MAC_BB_PD_MEM_SIZE=192 -CONFIG_SOC_WIFI_LIGHT_SLEEP_CLK_WIDTH=12 -CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_WAIT_IDLE=y -CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_SUSPEND=y -CONFIG_SOC_SPI_MEM_SUPPORT_AUTO_RESUME=y -CONFIG_SOC_SPI_MEM_SUPPORT_SW_SUSPEND=y -CONFIG_SOC_SPI_MEM_SUPPORT_OPI_MODE=y -CONFIG_SOC_SPI_MEM_SUPPORT_TIMING_TUNING=y -CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y -CONFIG_SOC_SPI_MEM_SUPPORT_WRAP=y -CONFIG_SOC_MEMSPI_TIMING_TUNING_BY_MSPI_DELAY=y -CONFIG_SOC_MEMSPI_CORE_CLK_SHARED_WITH_PSRAM=y -CONFIG_SOC_SPI_MEM_SUPPORT_CACHE_32BIT_ADDR_MAP=y -CONFIG_SOC_COEX_HW_PTI=y -CONFIG_SOC_EXTERNAL_COEX_LEADER_TX_LINE=y -CONFIG_SOC_SDMMC_USE_GPIO_MATRIX=y -CONFIG_SOC_SDMMC_NUM_SLOTS=2 -CONFIG_SOC_SDMMC_SUPPORT_XTAL_CLOCK=y -CONFIG_SOC_SDMMC_DELAY_PHASE_NUM=4 -CONFIG_SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC=y -CONFIG_SOC_WIFI_HW_TSF=y -CONFIG_SOC_WIFI_FTM_SUPPORT=y -CONFIG_SOC_WIFI_GCMP_SUPPORT=y -CONFIG_SOC_WIFI_WAPI_SUPPORT=y -CONFIG_SOC_WIFI_CSI_SUPPORT=y -CONFIG_SOC_WIFI_MESH_SUPPORT=y -CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y -CONFIG_SOC_WIFI_PHY_NEEDS_USB_WORKAROUND=y -CONFIG_SOC_BLE_SUPPORTED=y -CONFIG_SOC_BLE_MESH_SUPPORTED=y -CONFIG_SOC_BLE_50_SUPPORTED=y -CONFIG_SOC_BLE_DEVICE_PRIVACY_SUPPORTED=y -CONFIG_SOC_BLUFI_SUPPORTED=y -CONFIG_SOC_ULP_HAS_ADC=y -CONFIG_SOC_PHY_COMBO_MODULE=y -CONFIG_IDF_CMAKE=y -CONFIG_IDF_TOOLCHAIN="gcc" -CONFIG_IDF_TOOLCHAIN_GCC=y -CONFIG_IDF_TARGET_ARCH_XTENSA=y -CONFIG_IDF_TARGET_ARCH="xtensa" -CONFIG_IDF_TARGET="esp32s3" -CONFIG_IDF_INIT_VERSION="5.4.0" -CONFIG_IDF_TARGET_ESP32S3=y -CONFIG_IDF_FIRMWARE_CHIP_ID=0x0009 - -# -# Build type -# -CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y -# CONFIG_APP_BUILD_TYPE_RAM is not set -CONFIG_APP_BUILD_GENERATE_BINARIES=y -CONFIG_APP_BUILD_BOOTLOADER=y -CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y -# CONFIG_APP_REPRODUCIBLE_BUILD is not set -# CONFIG_APP_NO_BLOBS is not set -# end of Build type - -# -# Bootloader config -# - -# -# Bootloader manager -# -CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y -CONFIG_BOOTLOADER_PROJECT_VER=1 -# end of Bootloader manager - -CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x0 -# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE is not set -# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set -CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF=y -# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set - -# -# Log -# -CONFIG_BOOTLOADER_LOG_LEVEL_NONE=y -# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set -# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set -CONFIG_BOOTLOADER_LOG_LEVEL=0 - -# -# Format -# -# CONFIG_BOOTLOADER_LOG_COLORS is not set -CONFIG_BOOTLOADER_LOG_TIMESTAMP_SOURCE_CPU_TICKS=y -# end of Format -# end of Log - -# -# Serial Flash Configurations -# -# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set -CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y -# end of Serial Flash Configurations - -CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y -# CONFIG_BOOTLOADER_FACTORY_RESET is not set -# CONFIG_BOOTLOADER_APP_TEST is not set -CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y -CONFIG_BOOTLOADER_WDT_ENABLE=y -# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set -CONFIG_BOOTLOADER_WDT_TIME_MS=9000 -CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y -# CONFIG_BOOTLOADER_APP_ANTI_ROLLBACK is not set -CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP=y -CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON=y -CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS=y -CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0x10 -# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set -CONFIG_BOOTLOADER_RESERVE_RTC_MEM=y -# end of Bootloader config - -# -# Security features -# -CONFIG_SECURE_BOOT_V2_RSA_SUPPORTED=y -CONFIG_SECURE_BOOT_V2_PREFERRED=y -# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set -# CONFIG_SECURE_BOOT is not set -# CONFIG_SECURE_FLASH_ENC_ENABLED is not set -CONFIG_SECURE_ROM_DL_MODE_ENABLED=y -# end of Security features - -# -# Application manager -# -CONFIG_APP_COMPILE_TIME_DATE=y -# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set -# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set -# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set -CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9 -# end of Application manager - -CONFIG_ESP_ROM_HAS_CRC_LE=y -CONFIG_ESP_ROM_HAS_CRC_BE=y -CONFIG_ESP_ROM_HAS_MZ_CRC32=y -CONFIG_ESP_ROM_HAS_JPEG_DECODE=y -CONFIG_ESP_ROM_UART_CLK_IS_XTAL=y -CONFIG_ESP_ROM_HAS_RETARGETABLE_LOCKING=y -CONFIG_ESP_ROM_USB_OTG_NUM=3 -CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=4 -CONFIG_ESP_ROM_HAS_ERASE_0_REGION_BUG=y -CONFIG_ESP_ROM_HAS_ENCRYPTED_WRITES_USING_LEGACY_DRV=y -CONFIG_ESP_ROM_GET_CLK_FREQ=y -CONFIG_ESP_ROM_HAS_HAL_WDT=y -CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y -CONFIG_ESP_ROM_HAS_LAYOUT_TABLE=y -CONFIG_ESP_ROM_HAS_SPI_FLASH=y -CONFIG_ESP_ROM_HAS_ETS_PRINTF_BUG=y -CONFIG_ESP_ROM_HAS_NEWLIB=y -CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y -CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y -CONFIG_ESP_ROM_NEEDS_SET_CACHE_MMU_SIZE=y -CONFIG_ESP_ROM_RAM_APP_NEEDS_MMU_INIT=y -CONFIG_ESP_ROM_HAS_FLASH_COUNT_PAGES_BUG=y -CONFIG_ESP_ROM_HAS_CACHE_SUSPEND_WAITI_BUG=y -CONFIG_ESP_ROM_HAS_CACHE_WRITEBACK_BUG=y -CONFIG_ESP_ROM_HAS_SW_FLOAT=y -CONFIG_ESP_ROM_HAS_VERSION=y -CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y -CONFIG_ESP_ROM_HAS_OUTPUT_PUTC_FUNC=y - -# -# Boot ROM Behavior -# -CONFIG_BOOT_ROM_LOG_ALWAYS_ON=y -# CONFIG_BOOT_ROM_LOG_ALWAYS_OFF is not set -# CONFIG_BOOT_ROM_LOG_ON_GPIO_HIGH is not set -# CONFIG_BOOT_ROM_LOG_ON_GPIO_LOW is not set -# end of Boot ROM Behavior - -# -# Serial flasher config -# -# CONFIG_ESPTOOLPY_NO_STUB is not set -# CONFIG_ESPTOOLPY_OCT_FLASH is not set -CONFIG_ESPTOOLPY_FLASH_MODE_AUTO_DETECT=y -CONFIG_ESPTOOLPY_FLASHMODE_QIO=y -# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set -# CONFIG_ESPTOOLPY_FLASHMODE_DIO is not set -# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set -CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y -CONFIG_ESPTOOLPY_FLASHMODE="dio" -# CONFIG_ESPTOOLPY_FLASHFREQ_120M is not set -CONFIG_ESPTOOLPY_FLASHFREQ_80M=y -# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set -# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -CONFIG_ESPTOOLPY_FLASHFREQ="80m" -# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set -CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y -# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set -# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set -CONFIG_ESPTOOLPY_FLASHSIZE="16MB" -# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set -CONFIG_ESPTOOLPY_BEFORE_RESET=y -# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set -CONFIG_ESPTOOLPY_BEFORE="default_reset" -CONFIG_ESPTOOLPY_AFTER_RESET=y -# CONFIG_ESPTOOLPY_AFTER_NORESET is not set -CONFIG_ESPTOOLPY_AFTER="hard_reset" -CONFIG_ESPTOOLPY_MONITOR_BAUD=115200 -# end of Serial flasher config - -# -# Partition Table -# -# CONFIG_PARTITION_TABLE_SINGLE_APP is not set -# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set -# CONFIG_PARTITION_TABLE_TWO_OTA is not set -# CONFIG_PARTITION_TABLE_TWO_OTA_LARGE is not set -CONFIG_PARTITION_TABLE_CUSTOM=y -CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions/v1/16m.csv" -CONFIG_PARTITION_TABLE_FILENAME="partitions/v1/16m.csv" -CONFIG_PARTITION_TABLE_OFFSET=0x8000 -CONFIG_PARTITION_TABLE_MD5=y -# end of Partition Table - -# -# Xiaozhi Assistant -# -CONFIG_OTA_URL="https://api.tenclass.net/xiaozhi/ota/" -CONFIG_LANGUAGE_ZH_CN=y -# CONFIG_LANGUAGE_ZH_TW is not set -# CONFIG_LANGUAGE_EN_US is not set -# CONFIG_LANGUAGE_JA_JP is not set -# CONFIG_BOARD_TYPE_BREAD_COMPACT_WIFI is not set -# CONFIG_BOARD_TYPE_BREAD_COMPACT_WIFI_LCD is not set -# CONFIG_BOARD_TYPE_BREAD_COMPACT_ML307 is not set -# CONFIG_BOARD_TYPE_BREAD_COMPACT_ESP32 is not set -# CONFIG_BOARD_TYPE_BREAD_COMPACT_ESP32_LCD is not set -# CONFIG_BOARD_TYPE_ESP32_CGC is not set -# CONFIG_BOARD_TYPE_ESP_BOX_3 is not set -# CONFIG_BOARD_TYPE_ESP_BOX is not set -# CONFIG_BOARD_TYPE_ESP_BOX_LITE is not set -# CONFIG_BOARD_TYPE_KEVIN_BOX_1 is not set -# CONFIG_BOARD_TYPE_KEVIN_BOX_2 is not set -# CONFIG_BOARD_TYPE_KEVIN_C3 is not set -# CONFIG_BOARD_TYPE_KEVIN_SP_V3_DEV is not set -# CONFIG_BOARD_TYPE_KEVIN_SP_V4_DEV is not set -# CONFIG_BOARD_TYPE_KEVIN_YUYING_313LCD is not set -# CONFIG_BOARD_TYPE_LICHUANG_DEV is not set -# CONFIG_BOARD_TYPE_LICHUANG_C3_DEV is not set -# CONFIG_BOARD_TYPE_DF_K10 is not set -# CONFIG_BOARD_TYPE_MAGICLICK_2P4 is not set -# CONFIG_BOARD_TYPE_MAGICLICK_2P5 is not set -# CONFIG_BOARD_TYPE_MAGICLICK_C3 is not set -# CONFIG_BOARD_TYPE_MAGICLICK_C3_V2 is not set -CONFIG_BOARD_TYPE_M5STACK_CORE_S3=y -# CONFIG_BOARD_TYPE_M5STACK_CORE_TAB5 is not set -# CONFIG_BOARD_TYPE_ATOMS3_ECHO_BASE is not set -# CONFIG_BOARD_TYPE_ATOMS3R_ECHO_BASE is not set -# CONFIG_BOARD_TYPE_ATOMS3R_CAM_M12_ECHO_BASE is not set -# CONFIG_BOARD_TYPE_ATOMMATRIX_ECHO_BASE is not set -# CONFIG_BOARD_TYPE_XMINI_C3 is not set -# CONFIG_BOARD_TYPE_ESP32S3_KORVO2_V3 is not set -# CONFIG_BOARD_TYPE_ESP_SPARKBOT is not set -# CONFIG_BOARD_TYPE_ESP_SPOT_S3 is not set -# CONFIG_BOARD_TYPE_ESP32S3_Touch_AMOLED_1_8 is not set -# CONFIG_BOARD_TYPE_ESP32S3_Touch_AMOLED_1_75 is not set -# CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_1_85C is not set -# CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_1_85 is not set -# CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_1_46 is not set -# CONFIG_BOARD_TYPE_ESP32S3_Touch_LCD_3_5 is not set -# CONFIG_BOARD_TYPE_ESP32P4_NANO is not set -# CONFIG_BOARD_TYPE_TUDOUZI is not set -# CONFIG_BOARD_TYPE_LILYGO_T_CIRCLE_S3 is not set -# CONFIG_BOARD_TYPE_LILYGO_T_CAMERAPLUS_S3 is not set -# CONFIG_BOARD_TYPE_LILYGO_T_DISPLAY_S3_PRO_MVSRLORA is not set -# CONFIG_BOARD_TYPE_LILYGO_T_DISPLAY_S3_PRO_MVSRLORA_NO_BATTERY is not set -# CONFIG_BOARD_TYPE_MOVECALL_MOJI_ESP32S3 is not set -# CONFIG_BOARD_TYPE_MOVECALL_CUICAN_ESP32S3 is not set -# CONFIG_BOARD_TYPE_ATK_DNESP32S3 is not set -# CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX is not set -# CONFIG_BOARD_TYPE_ATK_DNESP32S3_BOX0 is not set -# CONFIG_BOARD_TYPE_ATK_DNESP32S3M_WIFI is not set -# CONFIG_BOARD_TYPE_ATK_DNESP32S3M_4G is not set -# CONFIG_BOARD_TYPE_DU_CHATX is not set -# CONFIG_BOARD_TYPE_ESP32S3_Taiji_Pi is not set -# CONFIG_BOARD_TYPE_XINGZHI_Cube_0_85TFT_WIFI is not set -# CONFIG_BOARD_TYPE_XINGZHI_Cube_0_85TFT_ML307 is not set -# CONFIG_BOARD_TYPE_XINGZHI_Cube_0_96OLED_WIFI is not set -# CONFIG_BOARD_TYPE_XINGZHI_Cube_0_96OLED_ML307 is not set -# CONFIG_BOARD_TYPE_XINGZHI_Cube_1_54TFT_WIFI is not set -# CONFIG_BOARD_TYPE_XINGZHI_Cube_1_54TFT_ML307 is not set -# CONFIG_BOARD_TYPE_SENSECAP_WATCHER is not set -# CONFIG_BOARD_TYPE_DOIT_S3_AIBOX is not set -# CONFIG_BOARD_TYPE_MIXGO_NOVA is not set -# CONFIG_BOARD_TYPE_GENJUTECH_S3_1_54TFT is not set -# CONFIG_BOARD_TYPE_ESP_S3_LCD_EV_Board is not set -# CONFIG_BOARD_TYPE_ESP_S3_LCD_EV_Board_2 is not set -# CONFIG_BOARD_TYPE_ZHENGCHEN_1_54TFT_WIFI is not set -# CONFIG_BOARD_TYPE_MINSI_K08_DUAL is not set -# CONFIG_BOARD_TYPE_ZHENGCHEN_1_54TFT_ML307 is not set -# CONFIG_BOARD_TYPE_ESP32_S3_1_54_MUMA is not set -# CONFIG_USE_WECHAT_MESSAGE_STYLE is not set -CONFIG_USE_WAKE_WORD_DETECT=y -CONFIG_USE_AUDIO_PROCESSOR=y -# CONFIG_USE_SERVER_AEC is not set -CONFIG_IOT_PROTOCOL_MCP=y -# CONFIG_IOT_PROTOCOL_XIAOZHI is not set -# end of Xiaozhi Assistant - -# -# ESP Speech Recognition -# -CONFIG_MODEL_IN_FLASH=y -# CONFIG_MODEL_IN_SDCARD is not set -CONFIG_AFE_INTERFACE_V1=y -CONFIG_SR_NSN_WEBRTC=y -# CONFIG_SR_NSN_NSNET2 is not set -CONFIG_SR_VADN_WEBRTC=y -# CONFIG_SR_VADN_VADNET1_MEDIUM is not set - -# -# Load Multiple Wake Words (WakeNet9) -# -# CONFIG_SR_WN_WN9_HILEXIN is not set -# CONFIG_SR_WN_WN9_XIAOAITONGXUE is not set -CONFIG_SR_WN_WN9_NIHAOXIAOZHI_TTS=y -# CONFIG_SR_WN_WN9_ALEXA is not set -# CONFIG_SR_WN_WN9_HIESP is not set -# CONFIG_SR_WN_WN9_JARVIS_TTS is not set -# CONFIG_SR_WN_WN9_COMPUTER_TTS is not set -# CONFIG_SR_WN_WN9_HEYWILLOW_TTS is not set -# CONFIG_SR_WN_WN9_SOPHIA_TTS is not set -# CONFIG_SR_WN_WN9_NIHAOXIAOXIN_TTS is not set -# CONFIG_SR_WN_WN9_XIAOMEITONGXUE_TTS is not set -# CONFIG_SR_WN_WN9_HEYPRINTER_TTS is not set -# CONFIG_SR_WN_WN9_XIAOLONGXIAOLONG_TTS is not set -# CONFIG_SR_WN_WN9_MIAOMIAOTONGXUE_TTS is not set -# CONFIG_SR_WN_WN9_HEYWANDA_TTS is not set -# CONFIG_SR_WN_WN9_HIMIAOMIAO_TTS is not set -# CONFIG_SR_WN_WN9_MYCROFT_TTS is not set -# CONFIG_SR_WN_WN9_HIJOY_TTS is not set -# CONFIG_SR_WN_WN9_HILILI_TTS is not set -# CONFIG_SR_WN_WN9_HITELLY_TTS is not set -# CONFIG_SR_WN_WN9_XIAOBINXIAOBIN_TTS is not set -# CONFIG_SR_WN_WN9_HAIXIAOWU_TTS is not set -# CONFIG_SR_WN_WN9_ASTROLABE_TTS is not set -# CONFIG_SR_WN_WN9_HEYILY_TTS2 is not set -# CONFIG_SR_WN_WN9_XIAOYAXIAOYA_TTS2 is not set -# CONFIG_SR_WN_WN9_HIJASON_TTS2 is not set -# CONFIG_SR_WN_WN9_LINAIBAN_TTS2 is not set -# CONFIG_SR_WN_WN9_XIAOSUROU_TTS2 is not set -# CONFIG_SR_WN_WN9_XIAOYUTONGXUE_TTS2 is not set -# CONFIG_SR_WN_WN9_XIAOMINGTONGXUE_TTS2 is not set -# CONFIG_SR_WN_WN9_XIAOKANGTONGXUE_TTS2 is not set -# CONFIG_SR_WN_WN9_XIAOJIANXIAOJIAN_TTS2 is not set -# CONFIG_SR_WN_WN9_XIAOTEXIAOTE_TTS2 is not set -# CONFIG_SR_WN_WN9_NIHAOXIAOYI_TTS2 is not set -# CONFIG_SR_WN_WN9_NIHAOBAIYING_TTS2 is not set -# CONFIG_SR_WN_WN9_HIWALLE_TTS2 is not set -# end of Load Multiple Wake Words (WakeNet9) - -CONFIG_SR_MN_CN_NONE=y -# CONFIG_SR_MN_CN_MULTINET5_RECOGNITION_QUANT8 is not set -# CONFIG_SR_MN_CN_MULTINET6_QUANT is not set -# CONFIG_SR_MN_CN_MULTINET6_AC_QUANT is not set -# CONFIG_SR_MN_CN_MULTINET7_QUANT is not set -# CONFIG_SR_MN_CN_MULTINET7_AC_QUANT is not set -CONFIG_SR_MN_EN_NONE=y -# CONFIG_SR_MN_EN_MULTINET5_SINGLE_RECOGNITION_QUANT8 is not set -# CONFIG_SR_MN_EN_MULTINET6_QUANT is not set -# CONFIG_SR_MN_EN_MULTINET7_QUANT is not set -# end of ESP Speech Recognition - -# -# Compiler options -# -CONFIG_COMPILER_OPTIMIZATION_DEBUG=y -# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set -# CONFIG_COMPILER_OPTIMIZATION_PERF is not set -# CONFIG_COMPILER_OPTIMIZATION_NONE is not set -CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y -# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set -# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set -CONFIG_COMPILER_ASSERT_NDEBUG_EVALUATE=y -CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y -CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2 -# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set -CONFIG_COMPILER_HIDE_PATHS_MACROS=y -CONFIG_COMPILER_CXX_EXCEPTIONS=y -CONFIG_COMPILER_CXX_EXCEPTIONS_EMG_POOL_SIZE=1024 -# CONFIG_COMPILER_CXX_RTTI is not set -CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y -# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set -# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set -# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set -# CONFIG_COMPILER_NO_MERGE_CONSTANTS is not set -# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set -CONFIG_COMPILER_DISABLE_DEFAULT_ERRORS=y -# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set -# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set -# CONFIG_COMPILER_DISABLE_GCC14_WARNINGS is not set -# CONFIG_COMPILER_DUMP_RTL_FILES is not set -CONFIG_COMPILER_RT_LIB_GCCLIB=y -CONFIG_COMPILER_RT_LIB_NAME="gcc" -CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING=y -# CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE is not set -# CONFIG_COMPILER_STATIC_ANALYZER is not set -# end of Compiler options - -# -# Component config -# - -# -# Application Level Tracing -# -# CONFIG_APPTRACE_DEST_JTAG is not set -CONFIG_APPTRACE_DEST_NONE=y -# CONFIG_APPTRACE_DEST_UART1 is not set -# CONFIG_APPTRACE_DEST_UART2 is not set -# CONFIG_APPTRACE_DEST_USB_CDC is not set -CONFIG_APPTRACE_DEST_UART_NONE=y -CONFIG_APPTRACE_UART_TASK_PRIO=1 -CONFIG_APPTRACE_LOCK_ENABLE=y -# end of Application Level Tracing - -# -# Bluetooth -# -# CONFIG_BT_ENABLED is not set -CONFIG_BT_ALARM_MAX_NUM=50 -# end of Bluetooth - -# -# Console Library -# -# CONFIG_CONSOLE_SORTED_HELP is not set -# end of Console Library - -# -# Driver Configurations -# - -# -# TWAI Configuration -# -# CONFIG_TWAI_ISR_IN_IRAM is not set -CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y -# end of TWAI Configuration - -# -# Legacy ADC Driver Configuration -# -# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set - -# -# Legacy ADC Calibration Configuration -# -# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set -# end of Legacy ADC Calibration Configuration -# end of Legacy ADC Driver Configuration - -# -# Legacy MCPWM Driver Configurations -# -# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set -# end of Legacy MCPWM Driver Configurations - -# -# Legacy Timer Group Driver Configurations -# -# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set -# end of Legacy Timer Group Driver Configurations - -# -# Legacy RMT Driver Configurations -# -# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set -# end of Legacy RMT Driver Configurations - -# -# Legacy I2S Driver Configurations -# -# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set -# end of Legacy I2S Driver Configurations - -# -# Legacy PCNT Driver Configurations -# -# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set -# end of Legacy PCNT Driver Configurations - -# -# Legacy SDM Driver Configurations -# -# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set -# end of Legacy SDM Driver Configurations - -# -# Legacy Temperature Sensor Driver Configurations -# -# CONFIG_TEMP_SENSOR_SUPPRESS_DEPRECATE_WARN is not set -# end of Legacy Temperature Sensor Driver Configurations -# end of Driver Configurations - -# -# eFuse Bit Manager -# -# CONFIG_EFUSE_CUSTOM_TABLE is not set -# CONFIG_EFUSE_VIRTUAL is not set -CONFIG_EFUSE_MAX_BLK_LEN=256 -# end of eFuse Bit Manager - -# -# ESP-TLS -# -CONFIG_ESP_TLS_USING_MBEDTLS=y -CONFIG_ESP_TLS_USE_DS_PERIPHERAL=y -# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set -# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set -# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set -# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set -# CONFIG_ESP_TLS_PSK_VERIFICATION is not set -# CONFIG_ESP_TLS_INSECURE is not set -# end of ESP-TLS - -# -# ADC and ADC Calibration -# -# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set -# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set -# CONFIG_ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3 is not set -# CONFIG_ADC_ENABLE_DEBUG_LOG is not set -# end of ADC and ADC Calibration - -# -# Wireless Coexistence -# -CONFIG_ESP_COEX_ENABLED=y -# CONFIG_ESP_COEX_EXTERNAL_COEXIST_ENABLE is not set -# CONFIG_ESP_COEX_GPIO_DEBUG is not set -# end of Wireless Coexistence - -# -# Common ESP-related -# -CONFIG_ESP_ERR_TO_NAME_LOOKUP=y -# end of Common ESP-related - -# -# ESP-Driver:GPIO Configurations -# -# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set -# end of ESP-Driver:GPIO Configurations - -# -# ESP-Driver:GPTimer Configurations -# -CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y -# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set -# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set -# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:GPTimer Configurations - -# -# ESP-Driver:I2C Configurations -# -# CONFIG_I2C_ISR_IRAM_SAFE is not set -# CONFIG_I2C_ENABLE_DEBUG_LOG is not set -# CONFIG_I2C_ENABLE_SLAVE_DRIVER_VERSION_2 is not set -# end of ESP-Driver:I2C Configurations - -# -# ESP-Driver:I2S Configurations -# -# CONFIG_I2S_ISR_IRAM_SAFE is not set -# CONFIG_I2S_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:I2S Configurations - -# -# ESP-Driver:LEDC Configurations -# -# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set -# end of ESP-Driver:LEDC Configurations - -# -# ESP-Driver:MCPWM Configurations -# -# CONFIG_MCPWM_ISR_IRAM_SAFE is not set -# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set -# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:MCPWM Configurations - -# -# ESP-Driver:PCNT Configurations -# -# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set -# CONFIG_PCNT_ISR_IRAM_SAFE is not set -# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:PCNT Configurations - -# -# ESP-Driver:RMT Configurations -# -# CONFIG_RMT_ISR_IRAM_SAFE is not set -# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set -# CONFIG_RMT_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:RMT Configurations - -# -# ESP-Driver:Sigma Delta Modulator Configurations -# -# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set -# CONFIG_SDM_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:Sigma Delta Modulator Configurations - -# -# ESP-Driver:SPI Configurations -# -# CONFIG_SPI_MASTER_IN_IRAM is not set -CONFIG_SPI_MASTER_ISR_IN_IRAM=y -# CONFIG_SPI_SLAVE_IN_IRAM is not set -CONFIG_SPI_SLAVE_ISR_IN_IRAM=y -# end of ESP-Driver:SPI Configurations - -# -# ESP-Driver:Touch Sensor Configurations -# -# CONFIG_TOUCH_CTRL_FUNC_IN_IRAM is not set -# CONFIG_TOUCH_ISR_IRAM_SAFE is not set -# CONFIG_TOUCH_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:Touch Sensor Configurations - -# -# ESP-Driver:Temperature Sensor Configurations -# -# CONFIG_TEMP_SENSOR_ENABLE_DEBUG_LOG is not set -# end of ESP-Driver:Temperature Sensor Configurations - -# -# ESP-Driver:UART Configurations -# -CONFIG_UART_ISR_IN_IRAM=y -# end of ESP-Driver:UART Configurations - -# -# ESP-Driver:USB Serial/JTAG Configuration -# -CONFIG_USJ_ENABLE_USB_SERIAL_JTAG=y -# end of ESP-Driver:USB Serial/JTAG Configuration - -# -# Ethernet -# -CONFIG_ETH_ENABLED=y -CONFIG_ETH_USE_SPI_ETHERNET=y -# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set -# CONFIG_ETH_SPI_ETHERNET_W5500 is not set -# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set -# CONFIG_ETH_USE_OPENETH is not set -# CONFIG_ETH_TRANSMIT_MUTEX is not set -# end of Ethernet - -# -# Event Loop Library -# -# CONFIG_ESP_EVENT_LOOP_PROFILING is not set -CONFIG_ESP_EVENT_POST_FROM_ISR=y -CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y -# end of Event Loop Library - -# -# GDB Stub -# -CONFIG_ESP_GDBSTUB_ENABLED=y -# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set -CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y -CONFIG_ESP_GDBSTUB_MAX_TASKS=32 -# end of GDB Stub - -# -# ESP HTTP client -# -CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y -# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set -# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set -# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set -CONFIG_ESP_HTTP_CLIENT_EVENT_POST_TIMEOUT=2000 -# end of ESP HTTP client - -# -# HTTP Server -# -CONFIG_HTTPD_MAX_REQ_HDR_LEN=2048 -CONFIG_HTTPD_MAX_URI_LEN=2048 -CONFIG_HTTPD_ERR_RESP_NO_DELAY=y -CONFIG_HTTPD_PURGE_BUF_LEN=32 -# CONFIG_HTTPD_LOG_PURGE_DATA is not set -# CONFIG_HTTPD_WS_SUPPORT is not set -# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set -CONFIG_HTTPD_SERVER_EVENT_POST_TIMEOUT=2000 -# end of HTTP Server - -# -# ESP HTTPS OTA -# -# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set -# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set -CONFIG_ESP_HTTPS_OTA_EVENT_POST_TIMEOUT=2000 -# end of ESP HTTPS OTA - -# -# ESP HTTPS server -# -# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set -CONFIG_ESP_HTTPS_SERVER_EVENT_POST_TIMEOUT=2000 -# end of ESP HTTPS server - -# -# Hardware Settings -# - -# -# Chip revision -# -CONFIG_ESP32S3_REV_MIN_0=y -# CONFIG_ESP32S3_REV_MIN_1 is not set -# CONFIG_ESP32S3_REV_MIN_2 is not set -CONFIG_ESP32S3_REV_MIN_FULL=0 -CONFIG_ESP_REV_MIN_FULL=0 - -# -# Maximum Supported ESP32-S3 Revision (Rev v0.99) -# -CONFIG_ESP32S3_REV_MAX_FULL=99 -CONFIG_ESP_REV_MAX_FULL=99 -CONFIG_ESP_EFUSE_BLOCK_REV_MIN_FULL=0 -CONFIG_ESP_EFUSE_BLOCK_REV_MAX_FULL=199 - -# -# Maximum Supported ESP32-S3 eFuse Block Revision (eFuse Block Rev v1.99) -# -# end of Chip revision - -# -# MAC Config -# -CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y -CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y -CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y -CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y -CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y -CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4 -# CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_TWO is not set -CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR=y -CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES=4 -# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set -# end of MAC Config - -# -# Sleep Config -# -CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y -CONFIG_ESP_SLEEP_PSRAM_LEAKAGE_WORKAROUND=y -CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU=y -CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y -CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y -CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000 -# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set -# CONFIG_ESP_SLEEP_DEBUG is not set -CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y -# end of Sleep Config - -# -# RTC Clock Config -# -CONFIG_RTC_CLK_SRC_INT_RC=y -# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set -# CONFIG_RTC_CLK_SRC_EXT_OSC is not set -# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set -CONFIG_RTC_CLK_CAL_CYCLES=1024 -# end of RTC Clock Config - -# -# Peripheral Control -# -CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y -# end of Peripheral Control - -# -# GDMA Configurations -# -CONFIG_GDMA_CTRL_FUNC_IN_IRAM=y -# CONFIG_GDMA_ISR_IRAM_SAFE is not set -# CONFIG_GDMA_ENABLE_DEBUG_LOG is not set -# end of GDMA Configurations - -# -# Main XTAL Config -# -CONFIG_XTAL_FREQ_40=y -CONFIG_XTAL_FREQ=40 -# end of Main XTAL Config - -CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y -# end of Hardware Settings - -# -# ESP-Driver:LCD Controller Configurations -# -# CONFIG_LCD_ENABLE_DEBUG_LOG is not set -# CONFIG_LCD_RGB_ISR_IRAM_SAFE is not set -# CONFIG_LCD_RGB_RESTART_IN_VSYNC is not set -# end of ESP-Driver:LCD Controller Configurations - -# -# ESP-MM: Memory Management Configurations -# -# CONFIG_ESP_MM_CACHE_MSYNC_C2M_CHUNKED_OPS is not set -# end of ESP-MM: Memory Management Configurations - -# -# ESP NETIF Adapter -# -CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120 -# CONFIG_ESP_NETIF_PROVIDE_CUSTOM_IMPLEMENTATION is not set -CONFIG_ESP_NETIF_TCPIP_LWIP=y -# CONFIG_ESP_NETIF_LOOPBACK is not set -CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y -CONFIG_ESP_NETIF_REPORT_DATA_TRAFFIC=y -# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set -# CONFIG_ESP_NETIF_L2_TAP is not set -# CONFIG_ESP_NETIF_BRIDGE_EN is not set -# CONFIG_ESP_NETIF_SET_DNS_PER_DEFAULT_NETIF is not set -# end of ESP NETIF Adapter - -# -# Partition API Configuration -# -# end of Partition API Configuration - -# -# PHY -# -CONFIG_ESP_PHY_ENABLED=y -CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y -# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set -CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20 -CONFIG_ESP_PHY_MAX_TX_POWER=20 -# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set -CONFIG_ESP_PHY_ENABLE_USB=y -# CONFIG_ESP_PHY_ENABLE_CERT_TEST is not set -CONFIG_ESP_PHY_RF_CAL_PARTIAL=y -# CONFIG_ESP_PHY_RF_CAL_NONE is not set -# CONFIG_ESP_PHY_RF_CAL_FULL is not set -CONFIG_ESP_PHY_CALIBRATION_MODE=0 -# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set -# CONFIG_ESP_PHY_RECORD_USED_TIME is not set -# end of PHY - -# -# Power Management -# -# CONFIG_PM_ENABLE is not set -# CONFIG_PM_SLP_IRAM_OPT is not set -CONFIG_PM_POWER_DOWN_CPU_IN_LIGHT_SLEEP=y -CONFIG_PM_RESTORE_CACHE_TAGMEM_AFTER_LIGHT_SLEEP=y -# end of Power Management - -# -# ESP PSRAM -# -CONFIG_SPIRAM=y - -# -# SPI RAM config -# -CONFIG_SPIRAM_MODE_QUAD=y -# CONFIG_SPIRAM_MODE_OCT is not set -CONFIG_SPIRAM_TYPE_AUTO=y -# CONFIG_SPIRAM_TYPE_ESPPSRAM16 is not set -# CONFIG_SPIRAM_TYPE_ESPPSRAM32 is not set -# CONFIG_SPIRAM_TYPE_ESPPSRAM64 is not set -CONFIG_SPIRAM_CLK_IO=30 -CONFIG_SPIRAM_CS_IO=26 -# CONFIG_SPIRAM_XIP_FROM_PSRAM is not set -# CONFIG_SPIRAM_FETCH_INSTRUCTIONS is not set -# CONFIG_SPIRAM_RODATA is not set -# CONFIG_SPIRAM_SPEED_120M is not set -CONFIG_SPIRAM_SPEED_80M=y -# CONFIG_SPIRAM_SPEED_40M is not set -CONFIG_SPIRAM_SPEED=80 -CONFIG_SPIRAM_BOOT_INIT=y -# CONFIG_SPIRAM_IGNORE_NOTFOUND is not set -# CONFIG_SPIRAM_USE_MEMMAP is not set -# CONFIG_SPIRAM_USE_CAPS_ALLOC is not set -CONFIG_SPIRAM_USE_MALLOC=y -# CONFIG_SPIRAM_MEMTEST is not set -CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=4096 -# CONFIG_SPIRAM_TRY_ALLOCATE_WIFI_LWIP is not set -CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=49152 -# CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY is not set -# CONFIG_SPIRAM_ALLOW_NOINIT_SEG_EXTERNAL_MEMORY is not set -# end of SPI RAM config -# end of ESP PSRAM - -# -# ESP Ringbuf -# -# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set -# end of ESP Ringbuf - -# -# ESP Security Specific -# -# end of ESP Security Specific - -# -# ESP System Settings -# -# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set -# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set -CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y -CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240 - -# -# Cache config -# -# CONFIG_ESP32S3_INSTRUCTION_CACHE_16KB is not set -CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB=y -CONFIG_ESP32S3_INSTRUCTION_CACHE_SIZE=0x8000 -# CONFIG_ESP32S3_INSTRUCTION_CACHE_4WAYS is not set -CONFIG_ESP32S3_INSTRUCTION_CACHE_8WAYS=y -CONFIG_ESP32S3_ICACHE_ASSOCIATED_WAYS=8 -CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_32B=y -CONFIG_ESP32S3_INSTRUCTION_CACHE_LINE_SIZE=32 -# CONFIG_ESP32S3_DATA_CACHE_16KB is not set -# CONFIG_ESP32S3_DATA_CACHE_32KB is not set -CONFIG_ESP32S3_DATA_CACHE_64KB=y -CONFIG_ESP32S3_DATA_CACHE_SIZE=0x10000 -# CONFIG_ESP32S3_DATA_CACHE_4WAYS is not set -CONFIG_ESP32S3_DATA_CACHE_8WAYS=y -CONFIG_ESP32S3_DCACHE_ASSOCIATED_WAYS=8 -# CONFIG_ESP32S3_DATA_CACHE_LINE_32B is not set -CONFIG_ESP32S3_DATA_CACHE_LINE_64B=y -CONFIG_ESP32S3_DATA_CACHE_LINE_SIZE=64 -# end of Cache config - -# -# Memory -# -# CONFIG_ESP32S3_RTCDATA_IN_FAST_MEM is not set -# CONFIG_ESP32S3_USE_FIXED_STATIC_RAM_SIZE is not set -# end of Memory - -# -# Trace memory -# -# CONFIG_ESP32S3_TRAX is not set -CONFIG_ESP32S3_TRACEMEM_RESERVE_DRAM=0x0 -# end of Trace memory - -# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set -CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y -# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set -# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set -CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0 -CONFIG_ESP_SYSTEM_RTC_FAST_MEM_AS_HEAP_DEPCHECK=y -CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y - -# -# Memory protection -# -CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=y -CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=y -# end of Memory protection - -CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32 -CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=4096 -CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192 -CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y -# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set -# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set -CONFIG_ESP_MAIN_TASK_AFFINITY=0x0 -CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048 -CONFIG_ESP_CONSOLE_UART_DEFAULT=y -# CONFIG_ESP_CONSOLE_USB_CDC is not set -# CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG is not set -# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set -# CONFIG_ESP_CONSOLE_NONE is not set -# CONFIG_ESP_CONSOLE_SECONDARY_NONE is not set -CONFIG_ESP_CONSOLE_SECONDARY_USB_SERIAL_JTAG=y -CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG_ENABLED=y -CONFIG_ESP_CONSOLE_UART=y -CONFIG_ESP_CONSOLE_UART_NUM=0 -CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0 -CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200 -CONFIG_ESP_INT_WDT=y -CONFIG_ESP_INT_WDT_TIMEOUT_MS=300 -CONFIG_ESP_INT_WDT_CHECK_CPU1=y -CONFIG_ESP_TASK_WDT_EN=y -CONFIG_ESP_TASK_WDT_INIT=y -# CONFIG_ESP_TASK_WDT_PANIC is not set -CONFIG_ESP_TASK_WDT_TIMEOUT_S=10 -CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y -CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y -# CONFIG_ESP_PANIC_HANDLER_IRAM is not set -# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set -CONFIG_ESP_DEBUG_OCDAWARE=y -CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4=y - -# -# Brownout Detector -# -CONFIG_ESP_BROWNOUT_DET=y -CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7=y -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set -CONFIG_ESP_BROWNOUT_DET_LVL=7 -# end of Brownout Detector - -CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y -CONFIG_ESP_SYSTEM_BBPLL_RECALIB=y -# end of ESP System Settings - -# -# IPC (Inter-Processor Call) -# -CONFIG_ESP_IPC_TASK_STACK_SIZE=1280 -CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y -CONFIG_ESP_IPC_ISR_ENABLE=y -# end of IPC (Inter-Processor Call) - -# -# ESP Timer (High Resolution Timer) -# -# CONFIG_ESP_TIMER_PROFILING is not set -CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y -CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y -CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584 -CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1 -# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set -CONFIG_ESP_TIMER_TASK_AFFINITY=0x0 -CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y -CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y -# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set -CONFIG_ESP_TIMER_IMPL_SYSTIMER=y -# end of ESP Timer (High Resolution Timer) - -# -# Wi-Fi -# -CONFIG_ESP_WIFI_ENABLED=y -CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=6 -CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=8 -# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set -CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y -CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1 -CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=32 -# CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER is not set -CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER=y -CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=1 -CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5 -# CONFIG_ESP_WIFI_CSI_ENABLED is not set -CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y -CONFIG_ESP_WIFI_TX_BA_WIN=6 -CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP_WIFI_RX_BA_WIN=6 -CONFIG_ESP_WIFI_NVS_ENABLED=y -CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=y -# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1 is not set -CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752 -CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32 -# CONFIG_ESP_WIFI_IRAM_OPT is not set -# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set -# CONFIG_ESP_WIFI_RX_IRAM_OPT is not set -CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y -CONFIG_ESP_WIFI_ENABLE_SAE_PK=y -CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y -CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y -# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set -CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50 -CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10 -CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15 -# CONFIG_ESP_WIFI_FTM_ENABLE is not set -CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y -# CONFIG_ESP_WIFI_GCMP_SUPPORT is not set -CONFIG_ESP_WIFI_GMAC_SUPPORT=y -CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y -# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set -CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7 -CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y -CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y -# CONFIG_ESP_WIFI_WAPI_PSK is not set -# CONFIG_ESP_WIFI_SUITE_B_192 is not set -# CONFIG_ESP_WIFI_11KV_SUPPORT is not set -# CONFIG_ESP_WIFI_MBO_SUPPORT is not set -# CONFIG_ESP_WIFI_DPP_SUPPORT is not set -# CONFIG_ESP_WIFI_11R_SUPPORT is not set -# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set - -# -# WPS Configuration Options -# -# CONFIG_ESP_WIFI_WPS_STRICT is not set -# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set -# end of WPS Configuration Options - -# CONFIG_ESP_WIFI_DEBUG_PRINT is not set -# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set -CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y -# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set -# end of Wi-Fi - -# -# Core dump -# -# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set -# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set -CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y -# end of Core dump - -# -# FAT Filesystem support -# -CONFIG_FATFS_VOLUME_COUNT=2 -CONFIG_FATFS_LFN_NONE=y -# CONFIG_FATFS_LFN_HEAP is not set -# CONFIG_FATFS_LFN_STACK is not set -# CONFIG_FATFS_SECTOR_512 is not set -CONFIG_FATFS_SECTOR_4096=y -# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set -CONFIG_FATFS_CODEPAGE_437=y -# CONFIG_FATFS_CODEPAGE_720 is not set -# CONFIG_FATFS_CODEPAGE_737 is not set -# CONFIG_FATFS_CODEPAGE_771 is not set -# CONFIG_FATFS_CODEPAGE_775 is not set -# CONFIG_FATFS_CODEPAGE_850 is not set -# CONFIG_FATFS_CODEPAGE_852 is not set -# CONFIG_FATFS_CODEPAGE_855 is not set -# CONFIG_FATFS_CODEPAGE_857 is not set -# CONFIG_FATFS_CODEPAGE_860 is not set -# CONFIG_FATFS_CODEPAGE_861 is not set -# CONFIG_FATFS_CODEPAGE_862 is not set -# CONFIG_FATFS_CODEPAGE_863 is not set -# CONFIG_FATFS_CODEPAGE_864 is not set -# CONFIG_FATFS_CODEPAGE_865 is not set -# CONFIG_FATFS_CODEPAGE_866 is not set -# CONFIG_FATFS_CODEPAGE_869 is not set -# CONFIG_FATFS_CODEPAGE_932 is not set -# CONFIG_FATFS_CODEPAGE_936 is not set -# CONFIG_FATFS_CODEPAGE_949 is not set -# CONFIG_FATFS_CODEPAGE_950 is not set -CONFIG_FATFS_CODEPAGE=437 -CONFIG_FATFS_FS_LOCK=0 -CONFIG_FATFS_TIMEOUT_MS=10000 -CONFIG_FATFS_PER_FILE_CACHE=y -CONFIG_FATFS_ALLOC_PREFER_EXTRAM=y -# CONFIG_FATFS_USE_FASTSEEK is not set -CONFIG_FATFS_USE_STRFUNC_NONE=y -# CONFIG_FATFS_USE_STRFUNC_WITHOUT_CRLF_CONV is not set -# CONFIG_FATFS_USE_STRFUNC_WITH_CRLF_CONV is not set -CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0 -# CONFIG_FATFS_IMMEDIATE_FSYNC is not set -# CONFIG_FATFS_USE_LABEL is not set -CONFIG_FATFS_LINK_LOCK=y -# end of FAT Filesystem support - -# -# FreeRTOS -# - -# -# Kernel -# -# CONFIG_FREERTOS_SMP is not set -# CONFIG_FREERTOS_UNICORE is not set -CONFIG_FREERTOS_HZ=100 -# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set -# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set -CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y -CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1 -CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536 -# CONFIG_FREERTOS_USE_IDLE_HOOK is not set -# CONFIG_FREERTOS_USE_TICK_HOOK is not set -CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16 -# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set -CONFIG_FREERTOS_USE_TIMERS=y -CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc" -# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set -# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set -CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y -CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF -CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1 -CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048 -CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10 -CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 -CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1 -CONFIG_FREERTOS_USE_TRACE_FACILITY=y -CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y -# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set -# CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID is not set -CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y -CONFIG_FREERTOS_RUN_TIME_COUNTER_TYPE_U32=y -# CONFIG_FREERTOS_RUN_TIME_COUNTER_TYPE_U64 is not set -# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set -# end of Kernel - -# -# Port -# -CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y -# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set -CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y -# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set -# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set -CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y -CONFIG_FREERTOS_ISR_STACKSIZE=1536 -CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y -# CONFIG_FREERTOS_FPU_IN_ISR is not set -CONFIG_FREERTOS_TICK_SUPPORT_SYSTIMER=y -CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL1=y -# CONFIG_FREERTOS_CORETIMER_SYSTIMER_LVL3 is not set -CONFIG_FREERTOS_SYSTICK_USES_SYSTIMER=y -CONFIG_FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER=y -# CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set -# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set -# end of Port - -# -# Extra -# -CONFIG_FREERTOS_TASK_CREATE_ALLOW_EXT_MEM=y -# end of Extra - -CONFIG_FREERTOS_PORT=y -CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF -CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y -CONFIG_FREERTOS_DEBUG_OCDAWARE=y -CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y -CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y -CONFIG_FREERTOS_NUMBER_OF_CORES=2 -# end of FreeRTOS - -# -# Hardware Abstraction Layer (HAL) and Low Level (LL) -# -CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y -# CONFIG_HAL_ASSERTION_DISABLE is not set -# CONFIG_HAL_ASSERTION_SILENT is not set -# CONFIG_HAL_ASSERTION_ENABLE is not set -CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2 -CONFIG_HAL_WDT_USE_ROM_IMPL=y -CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y -CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y -# CONFIG_HAL_ECDSA_GEN_SIG_CM is not set -# end of Hardware Abstraction Layer (HAL) and Low Level (LL) - -# -# Heap memory debugging -# -CONFIG_HEAP_POISONING_DISABLED=y -# CONFIG_HEAP_POISONING_LIGHT is not set -# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set -CONFIG_HEAP_TRACING_OFF=y -# CONFIG_HEAP_TRACING_STANDALONE is not set -# CONFIG_HEAP_TRACING_TOHOST is not set -# CONFIG_HEAP_USE_HOOKS is not set -# CONFIG_HEAP_TASK_TRACKING is not set -# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set -# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set -# end of Heap memory debugging - -# -# Log -# - -# -# Log Level -# -# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set -# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set -# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set -CONFIG_LOG_DEFAULT_LEVEL_INFO=y -# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set -# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set -CONFIG_LOG_DEFAULT_LEVEL=3 -CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y -# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set -# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set -CONFIG_LOG_MAXIMUM_LEVEL=3 - -# -# Level Settings -# -# CONFIG_LOG_MASTER_LEVEL is not set -CONFIG_LOG_DYNAMIC_LEVEL_CONTROL=y -# CONFIG_LOG_TAG_LEVEL_IMPL_NONE is not set -# CONFIG_LOG_TAG_LEVEL_IMPL_LINKED_LIST is not set -CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_AND_LINKED_LIST=y -# CONFIG_LOG_TAG_LEVEL_CACHE_ARRAY is not set -CONFIG_LOG_TAG_LEVEL_CACHE_BINARY_MIN_HEAP=y -CONFIG_LOG_TAG_LEVEL_IMPL_CACHE_SIZE=31 -# end of Level Settings -# end of Log Level - -# -# Format -# -# CONFIG_LOG_COLORS is not set -CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y -# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set -# end of Format -# end of Log - -# -# LWIP -# -CONFIG_LWIP_ENABLE=y -CONFIG_LWIP_LOCAL_HOSTNAME="espressif" -# CONFIG_LWIP_NETIF_API is not set -CONFIG_LWIP_TCPIP_TASK_PRIO=18 -# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set -# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set -CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y -# CONFIG_LWIP_L2_TO_L3_COPY is not set -# CONFIG_LWIP_IRAM_OPTIMIZATION is not set -# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set -CONFIG_LWIP_TIMERS_ONDEMAND=y -CONFIG_LWIP_ND6=y -# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set -CONFIG_LWIP_MAX_SOCKETS=10 -# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set -# CONFIG_LWIP_SO_LINGER is not set -CONFIG_LWIP_SO_REUSE=y -CONFIG_LWIP_SO_REUSE_RXTOALL=y -# CONFIG_LWIP_SO_RCVBUF is not set -# CONFIG_LWIP_NETBUF_RECVINFO is not set -CONFIG_LWIP_IP_DEFAULT_TTL=64 -CONFIG_LWIP_IP4_FRAG=y -CONFIG_LWIP_IP6_FRAG=y -# CONFIG_LWIP_IP4_REASSEMBLY is not set -# CONFIG_LWIP_IP6_REASSEMBLY is not set -CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 -# CONFIG_LWIP_IP_FORWARD is not set -# CONFIG_LWIP_STATS is not set -CONFIG_LWIP_ESP_GRATUITOUS_ARP=y -CONFIG_LWIP_GARP_TMR_INTERVAL=60 -CONFIG_LWIP_ESP_MLDV6_REPORT=y -CONFIG_LWIP_MLDV6_TMR_INTERVAL=40 -CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 -CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y -# CONFIG_LWIP_DHCP_DOES_ACD_CHECK is not set -# CONFIG_LWIP_DHCP_DOES_NOT_CHECK_OFFERED_IP is not set -# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set -CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y -# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set -CONFIG_LWIP_DHCP_OPTIONS_LEN=68 -CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0 -CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1 - -# -# DHCP server -# -CONFIG_LWIP_DHCPS=y -CONFIG_LWIP_DHCPS_LEASE_UNIT=60 -CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8 -CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y -CONFIG_LWIP_DHCPS_ADD_DNS=y -# end of DHCP server - -# CONFIG_LWIP_AUTOIP is not set -CONFIG_LWIP_IPV4=y -CONFIG_LWIP_IPV6=y -# CONFIG_LWIP_IPV6_AUTOCONFIG is not set -CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 -# CONFIG_LWIP_IPV6_FORWARD is not set -# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set -CONFIG_LWIP_NETIF_LOOPBACK=y -CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 - -# -# TCP -# -CONFIG_LWIP_MAX_ACTIVE_TCP=16 -CONFIG_LWIP_MAX_LISTENING_TCP=16 -CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y -CONFIG_LWIP_TCP_MAXRTX=12 -CONFIG_LWIP_TCP_SYNMAXRTX=12 -CONFIG_LWIP_TCP_MSS=1440 -CONFIG_LWIP_TCP_TMR_INTERVAL=250 -CONFIG_LWIP_TCP_MSL=60000 -CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000 -CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5760 -CONFIG_LWIP_TCP_WND_DEFAULT=5760 -CONFIG_LWIP_TCP_RECVMBOX_SIZE=6 -CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6 -CONFIG_LWIP_TCP_QUEUE_OOSEQ=y -CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6 -CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4 -# CONFIG_LWIP_TCP_SACK_OUT is not set -CONFIG_LWIP_TCP_OVERSIZE_MSS=y -# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set -# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set -CONFIG_LWIP_TCP_RTO_TIME=1500 -# end of TCP - -# -# UDP -# -CONFIG_LWIP_MAX_UDP_PCBS=16 -CONFIG_LWIP_UDP_RECVMBOX_SIZE=6 -# end of UDP - -# -# Checksums -# -# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set -# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set -CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y -# end of Checksums - -CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072 -CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y -# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set -# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF -CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3 -CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5 -CONFIG_LWIP_IPV6_ND6_NUM_PREFIXES=5 -CONFIG_LWIP_IPV6_ND6_NUM_ROUTERS=3 -CONFIG_LWIP_IPV6_ND6_NUM_DESTINATIONS=10 -# CONFIG_LWIP_PPP_SUPPORT is not set -# CONFIG_LWIP_SLIP_SUPPORT is not set - -# -# ICMP -# -CONFIG_LWIP_ICMP=y -# CONFIG_LWIP_MULTICAST_PING is not set -# CONFIG_LWIP_BROADCAST_PING is not set -# end of ICMP - -# -# LWIP RAW API -# -CONFIG_LWIP_MAX_RAW_PCBS=16 -# end of LWIP RAW API - -# -# SNTP -# -CONFIG_LWIP_SNTP_MAX_SERVERS=1 -# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set -CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000 -CONFIG_LWIP_SNTP_STARTUP_DELAY=y -CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000 -# end of SNTP - -# -# DNS -# -CONFIG_LWIP_DNS_MAX_HOST_IP=1 -CONFIG_LWIP_DNS_MAX_SERVERS=3 -# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set -# CONFIG_LWIP_DNS_SETSERVER_WITH_NETIF is not set -# end of DNS - -CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7 -CONFIG_LWIP_ESP_LWIP_ASSERT=y - -# -# Hooks -# -# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set -CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y -# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y -# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set -CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y -# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set -# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set -CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y -# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set -# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set -CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y -# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set -# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set -CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_NONE=y -# CONFIG_LWIP_HOOK_DNS_EXT_RESOLVE_CUSTOM is not set -# CONFIG_LWIP_HOOK_IP6_INPUT_NONE is not set -CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT=y -# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set -# end of Hooks - -# CONFIG_LWIP_DEBUG is not set -# end of LWIP - -# -# mbedTLS -# -# CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC is not set -CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y -# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set -# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set -CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y -CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384 -CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096 -CONFIG_MBEDTLS_DYNAMIC_BUFFER=y -# CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA is not set -# CONFIG_MBEDTLS_DEBUG is not set - -# -# mbedTLS v3.x related -# -# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set -# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set -# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set -# CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE is not set -CONFIG_MBEDTLS_PKCS7_C=y -# end of mbedTLS v3.x related - -# -# Certificate Bundle -# -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y -# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set -# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set -# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set -# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set -CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200 -# end of Certificate Bundle - -# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set -CONFIG_MBEDTLS_CMAC_C=y -CONFIG_MBEDTLS_HARDWARE_AES=y -CONFIG_MBEDTLS_AES_USE_INTERRUPT=y -CONFIG_MBEDTLS_AES_INTERRUPT_LEVEL=0 -CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y -CONFIG_MBEDTLS_HARDWARE_MPI=y -# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set -CONFIG_MBEDTLS_MPI_USE_INTERRUPT=y -CONFIG_MBEDTLS_MPI_INTERRUPT_LEVEL=0 -CONFIG_MBEDTLS_HARDWARE_SHA=y -CONFIG_MBEDTLS_ROM_MD5=y -# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set -# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set -CONFIG_MBEDTLS_HAVE_TIME=y -# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set -# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set -CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y -CONFIG_MBEDTLS_SHA512_C=y -# CONFIG_MBEDTLS_SHA3_C is not set -CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y -# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set -# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set -# CONFIG_MBEDTLS_TLS_DISABLED is not set -CONFIG_MBEDTLS_TLS_SERVER=y -CONFIG_MBEDTLS_TLS_CLIENT=y -CONFIG_MBEDTLS_TLS_ENABLED=y - -# -# TLS Key Exchange Methods -# -# CONFIG_MBEDTLS_PSK_MODES is not set -CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y -CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y -# end of TLS Key Exchange Methods - -CONFIG_MBEDTLS_SSL_RENEGOTIATION=y -CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y -# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set -# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set -CONFIG_MBEDTLS_SSL_ALPN=y -CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y -CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y - -# -# Symmetric Ciphers -# -CONFIG_MBEDTLS_AES_C=y -# CONFIG_MBEDTLS_CAMELLIA_C is not set -# CONFIG_MBEDTLS_DES_C is not set -# CONFIG_MBEDTLS_BLOWFISH_C is not set -# CONFIG_MBEDTLS_XTEA_C is not set -CONFIG_MBEDTLS_CCM_C=y -CONFIG_MBEDTLS_GCM_C=y -# CONFIG_MBEDTLS_NIST_KW_C is not set -# end of Symmetric Ciphers - -# CONFIG_MBEDTLS_RIPEMD160_C is not set - -# -# Certificates -# -CONFIG_MBEDTLS_PEM_PARSE_C=y -CONFIG_MBEDTLS_PEM_WRITE_C=y -CONFIG_MBEDTLS_X509_CRL_PARSE_C=y -CONFIG_MBEDTLS_X509_CSR_PARSE_C=y -# end of Certificates - -CONFIG_MBEDTLS_ECP_C=y -CONFIG_MBEDTLS_PK_PARSE_EC_EXTENDED=y -CONFIG_MBEDTLS_PK_PARSE_EC_COMPRESSED=y -# CONFIG_MBEDTLS_DHM_C is not set -CONFIG_MBEDTLS_ECDH_C=y -CONFIG_MBEDTLS_ECDSA_C=y -# CONFIG_MBEDTLS_ECJPAKE_C is not set -CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y -CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y -CONFIG_MBEDTLS_ECP_NIST_OPTIM=y -# CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM is not set -# CONFIG_MBEDTLS_POLY1305_C is not set -# CONFIG_MBEDTLS_CHACHA20_C is not set -# CONFIG_MBEDTLS_HKDF_C is not set -# CONFIG_MBEDTLS_THREADING_C is not set -CONFIG_MBEDTLS_ERROR_STRINGS=y -CONFIG_MBEDTLS_FS_IO=y -# end of mbedTLS - -# -# ESP-MQTT Configurations -# -CONFIG_MQTT_PROTOCOL_311=y -# CONFIG_MQTT_PROTOCOL_5 is not set -CONFIG_MQTT_TRANSPORT_SSL=y -CONFIG_MQTT_TRANSPORT_WEBSOCKET=y -CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y -# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set -# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set -# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set -# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set -# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set -# CONFIG_MQTT_CUSTOM_OUTBOX is not set -# end of ESP-MQTT Configurations - -# -# Newlib -# -CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y -# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set -# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set -# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set -# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set -CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y -CONFIG_NEWLIB_NANO_FORMAT=y -CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y -# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set -# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set -# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set -# end of Newlib - -CONFIG_STDATOMIC_S32C1I_SPIRAM_WORKAROUND=y - -# -# NVS -# -# CONFIG_NVS_ENCRYPTION is not set -# CONFIG_NVS_ASSERT_ERROR_CHECK is not set -# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set -# CONFIG_NVS_ALLOCATE_CACHE_IN_SPIRAM is not set -# end of NVS - -# -# OpenThread -# -# CONFIG_OPENTHREAD_ENABLED is not set - -# -# OpenThread Spinel -# -# CONFIG_OPENTHREAD_SPINEL_ONLY is not set -# end of OpenThread Spinel -# end of OpenThread - -# -# Protocomm -# -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y -CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y -# end of Protocomm - -# -# PThreads -# -CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5 -CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 -CONFIG_PTHREAD_STACK_MIN=768 -CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y -# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set -# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set -CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1 -CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread" -# end of PThreads - -# -# MMU Config -# -CONFIG_MMU_PAGE_SIZE_64KB=y -CONFIG_MMU_PAGE_MODE="64KB" -CONFIG_MMU_PAGE_SIZE=0x10000 -# end of MMU Config - -# -# Main Flash configuration -# - -# -# SPI Flash behavior when brownout -# -CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y -CONFIG_SPI_FLASH_BROWNOUT_RESET=y -# end of SPI Flash behavior when brownout - -# -# Optional and Experimental Features (READ DOCS FIRST) -# - -# -# Features here require specific hardware (READ DOCS FIRST!) -# -# CONFIG_SPI_FLASH_HPM_ENA is not set -CONFIG_SPI_FLASH_HPM_AUTO=y -# CONFIG_SPI_FLASH_HPM_DIS is not set -CONFIG_SPI_FLASH_HPM_ON=y -CONFIG_SPI_FLASH_HPM_DC_AUTO=y -# CONFIG_SPI_FLASH_HPM_DC_DISABLE is not set -# CONFIG_SPI_FLASH_AUTO_SUSPEND is not set -CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50 -# CONFIG_SPI_FLASH_FORCE_ENABLE_XMC_C_SUSPEND is not set -# end of Optional and Experimental Features (READ DOCS FIRST) -# end of Main Flash configuration - -# -# SPI Flash driver -# -# CONFIG_SPI_FLASH_VERIFY_WRITE is not set -# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set -CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y -# CONFIG_SPI_FLASH_ROM_IMPL is not set -CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y -# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set -# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set -# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set -CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y -CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20 -CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1 -CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192 -# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set -# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set -# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set - -# -# Auto-detect flash chips -# -CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_BOYA_SUPPORTED=y -CONFIG_SPI_FLASH_VENDOR_TH_SUPPORTED=y -CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_TH_CHIP=y -CONFIG_SPI_FLASH_SUPPORT_MXIC_OPI_CHIP=y -# end of Auto-detect flash chips - -CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y -# end of SPI Flash driver - -# -# SPIFFS Configuration -# -CONFIG_SPIFFS_MAX_PARTITIONS=3 - -# -# SPIFFS Cache Configuration -# -CONFIG_SPIFFS_CACHE=y -CONFIG_SPIFFS_CACHE_WR=y -# CONFIG_SPIFFS_CACHE_STATS is not set -# end of SPIFFS Cache Configuration - -CONFIG_SPIFFS_PAGE_CHECK=y -CONFIG_SPIFFS_GC_MAX_RUNS=10 -# CONFIG_SPIFFS_GC_STATS is not set -CONFIG_SPIFFS_PAGE_SIZE=256 -CONFIG_SPIFFS_OBJ_NAME_LEN=32 -# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set -CONFIG_SPIFFS_USE_MAGIC=y -CONFIG_SPIFFS_USE_MAGIC_LENGTH=y -CONFIG_SPIFFS_META_LENGTH=4 -CONFIG_SPIFFS_USE_MTIME=y - -# -# Debug Configuration -# -# CONFIG_SPIFFS_DBG is not set -# CONFIG_SPIFFS_API_DBG is not set -# CONFIG_SPIFFS_GC_DBG is not set -# CONFIG_SPIFFS_CACHE_DBG is not set -# CONFIG_SPIFFS_CHECK_DBG is not set -# CONFIG_SPIFFS_TEST_VISUALISATION is not set -# end of Debug Configuration -# end of SPIFFS Configuration - -# -# TCP Transport -# - -# -# Websocket -# -CONFIG_WS_TRANSPORT=y -CONFIG_WS_BUFFER_SIZE=1024 -# CONFIG_WS_DYNAMIC_BUFFER is not set -# end of Websocket -# end of TCP Transport - -# -# Ultra Low Power (ULP) Co-processor -# -# CONFIG_ULP_COPROC_ENABLED is not set - -# -# ULP Debugging Options -# -# end of ULP Debugging Options -# end of Ultra Low Power (ULP) Co-processor - -# -# Unity unit testing library -# -CONFIG_UNITY_ENABLE_FLOAT=y -CONFIG_UNITY_ENABLE_DOUBLE=y -# CONFIG_UNITY_ENABLE_64BIT is not set -# CONFIG_UNITY_ENABLE_COLOR is not set -CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y -# CONFIG_UNITY_ENABLE_FIXTURE is not set -# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set -# end of Unity unit testing library - -# -# USB-OTG -# -CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE=256 -CONFIG_USB_HOST_HW_BUFFER_BIAS_BALANCED=y -# CONFIG_USB_HOST_HW_BUFFER_BIAS_IN is not set -# CONFIG_USB_HOST_HW_BUFFER_BIAS_PERIODIC_OUT is not set - -# -# Hub Driver Configuration -# - -# -# Root Port configuration -# -CONFIG_USB_HOST_DEBOUNCE_DELAY_MS=250 -CONFIG_USB_HOST_RESET_HOLD_MS=30 -CONFIG_USB_HOST_RESET_RECOVERY_MS=30 -CONFIG_USB_HOST_SET_ADDR_RECOVERY_MS=10 -# end of Root Port configuration - -# CONFIG_USB_HOST_HUBS_SUPPORTED is not set -# end of Hub Driver Configuration - -# CONFIG_USB_HOST_ENABLE_ENUM_FILTER_CALLBACK is not set -CONFIG_USB_OTG_SUPPORTED=y -# end of USB-OTG - -# -# Virtual file system -# -CONFIG_VFS_SUPPORT_IO=y -CONFIG_VFS_SUPPORT_DIR=y -CONFIG_VFS_SUPPORT_SELECT=y -CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y -CONFIG_VFS_SELECT_IN_RAM=y -CONFIG_VFS_SUPPORT_TERMIOS=y -CONFIG_VFS_MAX_COUNT=8 - -# -# Host File System I/O (Semihosting) -# -CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1 -# end of Host File System I/O (Semihosting) - -CONFIG_VFS_INITIALIZE_DEV_NULL=y -# end of Virtual file system - -# -# Wear Levelling -# -# CONFIG_WL_SECTOR_SIZE_512 is not set -CONFIG_WL_SECTOR_SIZE_4096=y -CONFIG_WL_SECTOR_SIZE=4096 -# end of Wear Levelling - -# -# Wi-Fi Provisioning Manager -# -CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16 -CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30 -CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y -# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set -# end of Wi-Fi Provisioning Manager - -# -# IoT Button -# -CONFIG_BUTTON_PERIOD_TIME_MS=5 -CONFIG_BUTTON_DEBOUNCE_TICKS=2 -CONFIG_BUTTON_SHORT_PRESS_TIME_MS=180 -CONFIG_BUTTON_LONG_PRESS_TIME_MS=1500 -CONFIG_BUTTON_LONG_PRESS_HOLD_SERIAL_TIME_MS=20 -CONFIG_ADC_BUTTON_MAX_CHANNEL=3 -CONFIG_ADC_BUTTON_MAX_BUTTON_PER_CHANNEL=8 -CONFIG_ADC_BUTTON_SAMPLE_TIMES=1 -# end of IoT Button - -# -# CMake Utilities -# -# CONFIG_CU_RELINKER_ENABLE is not set -# CONFIG_CU_DIAGNOSTICS_COLOR_NEVER is not set -CONFIG_CU_DIAGNOSTICS_COLOR_ALWAYS=y -# CONFIG_CU_DIAGNOSTICS_COLOR_AUTO is not set -# CONFIG_CU_GCC_LTO_ENABLE is not set -# CONFIG_CU_GCC_STRING_1BYTE_ALIGN is not set -# end of CMake Utilities - -# -# DSP Library -# -CONFIG_DSP_OPTIMIZATIONS_SUPPORTED=y -# CONFIG_DSP_ANSI is not set -CONFIG_DSP_OPTIMIZED=y -CONFIG_DSP_OPTIMIZATION=1 -# CONFIG_DSP_MAX_FFT_SIZE_512 is not set -# CONFIG_DSP_MAX_FFT_SIZE_1024 is not set -# CONFIG_DSP_MAX_FFT_SIZE_2048 is not set -CONFIG_DSP_MAX_FFT_SIZE_4096=y -# CONFIG_DSP_MAX_FFT_SIZE_8192 is not set -# CONFIG_DSP_MAX_FFT_SIZE_16384 is not set -# CONFIG_DSP_MAX_FFT_SIZE_32768 is not set -CONFIG_DSP_MAX_FFT_SIZE=4096 -# end of DSP Library - -# -# Camera configuration -# -CONFIG_OV7670_SUPPORT=y -CONFIG_OV7725_SUPPORT=y -CONFIG_NT99141_SUPPORT=y -CONFIG_OV2640_SUPPORT=y -CONFIG_OV3660_SUPPORT=y -CONFIG_OV5640_SUPPORT=y -CONFIG_GC2145_SUPPORT=y -CONFIG_GC032A_SUPPORT=y -CONFIG_GC0308_SUPPORT=y -CONFIG_BF3005_SUPPORT=y -CONFIG_BF20A6_SUPPORT=y -# CONFIG_SC101IOT_SUPPORT is not set -CONFIG_SC030IOT_SUPPORT=y -# CONFIG_SC031GS_SUPPORT is not set -CONFIG_MEGA_CCM_SUPPORT=y -# CONFIG_SCCB_HARDWARE_I2C_PORT0 is not set -CONFIG_SCCB_HARDWARE_I2C_PORT1=y -CONFIG_SCCB_CLK_FREQ=100000 -# CONFIG_GC_SENSOR_WINDOWING_MODE is not set -CONFIG_GC_SENSOR_SUBSAMPLE_MODE=y -CONFIG_CAMERA_TASK_STACK_SIZE=2048 -CONFIG_CAMERA_CORE0=y -# CONFIG_CAMERA_CORE1 is not set -# CONFIG_CAMERA_NO_AFFINITY is not set -CONFIG_CAMERA_DMA_BUFFER_SIZE_MAX=32768 -CONFIG_CAMERA_JPEG_MODE_FRAME_SIZE_AUTO=y -# CONFIG_CAMERA_JPEG_MODE_FRAME_SIZE_CUSTOM is not set -# CONFIG_CAMERA_CONVERTER_ENABLED is not set -# CONFIG_LCD_CAM_ISR_IRAM_SAFE is not set -# end of Camera configuration - -# -# Audio Codec Device Configuration -# -# CONFIG_CODEC_I2C_BACKWARD_COMPATIBLE is not set -CONFIG_CODEC_ES8311_SUPPORT=y -CONFIG_CODEC_ES7210_SUPPORT=y -CONFIG_CODEC_ES7243_SUPPORT=y -CONFIG_CODEC_ES7243E_SUPPORT=y -CONFIG_CODEC_ES8156_SUPPORT=y -CONFIG_CODEC_AW88298_SUPPORT=y -CONFIG_CODEC_ES8374_SUPPORT=y -CONFIG_CODEC_ES8388_SUPPORT=y -CONFIG_CODEC_TAS5805M_SUPPORT=y -# CONFIG_CODEC_ZL38063_SUPPORT is not set -# end of Audio Codec Device Configuration - -# -# ESP LCD TOUCH -# -CONFIG_ESP_LCD_TOUCH_MAX_POINTS=5 -CONFIG_ESP_LCD_TOUCH_MAX_BUTTONS=1 -# end of ESP LCD TOUCH - -# -# ESP LVGL PORT -# -# end of ESP LVGL PORT - -# -# IOT Knob -# -CONFIG_KNOB_PERIOD_TIME_MS=3 -CONFIG_KNOB_DEBOUNCE_TICKS=2 -CONFIG_KNOB_HIGH_LIMIT=1000 -CONFIG_KNOB_LOW_LIMIT=-1000 -# end of IOT Knob - -# -# LVGL configuration -# -CONFIG_LV_CONF_SKIP=y -# CONFIG_LV_CONF_MINIMAL is not set - -# -# Color Settings -# -# CONFIG_LV_COLOR_DEPTH_32 is not set -# CONFIG_LV_COLOR_DEPTH_24 is not set -CONFIG_LV_COLOR_DEPTH_16=y -# CONFIG_LV_COLOR_DEPTH_8 is not set -# CONFIG_LV_COLOR_DEPTH_1 is not set -CONFIG_LV_COLOR_DEPTH=16 -# end of Color Settings - -# -# Memory Settings -# -# CONFIG_LV_USE_BUILTIN_MALLOC is not set -CONFIG_LV_USE_CLIB_MALLOC=y -# CONFIG_LV_USE_MICROPYTHON_MALLOC is not set -# CONFIG_LV_USE_RTTHREAD_MALLOC is not set -# CONFIG_LV_USE_CUSTOM_MALLOC is not set -# CONFIG_LV_USE_BUILTIN_STRING is not set -CONFIG_LV_USE_CLIB_STRING=y -# CONFIG_LV_USE_CUSTOM_STRING is not set -# CONFIG_LV_USE_BUILTIN_SPRINTF is not set -CONFIG_LV_USE_CLIB_SPRINTF=y -# CONFIG_LV_USE_CUSTOM_SPRINTF is not set -# end of Memory Settings - -# -# HAL Settings -# -CONFIG_LV_DEF_REFR_PERIOD=33 -CONFIG_LV_DPI_DEF=130 -# end of HAL Settings - -# -# Operating System (OS) -# -CONFIG_LV_OS_NONE=y -# CONFIG_LV_OS_PTHREAD is not set -# CONFIG_LV_OS_FREERTOS is not set -# CONFIG_LV_OS_CMSIS_RTOS2 is not set -# CONFIG_LV_OS_RTTHREAD is not set -# CONFIG_LV_OS_WINDOWS is not set -# CONFIG_LV_OS_MQX is not set -# CONFIG_LV_OS_CUSTOM is not set -CONFIG_LV_USE_OS=0 -# end of Operating System (OS) - -# -# Rendering Configuration -# -CONFIG_LV_DRAW_BUF_STRIDE_ALIGN=1 -CONFIG_LV_DRAW_BUF_ALIGN=4 -CONFIG_LV_DRAW_LAYER_SIMPLE_BUF_SIZE=24576 -CONFIG_LV_USE_DRAW_SW=y -CONFIG_LV_DRAW_SW_SUPPORT_RGB565=y -CONFIG_LV_DRAW_SW_SUPPORT_RGB565A8=y -CONFIG_LV_DRAW_SW_SUPPORT_RGB888=y -CONFIG_LV_DRAW_SW_SUPPORT_XRGB8888=y -CONFIG_LV_DRAW_SW_SUPPORT_ARGB8888=y -CONFIG_LV_DRAW_SW_SUPPORT_L8=y -CONFIG_LV_DRAW_SW_SUPPORT_AL88=y -CONFIG_LV_DRAW_SW_SUPPORT_A8=y -CONFIG_LV_DRAW_SW_SUPPORT_I1=y -CONFIG_LV_DRAW_SW_DRAW_UNIT_CNT=1 -# CONFIG_LV_USE_DRAW_ARM2D_SYNC is not set -# CONFIG_LV_USE_NATIVE_HELIUM_ASM is not set -CONFIG_LV_DRAW_SW_COMPLEX=y -# CONFIG_LV_USE_DRAW_SW_COMPLEX_GRADIENTS is not set -CONFIG_LV_DRAW_SW_SHADOW_CACHE_SIZE=0 -CONFIG_LV_DRAW_SW_CIRCLE_CACHE_SIZE=4 -CONFIG_LV_DRAW_SW_ASM_NONE=y -# CONFIG_LV_DRAW_SW_ASM_NEON is not set -# CONFIG_LV_DRAW_SW_ASM_HELIUM is not set -# CONFIG_LV_DRAW_SW_ASM_CUSTOM is not set -CONFIG_LV_USE_DRAW_SW_ASM=0 -# CONFIG_LV_USE_DRAW_VGLITE is not set -# CONFIG_LV_USE_PXP is not set -# CONFIG_LV_USE_DRAW_DAVE2D is not set -# CONFIG_LV_USE_DRAW_SDL is not set -# CONFIG_LV_USE_DRAW_VG_LITE is not set -# CONFIG_LV_USE_VECTOR_GRAPHIC is not set -# end of Rendering Configuration - -# -# Feature Configuration -# - -# -# Logging -# -# CONFIG_LV_USE_LOG is not set -# end of Logging - -# -# Asserts -# -CONFIG_LV_USE_ASSERT_NULL=y -CONFIG_LV_USE_ASSERT_MALLOC=y -# CONFIG_LV_USE_ASSERT_STYLE is not set -# CONFIG_LV_USE_ASSERT_MEM_INTEGRITY is not set -# CONFIG_LV_USE_ASSERT_OBJ is not set -CONFIG_LV_ASSERT_HANDLER_INCLUDE="assert.h" -# end of Asserts - -# -# Debug -# -# CONFIG_LV_USE_REFR_DEBUG is not set -# CONFIG_LV_USE_LAYER_DEBUG is not set -# CONFIG_LV_USE_PARALLEL_DRAW_DEBUG is not set -# end of Debug - -# -# Others -# -# CONFIG_LV_ENABLE_GLOBAL_CUSTOM is not set -CONFIG_LV_CACHE_DEF_SIZE=0 -CONFIG_LV_IMAGE_HEADER_CACHE_DEF_CNT=0 -CONFIG_LV_GRADIENT_MAX_STOPS=2 -CONFIG_LV_COLOR_MIX_ROUND_OFS=128 -# CONFIG_LV_OBJ_STYLE_CACHE is not set -# CONFIG_LV_USE_OBJ_ID is not set -# CONFIG_LV_USE_OBJ_PROPERTY is not set -# end of Others -# end of Feature Configuration - -# -# Compiler Settings -# -# CONFIG_LV_BIG_ENDIAN_SYSTEM is not set -CONFIG_LV_ATTRIBUTE_MEM_ALIGN_SIZE=1 -# CONFIG_LV_ATTRIBUTE_FAST_MEM_USE_IRAM is not set -# CONFIG_LV_USE_FLOAT is not set -# CONFIG_LV_USE_MATRIX is not set -# CONFIG_LV_USE_PRIVATE_API is not set -# end of Compiler Settings - -# -# Font Usage -# - -# -# Enable built-in fonts -# -# CONFIG_LV_FONT_MONTSERRAT_8 is not set -# CONFIG_LV_FONT_MONTSERRAT_10 is not set -# CONFIG_LV_FONT_MONTSERRAT_12 is not set -CONFIG_LV_FONT_MONTSERRAT_14=y -# CONFIG_LV_FONT_MONTSERRAT_16 is not set -# CONFIG_LV_FONT_MONTSERRAT_18 is not set -# CONFIG_LV_FONT_MONTSERRAT_20 is not set -# CONFIG_LV_FONT_MONTSERRAT_22 is not set -# CONFIG_LV_FONT_MONTSERRAT_24 is not set -# CONFIG_LV_FONT_MONTSERRAT_26 is not set -# CONFIG_LV_FONT_MONTSERRAT_28 is not set -# CONFIG_LV_FONT_MONTSERRAT_30 is not set -# CONFIG_LV_FONT_MONTSERRAT_32 is not set -# CONFIG_LV_FONT_MONTSERRAT_34 is not set -# CONFIG_LV_FONT_MONTSERRAT_36 is not set -# CONFIG_LV_FONT_MONTSERRAT_38 is not set -# CONFIG_LV_FONT_MONTSERRAT_40 is not set -# CONFIG_LV_FONT_MONTSERRAT_42 is not set -# CONFIG_LV_FONT_MONTSERRAT_44 is not set -# CONFIG_LV_FONT_MONTSERRAT_46 is not set -# CONFIG_LV_FONT_MONTSERRAT_48 is not set -# CONFIG_LV_FONT_MONTSERRAT_28_COMPRESSED is not set -# CONFIG_LV_FONT_DEJAVU_16_PERSIAN_HEBREW is not set -# CONFIG_LV_FONT_SIMSUN_14_CJK is not set -# CONFIG_LV_FONT_SIMSUN_16_CJK is not set -# CONFIG_LV_FONT_UNSCII_8 is not set -# CONFIG_LV_FONT_UNSCII_16 is not set -# end of Enable built-in fonts - -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_8 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_10 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_12 is not set -CONFIG_LV_FONT_DEFAULT_MONTSERRAT_14=y -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_16 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_18 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_20 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_22 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_24 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_26 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_30 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_32 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_34 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_36 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_38 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_40 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_42 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_44 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_46 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_48 is not set -# CONFIG_LV_FONT_DEFAULT_MONTSERRAT_28_COMPRESSED is not set -# CONFIG_LV_FONT_DEFAULT_DEJAVU_16_PERSIAN_HEBREW is not set -# CONFIG_LV_FONT_DEFAULT_SIMSUN_14_CJK is not set -# CONFIG_LV_FONT_DEFAULT_SIMSUN_16_CJK is not set -# CONFIG_LV_FONT_DEFAULT_UNSCII_8 is not set -# CONFIG_LV_FONT_DEFAULT_UNSCII_16 is not set -CONFIG_LV_FONT_FMT_TXT_LARGE=y -CONFIG_LV_USE_FONT_COMPRESSED=y -CONFIG_LV_USE_FONT_PLACEHOLDER=y -# end of Font Usage - -# -# Text Settings -# -CONFIG_LV_TXT_ENC_UTF8=y -# CONFIG_LV_TXT_ENC_ASCII is not set -CONFIG_LV_TXT_BREAK_CHARS=" ,.;:-_)}" -CONFIG_LV_TXT_LINE_BREAK_LONG_LEN=0 -# CONFIG_LV_USE_BIDI is not set -# CONFIG_LV_USE_ARABIC_PERSIAN_CHARS is not set -# end of Text Settings - -# -# Widget Usage -# -CONFIG_LV_WIDGETS_HAS_DEFAULT_VALUE=y -# CONFIG_LV_USE_ANIMIMG is not set -CONFIG_LV_USE_ARC=y -CONFIG_LV_USE_BAR=y -CONFIG_LV_USE_BUTTON=y -CONFIG_LV_USE_BUTTONMATRIX=y -# CONFIG_LV_USE_CALENDAR is not set -CONFIG_LV_USE_CANVAS=y -# CONFIG_LV_USE_CHART is not set -CONFIG_LV_USE_CHECKBOX=y -CONFIG_LV_USE_DROPDOWN=y -CONFIG_LV_USE_IMAGE=y -CONFIG_LV_USE_IMAGEBUTTON=y -# CONFIG_LV_USE_KEYBOARD is not set -CONFIG_LV_USE_LABEL=y -CONFIG_LV_LABEL_TEXT_SELECTION=y -CONFIG_LV_LABEL_LONG_TXT_HINT=y -CONFIG_LV_LABEL_WAIT_CHAR_COUNT=3 -# CONFIG_LV_USE_LED is not set -CONFIG_LV_USE_LINE=y -# CONFIG_LV_USE_LIST is not set -# CONFIG_LV_USE_MENU is not set -# CONFIG_LV_USE_MSGBOX is not set -CONFIG_LV_USE_ROLLER=y -CONFIG_LV_USE_SCALE=y -CONFIG_LV_USE_SLIDER=y -# CONFIG_LV_USE_SPAN is not set -# CONFIG_LV_USE_SPINBOX is not set -# CONFIG_LV_USE_SPINNER is not set -CONFIG_LV_USE_SWITCH=y -CONFIG_LV_USE_TEXTAREA=y -CONFIG_LV_TEXTAREA_DEF_PWD_SHOW_TIME=1500 -CONFIG_LV_USE_TABLE=y -# CONFIG_LV_USE_TABVIEW is not set -# CONFIG_LV_USE_TILEVIEW is not set -# CONFIG_LV_USE_WIN is not set -# end of Widget Usage - -# -# Themes -# -CONFIG_LV_USE_THEME_DEFAULT=y -# CONFIG_LV_THEME_DEFAULT_DARK is not set -CONFIG_LV_THEME_DEFAULT_GROW=y -CONFIG_LV_THEME_DEFAULT_TRANSITION_TIME=80 -CONFIG_LV_USE_THEME_SIMPLE=y -# CONFIG_LV_USE_THEME_MONO is not set -# end of Themes - -# -# Layouts -# -CONFIG_LV_USE_FLEX=y -CONFIG_LV_USE_GRID=y -# end of Layouts - -# -# 3rd Party Libraries -# -CONFIG_LV_FS_DEFAULT_DRIVE_LETTER=0 -# CONFIG_LV_USE_FS_STDIO is not set -# CONFIG_LV_USE_FS_POSIX is not set -# CONFIG_LV_USE_FS_WIN32 is not set -# CONFIG_LV_USE_FS_FATFS is not set -# CONFIG_LV_USE_FS_MEMFS is not set -# CONFIG_LV_USE_FS_LITTLEFS is not set -# CONFIG_LV_USE_FS_ARDUINO_ESP_LITTLEFS is not set -# CONFIG_LV_USE_FS_ARDUINO_SD is not set -# CONFIG_LV_USE_LODEPNG is not set -# CONFIG_LV_USE_LIBPNG is not set -# CONFIG_LV_USE_BMP is not set -# CONFIG_LV_USE_TJPGD is not set -# CONFIG_LV_USE_LIBJPEG_TURBO is not set -# CONFIG_LV_USE_GIF is not set -# CONFIG_LV_BIN_DECODER_RAM_LOAD is not set -# CONFIG_LV_USE_RLE is not set -# CONFIG_LV_USE_QRCODE is not set -# CONFIG_LV_USE_BARCODE is not set -# CONFIG_LV_USE_FREETYPE is not set -# CONFIG_LV_USE_TINY_TTF is not set -# CONFIG_LV_USE_RLOTTIE is not set -# CONFIG_LV_USE_THORVG is not set -# CONFIG_LV_USE_LZ4 is not set -# CONFIG_LV_USE_FFMPEG is not set -# end of 3rd Party Libraries - -# -# Others -# -# CONFIG_LV_USE_SNAPSHOT is not set -# CONFIG_LV_USE_SYSMON is not set -# CONFIG_LV_USE_PROFILER is not set -# CONFIG_LV_USE_MONKEY is not set -# CONFIG_LV_USE_GRIDNAV is not set -# CONFIG_LV_USE_FRAGMENT is not set -CONFIG_LV_USE_IMGFONT=y -CONFIG_LV_USE_OBSERVER=y -# CONFIG_LV_USE_IME_PINYIN is not set -# CONFIG_LV_USE_FILE_EXPLORER is not set -CONFIG_LVGL_VERSION_MAJOR=9 -CONFIG_LVGL_VERSION_MINOR=2 -CONFIG_LVGL_VERSION_PATCH=2 -# end of Others - -# -# Devices -# -# CONFIG_LV_USE_SDL is not set -# CONFIG_LV_USE_X11 is not set -# CONFIG_LV_USE_WAYLAND is not set -# CONFIG_LV_USE_LINUX_FBDEV is not set -# CONFIG_LV_USE_NUTTX is not set -# CONFIG_LV_USE_LINUX_DRM is not set -# CONFIG_LV_USE_TFT_ESPI is not set -# CONFIG_LV_USE_EVDEV is not set -# CONFIG_LV_USE_LIBINPUT is not set -# CONFIG_LV_USE_ST7735 is not set -# CONFIG_LV_USE_ST7789 is not set -# CONFIG_LV_USE_ST7796 is not set -# CONFIG_LV_USE_ILI9341 is not set -# CONFIG_LV_USE_GENERIC_MIPI is not set -# CONFIG_LV_USE_RENESAS_GLCDC is not set -# CONFIG_LV_USE_OPENGLES is not set -# CONFIG_LV_USE_QNX is not set -# end of Devices - -# -# Examples -# -# CONFIG_LV_BUILD_EXAMPLES is not set -# end of Examples - -# -# Demos -# -# CONFIG_LV_USE_DEMO_WIDGETS is not set -# CONFIG_LV_USE_DEMO_KEYPAD_AND_ENCODER is not set -# CONFIG_LV_USE_DEMO_RENDER is not set -# CONFIG_LV_USE_DEMO_SCROLL is not set -# CONFIG_LV_USE_DEMO_STRESS is not set -# CONFIG_LV_USE_DEMO_MUSIC is not set -# CONFIG_LV_USE_DEMO_FLEX_LAYOUT is not set -# CONFIG_LV_USE_DEMO_MULTILANG is not set -# end of Demos -# end of LVGL configuration - -# -# SH1106 ESP-IDF Driver -# -# end of Component config - -# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set - -# Deprecated options for backward compatibility -# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set -# CONFIG_NO_BLOBS is not set -CONFIG_LOG_BOOTLOADER_LEVEL_NONE=y -# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_INFO is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set -# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set -CONFIG_LOG_BOOTLOADER_LEVEL=0 -CONFIG_APP_ROLLBACK_ENABLE=y -# CONFIG_APP_ANTI_ROLLBACK is not set -# CONFIG_FLASH_ENCRYPTION_ENABLED is not set -CONFIG_FLASHMODE_QIO=y -# CONFIG_FLASHMODE_QOUT is not set -# CONFIG_FLASHMODE_DIO is not set -# CONFIG_FLASHMODE_DOUT is not set -CONFIG_MONITOR_BAUD=115200 -CONFIG_OPTIMIZATION_LEVEL_DEBUG=y -CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y -CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y -# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set -# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set -CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y -# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set -# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set -CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2 -CONFIG_CXX_EXCEPTIONS=y -CONFIG_CXX_EXCEPTIONS_EMG_POOL_SIZE=1024 -CONFIG_STACK_CHECK_NONE=y -# CONFIG_STACK_CHECK_NORM is not set -# CONFIG_STACK_CHECK_STRONG is not set -# CONFIG_STACK_CHECK_ALL is not set -# CONFIG_WARN_WRITE_STRINGS is not set -# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set -CONFIG_ESP32_APPTRACE_DEST_NONE=y -CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y -# CONFIG_EXTERNAL_COEX_ENABLE is not set -# CONFIG_ESP_WIFI_EXTERNAL_COEXIST_ENABLE is not set -# CONFIG_MCPWM_ISR_IN_IRAM is not set -# CONFIG_EVENT_LOOP_PROFILING is not set -CONFIG_POST_EVENTS_FROM_ISR=y -CONFIG_POST_EVENTS_FROM_IRAM_ISR=y -CONFIG_GDBSTUB_SUPPORT_TASKS=y -CONFIG_GDBSTUB_MAX_TASKS=32 -# CONFIG_OTA_ALLOW_HTTP is not set -CONFIG_ESP32S3_DEEP_SLEEP_WAKEUP_DELAY=2000 -CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000 -CONFIG_ESP32S3_RTC_CLK_SRC_INT_RC=y -# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_CRYS is not set -# CONFIG_ESP32S3_RTC_CLK_SRC_EXT_OSC is not set -# CONFIG_ESP32S3_RTC_CLK_SRC_INT_8MD256 is not set -CONFIG_ESP32S3_RTC_CLK_CAL_CYCLES=1024 -CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y -# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set -CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20 -CONFIG_ESP32_PHY_MAX_TX_POWER=20 -# CONFIG_REDUCE_PHY_TX_POWER is not set -# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set -CONFIG_ESP_SYSTEM_PM_POWER_DOWN_CPU=y -CONFIG_PM_POWER_DOWN_TAGMEM_IN_LIGHT_SLEEP=y -CONFIG_ESP32S3_SPIRAM_SUPPORT=y -CONFIG_DEFAULT_PSRAM_CLK_IO=30 -CONFIG_DEFAULT_PSRAM_CS_IO=26 -# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_80 is not set -# CONFIG_ESP32S3_DEFAULT_CPU_FREQ_160 is not set -CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240=y -CONFIG_ESP32S3_DEFAULT_CPU_FREQ_MHZ=240 -CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32 -CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=4096 -CONFIG_MAIN_TASK_STACK_SIZE=8192 -CONFIG_CONSOLE_UART_DEFAULT=y -# CONFIG_CONSOLE_UART_CUSTOM is not set -# CONFIG_CONSOLE_UART_NONE is not set -# CONFIG_ESP_CONSOLE_UART_NONE is not set -CONFIG_CONSOLE_UART=y -CONFIG_CONSOLE_UART_NUM=0 -CONFIG_CONSOLE_UART_BAUDRATE=115200 -CONFIG_INT_WDT=y -CONFIG_INT_WDT_TIMEOUT_MS=300 -CONFIG_INT_WDT_CHECK_CPU1=y -CONFIG_TASK_WDT=y -CONFIG_ESP_TASK_WDT=y -# CONFIG_TASK_WDT_PANIC is not set -CONFIG_TASK_WDT_TIMEOUT_S=10 -CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y -CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y -# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set -CONFIG_ESP32S3_DEBUG_OCDAWARE=y -CONFIG_BROWNOUT_DET=y -CONFIG_ESP32S3_BROWNOUT_DET=y -CONFIG_ESP32S3_BROWNOUT_DET=y -CONFIG_BROWNOUT_DET_LVL_SEL_7=y -CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_7=y -# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_6 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_5 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_4 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_3 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_2 is not set -# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set -# CONFIG_ESP32S3_BROWNOUT_DET_LVL_SEL_1 is not set -CONFIG_BROWNOUT_DET_LVL=7 -CONFIG_ESP32S3_BROWNOUT_DET_LVL=7 -CONFIG_IPC_TASK_STACK_SIZE=1280 -CONFIG_TIMER_TASK_STACK_SIZE=3584 -CONFIG_ESP32_WIFI_ENABLED=y -CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=6 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=8 -# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y -CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 -# CONFIG_ESP32_WIFI_CSI_ENABLED is not set -CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y -CONFIG_ESP32_WIFI_TX_BA_WIN=6 -CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP32_WIFI_RX_BA_WIN=6 -CONFIG_ESP32_WIFI_RX_BA_WIN=6 -CONFIG_ESP32_WIFI_NVS_ENABLED=y -CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0=y -# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1 is not set -CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 -CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 -# CONFIG_ESP32_WIFI_IRAM_OPT is not set -# CONFIG_ESP32_WIFI_RX_IRAM_OPT is not set -CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y -CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y -CONFIG_WPA_MBEDTLS_CRYPTO=y -CONFIG_WPA_MBEDTLS_TLS_CLIENT=y -# CONFIG_WPA_WAPI_PSK is not set -# CONFIG_WPA_SUITE_B_192 is not set -# CONFIG_WPA_11KV_SUPPORT is not set -# CONFIG_WPA_MBO_SUPPORT is not set -# CONFIG_WPA_DPP_SUPPORT is not set -# CONFIG_WPA_11R_SUPPORT is not set -# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set -# CONFIG_WPA_WPS_STRICT is not set -# CONFIG_WPA_DEBUG_PRINT is not set -# CONFIG_WPA_TESTING_OPTIONS is not set -# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set -# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set -CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y -CONFIG_TIMER_TASK_PRIORITY=1 -CONFIG_TIMER_TASK_STACK_DEPTH=2048 -CONFIG_TIMER_QUEUE_LENGTH=10 -# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set -CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY=y -# CONFIG_HAL_ASSERTION_SILIENT is not set -# CONFIG_L2_TO_L3_COPY is not set -CONFIG_ESP_GRATUITOUS_ARP=y -CONFIG_GARP_TMR_INTERVAL=60 -CONFIG_TCPIP_RECVMBOX_SIZE=32 -CONFIG_TCP_MAXRTX=12 -CONFIG_TCP_SYNMAXRTX=12 -CONFIG_TCP_MSS=1440 -CONFIG_TCP_MSL=60000 -CONFIG_TCP_SND_BUF_DEFAULT=5760 -CONFIG_TCP_WND_DEFAULT=5760 -CONFIG_TCP_RECVMBOX_SIZE=6 -CONFIG_TCP_QUEUE_OOSEQ=y -CONFIG_TCP_OVERSIZE_MSS=y -# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set -# CONFIG_TCP_OVERSIZE_DISABLE is not set -CONFIG_UDP_RECVMBOX_SIZE=6 -CONFIG_TCPIP_TASK_STACK_SIZE=3072 -CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y -# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set -# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set -CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF -# CONFIG_PPP_SUPPORT is not set -CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_SYSTIMER=y -CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC_FRC1=y -# CONFIG_ESP32S3_TIME_SYSCALL_USE_RTC is not set -# CONFIG_ESP32S3_TIME_SYSCALL_USE_SYSTIMER is not set -# CONFIG_ESP32S3_TIME_SYSCALL_USE_FRC1 is not set -# CONFIG_ESP32S3_TIME_SYSCALL_USE_NONE is not set -CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5 -CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072 -CONFIG_ESP32_PTHREAD_STACK_MIN=768 -CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y -# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set -# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set -CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1 -CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread" -CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y -# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set -# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set -CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y -CONFIG_SUPPORT_TERMIOS=y -CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1 -# End of deprecated options diff --git a/main/boards/m5stack-tab5/m5stack_tab5.cc b/main/boards/m5stack-tab5/m5stack_tab5.cc index e6522ed8..c3a1e490 100644 --- a/main/boards/m5stack-tab5/m5stack_tab5.cc +++ b/main/boards/m5stack-tab5/m5stack_tab5.cc @@ -22,7 +22,7 @@ #define TAG "M5StackTab5Board" -LV_FONT_DECLARE(font_puhui_30_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); LV_FONT_DECLARE(font_awesome_30_4); @@ -44,8 +44,7 @@ LV_FONT_DECLARE(font_awesome_30_4); class Pi4ioe1 : public I2cDevice { public: - Pi4ioe1(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_bus, addr) - { + Pi4ioe1(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_bus, addr) { WriteReg(PI4IO_REG_CHIP_RESET, 0xFF); uint8_t data = ReadReg(PI4IO_REG_CHIP_RESET); WriteReg(PI4IO_REG_IO_DIR, 0b01111111); // 0: input 1: output @@ -60,8 +59,7 @@ public: class Pi4ioe2 : public I2cDevice { public: - Pi4ioe2(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_bus, addr) - { + Pi4ioe2(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_bus, addr) { WriteReg(PI4IO_REG_CHIP_RESET, 0xFF); uint8_t data = ReadReg(PI4IO_REG_CHIP_RESET); WriteReg(PI4IO_REG_IO_DIR, 0b10111001); // 0: input 1: output @@ -84,8 +82,7 @@ private: Pi4ioe2* pi4ioe2_; esp_lcd_touch_handle_t touch_ = nullptr; - void InitializeI2c() - { + void InitializeI2c() { // Initialize I2C peripheral i2c_master_bus_config_t i2c_bus_cfg = { .i2c_port = (i2c_port_t)1, @@ -102,8 +99,7 @@ private: ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &i2c_bus_)); } - void I2cDetect() - { + void I2cDetect() { uint8_t address; printf(" 0 1 2 3 4 5 6 7 8 9 a b c d e f\r\n"); for (int i = 0; i < 128; i += 16) { @@ -124,15 +120,13 @@ private: } } - void InitializePi4ioe() - { + void InitializePi4ioe() { ESP_LOGI(TAG, "Init I/O Exapander PI4IOE"); pi4ioe1_ = new Pi4ioe1(i2c_bus_, 0x43); pi4ioe2_ = new Pi4ioe2(i2c_bus_, 0x44); } - void InitializeButtons() - { + void InitializeButtons() { boot_button_.OnClick([this]() { auto& app = Application::GetInstance(); if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) { @@ -191,8 +185,7 @@ private: ESP_ERROR_CHECK(spi_bus_initialize(SPI3_HOST, &buscfg, SPI_DMA_CH_AUTO)); } - void InitializeIli9881cDisplay() - { + void InitializeIli9881cDisplay() { esp_lcd_panel_io_handle_t panel_io = nullptr; esp_lcd_panel_handle_t panel = nullptr; @@ -223,7 +216,7 @@ private: ESP_ERROR_CHECK(esp_lcd_new_panel_io_dbi(mipi_dsi_bus, &dbi_config, &panel_io)); ESP_LOGI(TAG, "Install LCD driver of ili9881c"); - esp_lcd_dpi_panel_config_t dpi_config = {.virtual_channel = 0, + esp_lcd_dpi_panel_config_t dpi_config = {.virtual_channel = 0, .dpi_clk_src = MIPI_DSI_DPI_CLK_SRC_DEFAULT, .dpi_clock_freq_mhz = 60, .pixel_format = LCD_COLOR_PIXEL_FORMAT_RGB565, @@ -269,16 +262,11 @@ private: display_ = new MipiLcdDisplay(panel_io, panel, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_30_4, - .icon_font = &font_awesome_30_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_30_4, &font_awesome_30_4}); } public: - M5StackTab5Board() : boot_button_(BOOT_BUTTON_GPIO) - { + M5StackTab5Board() : boot_button_(BOOT_BUTTON_GPIO) { InitializeI2c(); I2cDetect(); InitializePi4ioe(); @@ -288,8 +276,12 @@ public: GetBacklight()->RestoreBrightness(); } - virtual AudioCodec* GetAudioCodec() override - { + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } + + virtual AudioCodec* GetAudioCodec() override { static Tab5AudioCodec audio_codec(i2c_bus_, AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, @@ -305,13 +297,11 @@ public: return &audio_codec; } - virtual Display* GetDisplay() override - { + virtual Display* GetDisplay() override { return display_; } - virtual Backlight* GetBacklight() override - { + virtual Backlight* GetBacklight() override { static PwmBacklight backlight(DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT); return &backlight; } diff --git a/main/boards/magiclick-2p4/magiclick_2p4_board.cc b/main/boards/magiclick-2p4/magiclick_2p4_board.cc index 911592fe..20ba7b75 100644 --- a/main/boards/magiclick-2p4/magiclick_2p4_board.cc +++ b/main/boards/magiclick-2p4/magiclick_2p4_board.cc @@ -19,7 +19,7 @@ #define TAG "magiclick_2p4" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class NV3023Display : public SpiLcdDisplay { @@ -27,11 +27,7 @@ public: NV3023Display(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy) : SpiLcdDisplay(panel_io, panel, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }) { + {&font_puhui_basic_16_4, &font_awesome_16_4}) { DisplayLockGuard lock(this); // 只需要覆盖颜色相关的样式 @@ -233,7 +229,11 @@ public: InitializeSpi(); InitializeNv3023Display(); GetBacklight()->RestoreBrightness(); - + } + + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; } virtual Led* GetLed() override { diff --git a/main/boards/magiclick-2p5/magiclick_2p5_board.cc b/main/boards/magiclick-2p5/magiclick_2p5_board.cc index ac84e58b..375b8d2e 100644 --- a/main/boards/magiclick-2p5/magiclick_2p5_board.cc +++ b/main/boards/magiclick-2p5/magiclick_2p5_board.cc @@ -22,7 +22,7 @@ #define TAG "magiclick_2p5" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class GC9107Display : public SpiLcdDisplay { @@ -30,11 +30,7 @@ public: GC9107Display(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy) : SpiLcdDisplay(panel_io, panel, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }) { + {&font_puhui_basic_16_4, &font_awesome_16_4}) { } }; @@ -292,6 +288,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual Led* GetLed() override { static CircularStrip led(BUILTIN_LED_GPIO, BUILTIN_LED_NUM); return &led; diff --git a/main/boards/magiclick-c3-v2/magiclick_c3_v2_board.cc b/main/boards/magiclick-c3-v2/magiclick_c3_v2_board.cc index 7fb8551f..b70f750a 100644 --- a/main/boards/magiclick-c3-v2/magiclick_c3_v2_board.cc +++ b/main/boards/magiclick-c3-v2/magiclick_c3_v2_board.cc @@ -19,7 +19,7 @@ #define TAG "magiclick_c3_v2" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class GC9107Display : public SpiLcdDisplay { @@ -27,11 +27,7 @@ public: GC9107Display(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy) : SpiLcdDisplay(panel_io, panel, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }) { + {&font_puhui_basic_16_4, &font_awesome_16_4}) { DisplayLockGuard lock(this); // 只需要覆盖颜色相关的样式 @@ -215,6 +211,11 @@ public: esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/magiclick-c3/magiclick_c3_board.cc b/main/boards/magiclick-c3/magiclick_c3_board.cc index 40d45436..91821f12 100644 --- a/main/boards/magiclick-c3/magiclick_c3_board.cc +++ b/main/boards/magiclick-c3/magiclick_c3_board.cc @@ -17,7 +17,7 @@ #define TAG "magiclick_c3" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class NV3023Display : public SpiLcdDisplay { @@ -25,11 +25,7 @@ public: NV3023Display(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy) : SpiLcdDisplay(panel_io, panel, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }) { + {&font_puhui_basic_16_4, &font_awesome_16_4}) { DisplayLockGuard lock(this); // 只需要覆盖颜色相关的样式 @@ -173,6 +169,11 @@ public: esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/minsi-k08-dual/minsi_k08_dual.cc b/main/boards/minsi-k08-dual/minsi_k08_dual.cc index a5724170..17d61526 100644 --- a/main/boards/minsi-k08-dual/minsi_k08_dual.cc +++ b/main/boards/minsi-k08-dual/minsi_k08_dual.cc @@ -26,7 +26,7 @@ #define TAG "MINSI_K08_DUAL" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); class MINSI_K08_DUAL : public DualNetworkBoard { @@ -126,15 +126,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), -#endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeButtons() { @@ -213,6 +205,11 @@ public: } } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/mixgo-nova/README.md b/main/boards/mixgo-nova/README.md index 7c94c406..8a992ef3 100644 --- a/main/boards/mixgo-nova/README.md +++ b/main/boards/mixgo-nova/README.md @@ -56,7 +56,7 @@ Component config -> ESP PSRAM -> SPI RAM config -> Mode (QUAD/OCT) -> QUAD Mode ``` Serial flasher config -> Flash size -> 8 MB -Partition Table -> Custom partition CSV file -> partitions/v1/8m.csv +Partition Table -> Custom partition CSV file -> partitions/v2/8m.csv ``` **编译:** diff --git a/main/boards/mixgo-nova/config.json b/main/boards/mixgo-nova/config.json index bb80ab4c..7c9d553d 100644 --- a/main/boards/mixgo-nova/config.json +++ b/main/boards/mixgo-nova/config.json @@ -6,7 +6,7 @@ "sdkconfig_append": [ "CONFIG_SPIRAM_MODE_QUAD=y", "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", - "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/8m.csv\"", + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"", "CONFIG_LCD_ST7735_128X160=y" ] } diff --git a/main/boards/mixgo-nova/mixgo-nova.cc b/main/boards/mixgo-nova/mixgo-nova.cc index bc841f5c..92f5c352 100644 --- a/main/boards/mixgo-nova/mixgo-nova.cc +++ b/main/boards/mixgo-nova/mixgo-nova.cc @@ -16,7 +16,7 @@ #define TAG "MIXGO_NOVA" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); @@ -127,11 +127,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } public: @@ -148,6 +144,11 @@ public: } } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual Led* GetLed() override { static CircularStrip led(BUILTIN_LED_GPIO, 4); return &led; diff --git a/main/boards/movecall-cuican-esp32s3/README.md b/main/boards/movecall-cuican-esp32s3/README.md index ad7af3b2..7d8eebae 100644 --- a/main/boards/movecall-cuican-esp32s3/README.md +++ b/main/boards/movecall-cuican-esp32s3/README.md @@ -22,7 +22,7 @@ Serial flasher config -> Flash size -> 8 MB ### 分区表配置: ``` -Partition Table -> Custom partition CSV file -> partitions/v1/8m.csv +Partition Table -> Custom partition CSV file -> partitions/v2/8m.csv ``` ### 开发板选择: diff --git a/main/boards/movecall-cuican-esp32s3/config.json b/main/boards/movecall-cuican-esp32s3/config.json index dc120782..13a8eb42 100644 --- a/main/boards/movecall-cuican-esp32s3/config.json +++ b/main/boards/movecall-cuican-esp32s3/config.json @@ -5,7 +5,7 @@ "name": "movecall-cuican-esp32s3", "sdkconfig_append": [ "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", - "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/8m.csv\"", + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"", "CONFIG_COMPILER_OPTIMIZATION_SIZE=y" ] } diff --git a/main/boards/movecall-cuican-esp32s3/movecall_cuican_esp32s3.cc b/main/boards/movecall-cuican-esp32s3/movecall_cuican_esp32s3.cc index ed33f926..08145138 100644 --- a/main/boards/movecall-cuican-esp32s3/movecall_cuican_esp32s3.cc +++ b/main/boards/movecall-cuican-esp32s3/movecall_cuican_esp32s3.cc @@ -20,8 +20,8 @@ #define TAG "MovecallCuicanESP32S3" -LV_FONT_DECLARE(font_puhui_16_4); -LV_FONT_DECLARE(font_awesome_16_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); +LV_FONT_DECLARE(font_awesome_20_4); class MovecallCuicanESP32S3 : public WifiBoard { private: @@ -80,11 +80,7 @@ private: display_ = new SpiLcdDisplay(io_handle, panel_handle, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeButtons() { @@ -106,6 +102,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led_strip(BUILTIN_LED_GPIO); return &led_strip; diff --git a/main/boards/movecall-moji-esp32s3/movecall_moji_esp32s3.cc b/main/boards/movecall-moji-esp32s3/movecall_moji_esp32s3.cc index dca60715..a4b78b79 100644 --- a/main/boards/movecall-moji-esp32s3/movecall_moji_esp32s3.cc +++ b/main/boards/movecall-moji-esp32s3/movecall_moji_esp32s3.cc @@ -20,7 +20,7 @@ #define TAG "MovecallMojiESP32S3" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); @@ -36,11 +36,7 @@ public: bool mirror_y, bool swap_xy) : SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }) { + {&font_puhui_basic_20_4, &font_awesome_20_4}) { DisplayLockGuard lock(this); // 由于屏幕是圆的,所以状态栏需要增加左右内边距 @@ -106,11 +102,7 @@ private: display_ = new SpiLcdDisplay(io_handle, panel_handle, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeButtons() { @@ -132,6 +124,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led_strip(BUILTIN_LED_GPIO); return &led_strip; diff --git a/main/boards/otto-robot/config.json b/main/boards/otto-robot/config.json index fa6b61a7..36bcf334 100644 --- a/main/boards/otto-robot/config.json +++ b/main/boards/otto-robot/config.json @@ -4,6 +4,7 @@ { "name": "otto-robot", "sdkconfig_append": [ + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/16m.csv\"" ] } ] diff --git a/main/boards/otto-robot/otto_emoji_display.cc b/main/boards/otto-robot/otto_emoji_display.cc index 64a1e08b..10fbccd5 100644 --- a/main/boards/otto-robot/otto_emoji_display.cc +++ b/main/boards/otto-robot/otto_emoji_display.cc @@ -51,9 +51,9 @@ const OttoEmojiDisplay::EmotionMap OttoEmojiDisplay::emotion_maps_[] = { OttoEmojiDisplay::OttoEmojiDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, - bool mirror_y, bool swap_xy, DisplayFonts fonts) + bool mirror_y, bool swap_xy, DisplayStyle style) : SpiLcdDisplay(panel_io, panel, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - fonts), + style), emotion_gif_(nullptr) { SetupGifContainer(); }; @@ -146,26 +146,3 @@ void OttoEmojiDisplay::SetChatMessage(const char* role, const char* content) { ESP_LOGI(TAG, "设置聊天消息 [%s]: %s", role, content); } - -void OttoEmojiDisplay::SetIcon(const char* icon) { - if (!icon) { - return; - } - - DisplayLockGuard lock(this); - - if (chat_message_label_ != nullptr) { - std::string icon_message = std::string(icon) + " "; - - if (strcmp(icon, FONT_AWESOME_DOWNLOAD) == 0) { - icon_message += "正在升级..."; - } else { - icon_message += "系统状态"; - } - - lv_label_set_text(chat_message_label_, icon_message.c_str()); - lv_obj_remove_flag(chat_message_label_, LV_OBJ_FLAG_HIDDEN); - - ESP_LOGI(TAG, "设置图标: %s", icon); - } -} diff --git a/main/boards/otto-robot/otto_emoji_display.h b/main/boards/otto-robot/otto_emoji_display.h index d3e47bdc..9ce1d0a8 100644 --- a/main/boards/otto-robot/otto_emoji_display.h +++ b/main/boards/otto-robot/otto_emoji_display.h @@ -16,7 +16,7 @@ public: */ OttoEmojiDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, - bool swap_xy, DisplayFonts fonts); + bool swap_xy, DisplayStyle style); virtual ~OttoEmojiDisplay() = default; @@ -26,9 +26,6 @@ public: // 重写聊天消息设置方法 virtual void SetChatMessage(const char* role, const char* content) override; - // 添加SetIcon方法声明 - virtual void SetIcon(const char* icon) override; - private: void SetupGifContainer(); diff --git a/main/boards/otto-robot/otto_robot.cc b/main/boards/otto-robot/otto_robot.cc index eb3ab883..20847d93 100644 --- a/main/boards/otto-robot/otto_robot.cc +++ b/main/boards/otto-robot/otto_robot.cc @@ -79,11 +79,7 @@ private: display_ = new OttoEmojiDisplay( panel_io, panel, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = DISPLAY_HEIGHT >= 240 ? font_emoji_64_init() : font_emoji_32_init(), - }); + {&font_puhui_16_4, &font_awesome_16_4, new Twemoji64()}); } void InitializeButtons() { diff --git a/main/boards/sensecap-watcher/README.md b/main/boards/sensecap-watcher/README.md index 801b55e4..b6063997 100644 --- a/main/boards/sensecap-watcher/README.md +++ b/main/boards/sensecap-watcher/README.md @@ -29,7 +29,7 @@ watcher 中一些额外的配置项如下,需要在menuconfig 中选择. ``` CONFIG_BOARD_TYPE_SENSECAP_WATCHER=y CONFIG_ESPTOOLPY_FLASHSIZE_32MB=y -CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions/v1/32m.csv" +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions/v2/32m.csv" CONFIG_BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH=y CONFIG_ESPTOOLPY_FLASH_MODE_AUTO_DETECT=n CONFIG_IDF_EXPERIMENTAL_FEATURES=y diff --git a/main/boards/sensecap-watcher/README_en.md b/main/boards/sensecap-watcher/README_en.md index 4bc5dbaa..8e95f553 100644 --- a/main/boards/sensecap-watcher/README_en.md +++ b/main/boards/sensecap-watcher/README_en.md @@ -29,7 +29,7 @@ There are some additional configuration options for the watcher. Please select t ``` CONFIG_BOARD_TYPE_SENSECAP_WATCHER=y CONFIG_ESPTOOLPY_FLASHSIZE_32MB=y -CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions/v1/32m.csv" +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions/v2/32m.csv" CONFIG_BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH=y CONFIG_ESPTOOLPY_FLASH_MODE_AUTO_DETECT=n CONFIG_IDF_EXPERIMENTAL_FEATURES=y diff --git a/main/boards/sensecap-watcher/config.json b/main/boards/sensecap-watcher/config.json index 48d60bbd..177fad74 100644 --- a/main/boards/sensecap-watcher/config.json +++ b/main/boards/sensecap-watcher/config.json @@ -5,7 +5,7 @@ "name": "sensecap-watcher", "sdkconfig_append": [ "CONFIG_ESPTOOLPY_FLASHSIZE_32MB=y", - "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/32m.csv\"", + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/32m.csv\"", "CONFIG_BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH=y", "CONFIG_ESPTOOLPY_FLASH_MODE_AUTO_DETECT=n", "CONFIG_IDF_EXPERIMENTAL_FEATURES=y", diff --git a/main/boards/sensecap-watcher/config_en.json b/main/boards/sensecap-watcher/config_en.json index e3c9a91e..0435fa3d 100644 --- a/main/boards/sensecap-watcher/config_en.json +++ b/main/boards/sensecap-watcher/config_en.json @@ -5,7 +5,7 @@ "name": "sensecap-watcher-en", "sdkconfig_append": [ "CONFIG_ESPTOOLPY_FLASHSIZE_32MB=y", - "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/32m.csv\"", + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/32m.csv\"", "CONFIG_BOOTLOADER_CACHE_32BIT_ADDR_QUAD_FLASH=y", "CONFIG_ESPTOOLPY_FLASH_MODE_AUTO_DETECT=n", "CONFIG_IDF_EXPERIMENTAL_FEATURES=y", diff --git a/main/boards/sensecap-watcher/sensecap_watcher.cc b/main/boards/sensecap-watcher/sensecap_watcher.cc index 84cf8619..2bcd1511 100644 --- a/main/boards/sensecap-watcher/sensecap_watcher.cc +++ b/main/boards/sensecap-watcher/sensecap_watcher.cc @@ -33,7 +33,7 @@ #define TAG "sensecap_watcher" -LV_FONT_DECLARE(font_puhui_30_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); LV_FONT_DECLARE(font_awesome_20_4); class CustomLcdDisplay : public SpiLcdDisplay { @@ -48,14 +48,10 @@ class CustomLcdDisplay : public SpiLcdDisplay { bool mirror_y, bool swap_xy) : SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_30_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }) { + {&font_puhui_basic_30_4, &font_awesome_20_4}) { DisplayLockGuard lock(this); - lv_obj_set_size(status_bar_, LV_HOR_RES, fonts_.text_font->line_height * 2 + 10); + lv_obj_set_size(status_bar_, LV_HOR_RES, style_.text_font->line_height * 2 + 10); lv_obj_set_style_layout(status_bar_, LV_LAYOUT_NONE, 0); lv_obj_set_style_pad_top(status_bar_, 10, 0); lv_obj_set_style_pad_bottom(status_bar_, 1, 0); @@ -63,9 +59,9 @@ class CustomLcdDisplay : public SpiLcdDisplay { // 针对圆形屏幕调整位置 // network battery mute // // status // - lv_obj_align(battery_label_, LV_ALIGN_TOP_MID, -2.5*fonts_.icon_font->line_height, 0); - lv_obj_align(network_label_, LV_ALIGN_TOP_MID, -0.5*fonts_.icon_font->line_height, 0); - lv_obj_align(mute_label_, LV_ALIGN_TOP_MID, 1.5*fonts_.icon_font->line_height, 0); + lv_obj_align(battery_label_, LV_ALIGN_TOP_MID, -2.5 * style_.icon_font->line_height, 0); + lv_obj_align(network_label_, LV_ALIGN_TOP_MID, -0.5 * style_.icon_font->line_height, 0); + lv_obj_align(mute_label_, LV_ALIGN_TOP_MID, 1.5 * style_.icon_font->line_height, 0); lv_obj_align(status_label_, LV_ALIGN_BOTTOM_MID, 0, 0); lv_obj_set_flex_grow(status_label_, 0); @@ -537,6 +533,11 @@ public: InitializeCamera(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static SensecapAudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/sp-esp32-s3-1.28-box/sp-esp32-s3-1.28-box.cc b/main/boards/sp-esp32-s3-1.28-box/sp-esp32-s3-1.28-box.cc index f2d31766..b03137ec 100644 --- a/main/boards/sp-esp32-s3-1.28-box/sp-esp32-s3-1.28-box.cc +++ b/main/boards/sp-esp32-s3-1.28-box/sp-esp32-s3-1.28-box.cc @@ -27,7 +27,7 @@ #define TAG "Spotpear_ESP32_S3_1_28_BOX" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); @@ -81,11 +81,7 @@ public: bool mirror_y, bool swap_xy) : SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_64_init(), - }) { + {&font_puhui_basic_16_4, &font_awesome_16_4}) { DisplayLockGuard lock(this); // 由于屏幕是圆的,所以状态栏需要增加左右内边距 @@ -285,6 +281,11 @@ public: } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_64); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/sp-esp32-s3-1.54-muma/sp-esp32-s3-1.54-muma.cc b/main/boards/sp-esp32-s3-1.54-muma/sp-esp32-s3-1.54-muma.cc index ce21669e..048225f7 100644 --- a/main/boards/sp-esp32-s3-1.54-muma/sp-esp32-s3-1.54-muma.cc +++ b/main/boards/sp-esp32-s3-1.54-muma/sp-esp32-s3-1.54-muma.cc @@ -28,10 +28,7 @@ #define TAG "Spotpear_esp32_s3_lcd_1_54" -LV_FONT_DECLARE(font_puhui_20_4); -LV_FONT_DECLARE(font_awesome_20_4); - -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class Cst816d : public I2cDevice { @@ -254,11 +251,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void InitializeButtons() { @@ -290,6 +283,11 @@ public: } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led_strip(BUILTIN_LED_GPIO); return &led_strip; diff --git a/main/boards/surfer-c3-1.14tft/surfer-c3-1.14tft.cc b/main/boards/surfer-c3-1.14tft/surfer-c3-1.14tft.cc index 1e810a72..c84ebf8e 100644 --- a/main/boards/surfer-c3-1.14tft/surfer-c3-1.14tft.cc +++ b/main/boards/surfer-c3-1.14tft/surfer-c3-1.14tft.cc @@ -21,7 +21,7 @@ #define TAG "SURFERC3114TFT" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); class SurferC3114TFT : public WifiBoard { @@ -147,11 +147,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } public: @@ -170,6 +166,11 @@ public: esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8311AudioCodec audio_codec( codec_i2c_bus_, diff --git a/main/boards/taiji-pi-s3/taiji_pi_s3.cc b/main/boards/taiji-pi-s3/taiji_pi_s3.cc index ef3667aa..11d4714c 100644 --- a/main/boards/taiji-pi-s3/taiji_pi_s3.cc +++ b/main/boards/taiji-pi-s3/taiji_pi_s3.cc @@ -17,7 +17,7 @@ #define TAG "TaijiPiS3Board" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); @@ -596,11 +596,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } void InitializeMute() { @@ -620,6 +616,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { #ifdef CONFIG_TAIJIPAI_I2S_TYPE_STD static NoAudioCodecSimplex audio_codec( diff --git a/main/boards/tudouzi/kevin_box_board.cc b/main/boards/tudouzi/kevin_box_board.cc index 9c4ac238..1d0cca3b 100644 --- a/main/boards/tudouzi/kevin_box_board.cc +++ b/main/boards/tudouzi/kevin_box_board.cc @@ -17,7 +17,7 @@ #define TAG "KevinBoxBoard" -LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_puhui_basic_14_1); LV_FONT_DECLARE(font_awesome_14_1); @@ -148,7 +148,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_, true)); display_ = new OledDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, - {&font_puhui_14_1, &font_awesome_14_1}); + {&font_puhui_basic_14_1, &font_awesome_14_1}); } void InitializeCodecI2c() { @@ -228,6 +228,11 @@ public: InitializePowerSaveTimer(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_14_1); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/waveshare-c6-lcd-1.69/esp32-c6-lcd-1.69.cc b/main/boards/waveshare-c6-lcd-1.69/esp32-c6-lcd-1.69.cc index f5eea48f..2212dec4 100644 --- a/main/boards/waveshare-c6-lcd-1.69/esp32-c6-lcd-1.69.cc +++ b/main/boards/waveshare-c6-lcd-1.69/esp32-c6-lcd-1.69.cc @@ -20,7 +20,7 @@ #define TAG "waveshare_lcd_1_69" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); @@ -37,15 +37,7 @@ public: bool swap_xy) : SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }) { + {&font_puhui_basic_20_4, &font_awesome_20_4}) { DisplayLockGuard lock(this); lv_obj_set_style_pad_left(status_bar_, LV_HOR_RES * 0.1, 0); lv_obj_set_style_pad_right(status_bar_, LV_HOR_RES * 0.1, 0); @@ -220,6 +212,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_S_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8311AudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/waveshare-c6-touch-amoled-1.43/esp32-c6-touch-amoled-1.43.cc b/main/boards/waveshare-c6-touch-amoled-1.43/esp32-c6-touch-amoled-1.43.cc index 6cba856e..fe8a64f3 100644 --- a/main/boards/waveshare-c6-touch-amoled-1.43/esp32-c6-touch-amoled-1.43.cc +++ b/main/boards/waveshare-c6-touch-amoled-1.43/esp32-c6-touch-amoled-1.43.cc @@ -18,7 +18,7 @@ #define TAG "waveshare_c6_amoled_1_43" -LV_FONT_DECLARE(font_puhui_30_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); LV_FONT_DECLARE(font_awesome_30_4); static const sh8601_lcd_init_cmd_t lcd_init_cmds[] = @@ -59,11 +59,7 @@ public: bool swap_xy) : SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_30_4, - .icon_font = &font_awesome_30_4, - .emoji_font = font_emoji_64_init(), - }) { + {&font_puhui_basic_30_4, &font_awesome_30_4}) { DisplayLockGuard lock(this); lv_display_add_event_cb(display_, MyDrawEventCb, LV_EVENT_INVALIDATE_AREA, NULL); } @@ -288,6 +284,11 @@ public: return display_; } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_S_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } + }; DECLARE_BOARD(CustomBoard); \ No newline at end of file diff --git a/main/boards/waveshare-p4-nano/esp32-p4-nano.cc b/main/boards/waveshare-p4-nano/esp32-p4-nano.cc index 2cb8cb43..364cdc0b 100644 --- a/main/boards/waveshare-p4-nano/esp32-p4-nano.cc +++ b/main/boards/waveshare-p4-nano/esp32-p4-nano.cc @@ -20,8 +20,8 @@ #include "esp_lcd_touch_gt911.h" #define TAG "WaveshareEsp32p4nano" -LV_FONT_DECLARE(font_puhui_20_4); -LV_FONT_DECLARE(font_awesome_20_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); +LV_FONT_DECLARE(font_awesome_30_4); class CustomBacklight : public Backlight { public: @@ -161,11 +161,7 @@ private: display__ = new MipiLcdDisplay(io, disp_panel, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_30_4, &font_awesome_30_4}); backlight_ = new CustomBacklight(codec_i2c_bus_); backlight_->RestoreBrightness(); } @@ -232,6 +228,11 @@ public: virtual Backlight *GetBacklight() override { return backlight_; } + + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } }; DECLARE_BOARD(WaveshareEsp32p4nano); diff --git a/main/boards/waveshare-p4-wifi6-touch-lcd-4b/esp32-p4-wifi6-touch-lcd-4b.cc b/main/boards/waveshare-p4-wifi6-touch-lcd-4b/esp32-p4-wifi6-touch-lcd-4b.cc index 76864a2e..ca4d91fb 100644 --- a/main/boards/waveshare-p4-wifi6-touch-lcd-4b/esp32-p4-wifi6-touch-lcd-4b.cc +++ b/main/boards/waveshare-p4-wifi6-touch-lcd-4b/esp32-p4-wifi6-touch-lcd-4b.cc @@ -19,7 +19,7 @@ #include "esp_lcd_touch_gt911.h" #define TAG "WaveshareEsp32p44b" -LV_FONT_DECLARE(font_puhui_30_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); LV_FONT_DECLARE(font_awesome_30_4); class WaveshareEsp32p44b : public WifiBoard { @@ -116,11 +116,7 @@ private: display_ = new MipiLcdDisplay(io, disp_panel, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_30_4, - .icon_font = &font_awesome_30_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_30_4, &font_awesome_30_4}); } void InitializeTouch() { @@ -197,6 +193,11 @@ public: static PwmBacklight backlight(DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT); return &backlight; } + + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } }; DECLARE_BOARD(WaveshareEsp32p44b); diff --git a/main/boards/waveshare-p4-wifi6-touch-lcd-xc/esp32-p4-wifi6-touch-lcd-xc.cc b/main/boards/waveshare-p4-wifi6-touch-lcd-xc/esp32-p4-wifi6-touch-lcd-xc.cc index 25f6dbf6..5e195497 100644 --- a/main/boards/waveshare-p4-wifi6-touch-lcd-xc/esp32-p4-wifi6-touch-lcd-xc.cc +++ b/main/boards/waveshare-p4-wifi6-touch-lcd-xc/esp32-p4-wifi6-touch-lcd-xc.cc @@ -19,7 +19,7 @@ #include "esp_lcd_touch_gt911.h" #define TAG "WaveshareEsp32p4xc" -LV_FONT_DECLARE(font_puhui_30_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); LV_FONT_DECLARE(font_awesome_30_4); class WaveshareEsp32p4xc : public WifiBoard { @@ -118,11 +118,7 @@ private: display_ = new MipiLcdDisplay(io, disp_panel, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_30_4, - .icon_font = &font_awesome_30_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_30_4, &font_awesome_30_4}); } void InitializeTouch() { @@ -174,6 +170,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static BoxAudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/waveshare-s3-audio-board/esp32-s3-audio_board.cc b/main/boards/waveshare-s3-audio-board/esp32-s3-audio_board.cc index 8c179580..b0153d53 100644 --- a/main/boards/waveshare-s3-audio-board/esp32-s3-audio_board.cc +++ b/main/boards/waveshare-s3-audio-board/esp32-s3-audio_board.cc @@ -26,10 +26,8 @@ #define LCD_OPCODE_READ_CMD (0x0BULL) #define LCD_OPCODE_WRITE_COLOR (0x32ULL) -LV_FONT_DECLARE(font_puhui_14_1); -LV_FONT_DECLARE(font_awesome_14_1); - - +LV_FONT_DECLARE(font_puhui_basic_16_4); +LV_FONT_DECLARE(font_awesome_16_4); class CustomBoard : public WifiBoard { @@ -116,11 +114,7 @@ private: 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, - { - .text_font = &font_puhui_14_1, - .icon_font = &font_awesome_14_1, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void InitializeJd9853Display() { @@ -154,11 +148,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_swap_xy(panel, true)); 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, - { - .text_font = &font_puhui_14_1, - .icon_font = &font_awesome_14_1, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void InitializeButtons() { @@ -219,6 +209,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual Led* GetLed() override { static CircularStrip led(BUILTIN_LED_GPIO, 6); return &led; diff --git a/main/boards/waveshare-s3-touch-amoled-1.75/esp32-s3-touch-amoled-1.75.cc b/main/boards/waveshare-s3-touch-amoled-1.75/esp32-s3-touch-amoled-1.75.cc index a49ef98c..578d6a0a 100644 --- a/main/boards/waveshare-s3-touch-amoled-1.75/esp32-s3-touch-amoled-1.75.cc +++ b/main/boards/waveshare-s3-touch-amoled-1.75/esp32-s3-touch-amoled-1.75.cc @@ -26,7 +26,7 @@ #define TAG "WaveshareEsp32s3TouchAMOLED1inch75" -LV_FONT_DECLARE(font_puhui_30_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); LV_FONT_DECLARE(font_awesome_30_4); class Pmic : public Axp2101 { @@ -111,16 +111,7 @@ public: bool swap_xy) : SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_30_4, - .icon_font = &font_awesome_30_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }) - { + {&font_puhui_basic_30_4, &font_awesome_30_4}) { DisplayLockGuard lock(this); lv_obj_set_style_pad_left(status_bar_, LV_HOR_RES* 0.1, 0); lv_obj_set_style_pad_right(status_bar_, LV_HOR_RES* 0.1, 0); @@ -323,6 +314,11 @@ public: InitializeTools(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static BoxAudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/waveshare-s3-touch-amoled-2.06/esp32-s3-touch-amoled-2.06.cc b/main/boards/waveshare-s3-touch-amoled-2.06/esp32-s3-touch-amoled-2.06.cc index f5ae75a7..3b19e451 100644 --- a/main/boards/waveshare-s3-touch-amoled-2.06/esp32-s3-touch-amoled-2.06.cc +++ b/main/boards/waveshare-s3-touch-amoled-2.06/esp32-s3-touch-amoled-2.06.cc @@ -25,7 +25,7 @@ #define TAG "WaveshareEsp32s3TouchAMOLED2inch06" -LV_FONT_DECLARE(font_puhui_30_4); +LV_FONT_DECLARE(font_puhui_basic_30_4); LV_FONT_DECLARE(font_awesome_30_4); class Pmic : public Axp2101 { @@ -107,16 +107,7 @@ public: bool swap_xy) : SpiLcdDisplay(io_handle, panel_handle, width, height, offset_x, offset_y, mirror_x, mirror_y, swap_xy, - { - .text_font = &font_puhui_30_4, - .icon_font = &font_awesome_30_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }) - { + {&font_puhui_basic_30_4, &font_awesome_30_4}) { DisplayLockGuard lock(this); lv_obj_set_style_pad_left(status_bar_, LV_HOR_RES* 0.1, 0); lv_obj_set_style_pad_right(status_bar_, LV_HOR_RES* 0.1, 0); @@ -309,6 +300,11 @@ public: InitializeTools(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_30_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static BoxAudioCodec audio_codec( i2c_bus_, diff --git a/main/boards/waveshare-s3-touch-lcd-3.5b/custom_lcd_display.cc b/main/boards/waveshare-s3-touch-lcd-3.5b/custom_lcd_display.cc index a864d52c..e78cdeca 100644 --- a/main/boards/waveshare-s3-touch-lcd-3.5b/custom_lcd_display.cc +++ b/main/boards/waveshare-s3-touch-lcd-3.5b/custom_lcd_display.cc @@ -3,7 +3,6 @@ #include "lcd_display.h" #include -#include #include #include #include @@ -253,8 +252,8 @@ void CustomLcdDisplay::lvgl_port_flush_callback(lv_display_t *drv, const lv_area CustomLcdDisplay::CustomLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy, - DisplayFonts fonts) - : LcdDisplay(panel_io, panel, fonts, width, height) { + DisplayStyle style) + : LcdDisplay(panel_io, panel, width, height, style) { // width_ = width; // height_ = height; diff --git a/main/boards/waveshare-s3-touch-lcd-3.5b/custom_lcd_display.h b/main/boards/waveshare-s3-touch-lcd-3.5b/custom_lcd_display.h index 792d4c2b..1ee5af26 100644 --- a/main/boards/waveshare-s3-touch-lcd-3.5b/custom_lcd_display.h +++ b/main/boards/waveshare-s3-touch-lcd-3.5b/custom_lcd_display.h @@ -9,7 +9,7 @@ public: CustomLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy, - DisplayFonts fonts); + DisplayStyle style); private: static bool lvgl_port_flush_io_ready_callback(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_io_event_data_t *edata, void *user_ctx); static void lvgl_port_flush_callback(lv_display_t *drv, const lv_area_t *area, uint8_t *color_map); diff --git a/main/boards/waveshare-s3-touch-lcd-3.5b/waveshare-s3-touch-lcd-3.5b.cc b/main/boards/waveshare-s3-touch-lcd-3.5b/waveshare-s3-touch-lcd-3.5b.cc index 514cb90f..aa917184 100644 --- a/main/boards/waveshare-s3-touch-lcd-3.5b/waveshare-s3-touch-lcd-3.5b.cc +++ b/main/boards/waveshare-s3-touch-lcd-3.5b/waveshare-s3-touch-lcd-3.5b.cc @@ -35,7 +35,7 @@ #define TAG "waveshare_lcd_3_5b" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); @@ -272,13 +272,7 @@ private: display_ = new CustomLcdDisplay(panel_io, panel, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); - // display_ = new CustomLcdDisplay(panel_io, panel, DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT, - // DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void InitializeButtons() { @@ -346,6 +340,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static Es8311AudioCodec audio_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, diff --git a/main/boards/xingzhi-cube-0.85tft-ml307/xingzhi-cube-0.85tft-ml307.cc b/main/boards/xingzhi-cube-0.85tft-ml307/xingzhi-cube-0.85tft-ml307.cc index b0a0e341..40bfdb1e 100644 --- a/main/boards/xingzhi-cube-0.85tft-ml307/xingzhi-cube-0.85tft-ml307.cc +++ b/main/boards/xingzhi-cube-0.85tft-ml307/xingzhi-cube-0.85tft-ml307.cc @@ -22,7 +22,7 @@ #define TAG "XINGZHI_CUBE_0_85TFT_ML307" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); @@ -175,11 +175,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void Initializegpio21_45() { @@ -212,6 +208,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN); diff --git a/main/boards/xingzhi-cube-0.85tft-wifi/xingzhi-cube-0.85tft-wifi.cc b/main/boards/xingzhi-cube-0.85tft-wifi/xingzhi-cube-0.85tft-wifi.cc index 720fd522..4fde3b5d 100644 --- a/main/boards/xingzhi-cube-0.85tft-wifi/xingzhi-cube-0.85tft-wifi.cc +++ b/main/boards/xingzhi-cube-0.85tft-wifi/xingzhi-cube-0.85tft-wifi.cc @@ -22,7 +22,7 @@ #define TAG "XINGZHI_CUBE_0_85TFT_WIFI" -LV_FONT_DECLARE(font_puhui_16_4); +LV_FONT_DECLARE(font_puhui_basic_16_4); LV_FONT_DECLARE(font_awesome_16_4); @@ -179,11 +179,7 @@ private: 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, - { - .text_font = &font_puhui_16_4, - .icon_font = &font_awesome_16_4, - .emoji_font = font_emoji_32_init(), - }); + {&font_puhui_basic_16_4, &font_awesome_16_4}); } void Initializegpio21_45() { @@ -216,6 +212,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_16_4_EMOJI_32); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN); diff --git a/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc b/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc index cb1f1bf3..28be5fbe 100644 --- a/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc +++ b/main/boards/xingzhi-cube-0.96oled-ml307/xingzhi-cube-0.96oled-ml307.cc @@ -20,7 +20,7 @@ #define TAG "XINGZHI_CUBE_0_96OLED_ML307" -LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_puhui_basic_14_1); LV_FONT_DECLARE(font_awesome_14_1); @@ -131,7 +131,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_, true)); display_ = new OledDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, - {&font_puhui_14_1, &font_awesome_14_1}); + {&font_puhui_basic_14_1, &font_awesome_14_1}); } void InitializeButtons() { @@ -201,6 +201,11 @@ public: InitializeButtons(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_14_1); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc b/main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc index 2158ee97..d23e0296 100644 --- a/main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc +++ b/main/boards/xingzhi-cube-0.96oled-wifi/xingzhi-cube-0.96oled-wifi.cc @@ -21,7 +21,7 @@ #define TAG "XINGZHI_CUBE_0_96OLED_WIFI" -LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_puhui_basic_14_1); LV_FONT_DECLARE(font_awesome_14_1); @@ -132,7 +132,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_, true)); display_ = new OledDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, - {&font_puhui_14_1, &font_awesome_14_1}); + {&font_puhui_basic_14_1, &font_awesome_14_1}); } void InitializeButtons() { @@ -192,6 +192,11 @@ public: InitializeButtons(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_14_1); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc b/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc index 35f1f3f3..7dca9ee5 100644 --- a/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc +++ b/main/boards/xingzhi-cube-1.54tft-ml307/xingzhi-cube-1.54tft-ml307.cc @@ -19,7 +19,7 @@ #define TAG "XINGZHI_CUBE_1_54TFT_ML307" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); @@ -162,15 +162,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -187,6 +179,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN); diff --git a/main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc b/main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc index 8b0f6bcf..1c16ed1e 100644 --- a/main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc +++ b/main/boards/xingzhi-cube-1.54tft-wifi/xingzhi-cube-1.54tft-wifi.cc @@ -19,7 +19,7 @@ #define TAG "XINGZHI_CUBE_1_54TFT_WIFI" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); @@ -152,15 +152,7 @@ private: 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, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, -#if CONFIG_USE_WECHAT_MESSAGE_STYLE - .emoji_font = font_emoji_32_init(), -#else - .emoji_font = font_emoji_64_init(), -#endif - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); } public: @@ -176,6 +168,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN); diff --git a/main/boards/xmini-c3-4g/config.json b/main/boards/xmini-c3-4g/config.json index 918d7d8c..b17fde6e 100644 --- a/main/boards/xmini-c3-4g/config.json +++ b/main/boards/xmini-c3-4g/config.json @@ -5,7 +5,7 @@ "name": "xmini-c3-4g", "sdkconfig_append": [ "CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y", - "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v1/8m.csv\"", + "CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/8m.csv\"", "CONFIG_PM_ENABLE=y", "CONFIG_FREERTOS_USE_TICKLESS_IDLE=y", "CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=y" diff --git a/main/boards/xmini-c3-4g/xmini_c3_4g_board.cc b/main/boards/xmini-c3-4g/xmini_c3_4g_board.cc index 7cef6fc3..cd3e80f2 100644 --- a/main/boards/xmini-c3-4g/xmini_c3_4g_board.cc +++ b/main/boards/xmini-c3-4g/xmini_c3_4g_board.cc @@ -20,7 +20,7 @@ #define TAG "XminiC3Board" -LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_puhui_basic_14_1); LV_FONT_DECLARE(font_awesome_14_1); @@ -139,7 +139,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_, true)); display_ = new OledDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, - {&font_puhui_14_1, &font_awesome_14_1}); + {&font_puhui_basic_14_1, &font_awesome_14_1}); } void InitializeButtons() { @@ -178,6 +178,11 @@ public: InitializeTools(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_PUHUI_COMMON_14_1); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/xmini-c3-v3/xmini_c3_board.cc b/main/boards/xmini-c3-v3/xmini_c3_board.cc index b32a093b..f0ea219b 100644 --- a/main/boards/xmini-c3-v3/xmini_c3_board.cc +++ b/main/boards/xmini-c3-v3/xmini_c3_board.cc @@ -20,7 +20,7 @@ #define TAG "XminiC3Board" -LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_puhui_basic_14_1); LV_FONT_DECLARE(font_awesome_14_1); @@ -131,7 +131,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_, true)); display_ = new OledDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, - {&font_puhui_14_1, &font_awesome_14_1}); + {&font_puhui_basic_14_1, &font_awesome_14_1}); } void InitializeButtons() { @@ -174,6 +174,11 @@ public: InitializeTools(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_S_PUHUI_COMMON_14_1); + return &assets; + } + virtual Led* GetLed() override { static SingleLed led(BUILTIN_LED_GPIO); return &led; diff --git a/main/boards/xmini-c3/xmini_c3_board.cc b/main/boards/xmini-c3/xmini_c3_board.cc index 884f62af..40a6f9ab 100644 --- a/main/boards/xmini-c3/xmini_c3_board.cc +++ b/main/boards/xmini-c3/xmini_c3_board.cc @@ -19,7 +19,7 @@ #define TAG "XminiC3Board" -LV_FONT_DECLARE(font_puhui_14_1); +LV_FONT_DECLARE(font_puhui_basic_14_1); LV_FONT_DECLARE(font_awesome_14_1); class XminiC3Board : public WifiBoard { @@ -117,7 +117,7 @@ private: ESP_ERROR_CHECK(esp_lcd_panel_disp_on_off(panel_, true)); display_ = new OledDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, - {&font_puhui_14_1, &font_awesome_14_1}); + {&font_puhui_basic_14_1, &font_awesome_14_1}); } void InitializeButtons() { @@ -172,6 +172,11 @@ public: return display_; } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_S_PUHUI_COMMON_14_1); + return &assets; + } + 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, diff --git a/main/boards/zhengchen-1.54tft-ml307/zhengchen-1.54tft-ml307.cc b/main/boards/zhengchen-1.54tft-ml307/zhengchen-1.54tft-ml307.cc index fb4fb81a..03a71b1d 100644 --- a/main/boards/zhengchen-1.54tft-ml307/zhengchen-1.54tft-ml307.cc +++ b/main/boards/zhengchen-1.54tft-ml307/zhengchen-1.54tft-ml307.cc @@ -19,7 +19,7 @@ #define TAG "ZHENGCHEN_1_54TFT_ML307" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); @@ -155,11 +155,7 @@ private: display_ = new ZHENGCHEN_LcdDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); display_->SetupHighTempWarningPopup(); } @@ -177,6 +173,11 @@ public: GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + virtual AudioCodec* GetAudioCodec() override { static NoAudioCodecSimplex audio_codec(AUDIO_INPUT_SAMPLE_RATE, AUDIO_OUTPUT_SAMPLE_RATE, AUDIO_I2S_SPK_GPIO_BCLK, AUDIO_I2S_SPK_GPIO_LRCK, AUDIO_I2S_SPK_GPIO_DOUT, AUDIO_I2S_MIC_GPIO_SCK, AUDIO_I2S_MIC_GPIO_WS, AUDIO_I2S_MIC_GPIO_DIN); diff --git a/main/boards/zhengchen-1.54tft-wifi/zhengchen-1.54tft-wifi.cc b/main/boards/zhengchen-1.54tft-wifi/zhengchen-1.54tft-wifi.cc index 7dc48790..b228fafd 100644 --- a/main/boards/zhengchen-1.54tft-wifi/zhengchen-1.54tft-wifi.cc +++ b/main/boards/zhengchen-1.54tft-wifi/zhengchen-1.54tft-wifi.cc @@ -19,7 +19,7 @@ #define TAG "ZHENGCHEN_1_54TFT_WIFI" -LV_FONT_DECLARE(font_puhui_20_4); +LV_FONT_DECLARE(font_puhui_basic_20_4); LV_FONT_DECLARE(font_awesome_20_4); @@ -167,11 +167,7 @@ private: display_ = new ZHENGCHEN_LcdDisplay(panel_io_, panel_, DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY, - { - .text_font = &font_puhui_20_4, - .icon_font = &font_awesome_20_4, - .emoji_font = font_emoji_64_init(), - }); + {&font_puhui_basic_20_4, &font_awesome_20_4}); display_->SetupHighTempWarningPopup(); } @@ -179,7 +175,7 @@ private: } public: -ZHENGCHEN_1_54TFT_WIFI() : + ZHENGCHEN_1_54TFT_WIFI() : boot_button_(BOOT_BUTTON_GPIO), volume_up_button_(VOLUME_UP_BUTTON_GPIO), volume_down_button_(VOLUME_DOWN_BUTTON_GPIO) { @@ -192,6 +188,11 @@ ZHENGCHEN_1_54TFT_WIFI() : GetBacklight()->RestoreBrightness(); } + virtual Assets* GetAssets() override { + static Assets assets(ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64); + return &assets; + } + // 获取音频编解码器 virtual AudioCodec* GetAudioCodec() override { // 静态实例化NoAudioCodecSimplex类 diff --git a/main/boards/zhengchen-1.54tft-wifi/zhengchen_lcd_display.h b/main/boards/zhengchen-1.54tft-wifi/zhengchen_lcd_display.h index 7926f18c..87fb547e 100644 --- a/main/boards/zhengchen-1.54tft-wifi/zhengchen_lcd_display.h +++ b/main/boards/zhengchen-1.54tft-wifi/zhengchen_lcd_display.h @@ -17,7 +17,7 @@ public: // 创建高温警告弹窗 high_temp_popup_ = lv_obj_create(lv_screen_active()); // 使用当前屏幕 lv_obj_set_scrollbar_mode(high_temp_popup_, LV_SCROLLBAR_MODE_OFF); - lv_obj_set_size(high_temp_popup_, LV_HOR_RES * 0.9, fonts_.text_font->line_height * 2); + lv_obj_set_size(high_temp_popup_, LV_HOR_RES * 0.9, style_.text_font->line_height * 2); lv_obj_align(high_temp_popup_, LV_ALIGN_BOTTOM_MID, 0, 0); lv_obj_set_style_bg_color(high_temp_popup_, lv_palette_main(LV_PALETTE_RED), 0); lv_obj_set_style_radius(high_temp_popup_, 10, 0); diff --git a/main/display/display.cc b/main/display/display.cc index a0fa6215..61492534 100644 --- a/main/display/display.cc +++ b/main/display/display.cc @@ -47,10 +47,20 @@ Display::~Display() { if (network_label_ != nullptr) { lv_obj_del(network_label_); + } + if (notification_label_ != nullptr) { lv_obj_del(notification_label_); + } + if (status_label_ != nullptr) { lv_obj_del(status_label_); + } + if (mute_label_ != nullptr) { lv_obj_del(mute_label_); + } + if (battery_label_ != nullptr) { lv_obj_del(battery_label_); + } + if (emotion_label_ != nullptr) { lv_obj_del(emotion_label_); } if( low_battery_popup_ != nullptr ) { @@ -197,23 +207,23 @@ void Display::UpdateStatusBar(bool update_all) { void Display::SetEmotion(const char* emotion) { const char* utf8 = font_awesome_get_utf8(emotion); - if (utf8 != nullptr) { - SetIcon(utf8); - } else { - SetIcon(FONT_AWESOME_NEUTRAL); - } -} - -void Display::SetIcon(const char* icon) { DisplayLockGuard lock(this); if (emotion_label_ == nullptr) { return; } - lv_label_set_text(emotion_label_, icon); + if (utf8 != nullptr) { + lv_label_set_text(emotion_label_, utf8); + } else { + lv_label_set_text(emotion_label_, FONT_AWESOME_NEUTRAL); + } } void Display::SetPreviewImage(const lv_img_dsc_t* image) { - // Do nothing + // Do nothing but free the image + if (image != nullptr) { + heap_caps_free((void*)image->data); + heap_caps_free((void*)image); + } } void Display::SetChatMessage(const char* role, const char* content) { @@ -238,4 +248,16 @@ void Display::SetPowerSaveMode(bool on) { SetChatMessage("system", ""); SetEmotion("neutral"); } -} \ No newline at end of file +} + +void Display::UpdateStyle(const DisplayStyle& style) { + DisplayLockGuard lock(this); + if (style.text_font != nullptr) { + lv_obj_set_style_text_font(lv_screen_active(), style.text_font, 0); + style_.text_font = style.text_font; + } + if (style.emoji_collection != nullptr) { + delete style_.emoji_collection; + style_.emoji_collection = style.emoji_collection; + } +} diff --git a/main/display/display.h b/main/display/display.h index 244e3de6..9c93c546 100644 --- a/main/display/display.h +++ b/main/display/display.h @@ -1,6 +1,8 @@ #ifndef DISPLAY_H #define DISPLAY_H +#include "emoji_collection.h" + #include #include #include @@ -9,10 +11,11 @@ #include #include -struct DisplayFonts { - const lv_font_t* text_font = nullptr; - const lv_font_t* icon_font = nullptr; - const lv_font_t* emoji_font = nullptr; + +struct DisplayStyle { + const lv_font_t* text_font; + const lv_font_t* icon_font; + EmojiCollection* emoji_collection; }; class Display { @@ -25,11 +28,11 @@ public: virtual void ShowNotification(const std::string ¬ification, int duration_ms = 3000); virtual void SetEmotion(const char* emotion); virtual void SetChatMessage(const char* role, const char* content); - virtual void SetIcon(const char* icon); virtual void SetPreviewImage(const lv_img_dsc_t* image); virtual void SetTheme(const std::string& theme_name); virtual std::string GetTheme() { return current_theme_name_; } virtual void UpdateStatusBar(bool update_all = false); + virtual void UpdateStyle(const DisplayStyle& style); virtual void SetPowerSaveMode(bool on); inline int width() const { return width_; } @@ -56,6 +59,7 @@ protected: const char* network_icon_ = nullptr; bool muted_ = false; std::string current_theme_name_; + DisplayStyle style_; std::chrono::system_clock::time_point last_status_update_time_; esp_timer_handle_t notification_timer_ = nullptr; diff --git a/main/display/emoji_collection.cc b/main/display/emoji_collection.cc new file mode 100644 index 00000000..8027d33c --- /dev/null +++ b/main/display/emoji_collection.cc @@ -0,0 +1,144 @@ +#include "emoji_collection.h" + +#include +#include +#include + +#define TAG "EmojiCollection" + +// These are declared in xiaozhi-fonts/src/font_emoji_32.c +extern const lv_image_dsc_t emoji_1f636_32; // neutral +extern const lv_image_dsc_t emoji_1f642_32; // happy +extern const lv_image_dsc_t emoji_1f606_32; // laughing +extern const lv_image_dsc_t emoji_1f602_32; // funny +extern const lv_image_dsc_t emoji_1f614_32; // sad +extern const lv_image_dsc_t emoji_1f620_32; // angry +extern const lv_image_dsc_t emoji_1f62d_32; // crying +extern const lv_image_dsc_t emoji_1f60d_32; // loving +extern const lv_image_dsc_t emoji_1f633_32; // embarrassed +extern const lv_image_dsc_t emoji_1f62f_32; // surprised +extern const lv_image_dsc_t emoji_1f631_32; // shocked +extern const lv_image_dsc_t emoji_1f914_32; // thinking +extern const lv_image_dsc_t emoji_1f609_32; // winking +extern const lv_image_dsc_t emoji_1f60e_32; // cool +extern const lv_image_dsc_t emoji_1f60c_32; // relaxed +extern const lv_image_dsc_t emoji_1f924_32; // delicious +extern const lv_image_dsc_t emoji_1f618_32; // kissy +extern const lv_image_dsc_t emoji_1f60f_32; // confident +extern const lv_image_dsc_t emoji_1f634_32; // sleepy +extern const lv_image_dsc_t emoji_1f61c_32; // silly +extern const lv_image_dsc_t emoji_1f644_32; // confused + +const lv_img_dsc_t* Twemoji32::GetEmojiImage(const char* name) const { + static const std::unordered_map emoji_map = { + {"neutral", &emoji_1f636_32}, + {"happy", &emoji_1f642_32}, + {"laughing", &emoji_1f606_32}, + {"funny", &emoji_1f602_32}, + {"sad", &emoji_1f614_32}, + {"angry", &emoji_1f620_32}, + {"crying", &emoji_1f62d_32}, + {"loving", &emoji_1f60d_32}, + {"embarrassed", &emoji_1f633_32}, + {"surprised", &emoji_1f62f_32}, + {"shocked", &emoji_1f631_32}, + {"thinking", &emoji_1f914_32}, + {"winking", &emoji_1f609_32}, + {"cool", &emoji_1f60e_32}, + {"relaxed", &emoji_1f60c_32}, + {"delicious", &emoji_1f924_32}, + {"kissy", &emoji_1f618_32}, + {"confident", &emoji_1f60f_32}, + {"sleepy", &emoji_1f634_32}, + {"silly", &emoji_1f61c_32}, + {"confused", &emoji_1f644_32}, + }; + + auto it = emoji_map.find(name); + if (it != emoji_map.end()) { + return it->second; + } + + ESP_LOGW(TAG, "Emoji not found: %s", name); + return nullptr; +} + + +// These are declared in xiaozhi-fonts/src/font_emoji_64.c +extern const lv_image_dsc_t emoji_1f636_64; // neutral +extern const lv_image_dsc_t emoji_1f642_64; // happy +extern const lv_image_dsc_t emoji_1f606_64; // laughing +extern const lv_image_dsc_t emoji_1f602_64; // funny +extern const lv_image_dsc_t emoji_1f614_64; // sad +extern const lv_image_dsc_t emoji_1f620_64; // angry +extern const lv_image_dsc_t emoji_1f62d_64; // crying +extern const lv_image_dsc_t emoji_1f60d_64; // loving +extern const lv_image_dsc_t emoji_1f633_64; // embarrassed +extern const lv_image_dsc_t emoji_1f62f_64; // surprised +extern const lv_image_dsc_t emoji_1f631_64; // shocked +extern const lv_image_dsc_t emoji_1f914_64; // thinking +extern const lv_image_dsc_t emoji_1f609_64; // winking +extern const lv_image_dsc_t emoji_1f60e_64; // cool +extern const lv_image_dsc_t emoji_1f60c_64; // relaxed +extern const lv_image_dsc_t emoji_1f924_64; // delicious +extern const lv_image_dsc_t emoji_1f618_64; // kissy +extern const lv_image_dsc_t emoji_1f60f_64; // confident +extern const lv_image_dsc_t emoji_1f634_64; // sleepy +extern const lv_image_dsc_t emoji_1f61c_64; // silly +extern const lv_image_dsc_t emoji_1f644_64; // confused + +const lv_img_dsc_t* Twemoji64::GetEmojiImage(const char* name) const { + static const std::unordered_map emoji_map = { + {"neutral", &emoji_1f636_64}, + {"happy", &emoji_1f642_64}, + {"laughing", &emoji_1f606_64}, + {"funny", &emoji_1f602_64}, + {"sad", &emoji_1f614_64}, + {"angry", &emoji_1f620_64}, + {"crying", &emoji_1f62d_64}, + {"loving", &emoji_1f60d_64}, + {"embarrassed", &emoji_1f633_64}, + {"surprised", &emoji_1f62f_64}, + {"shocked", &emoji_1f631_64}, + {"thinking", &emoji_1f914_64}, + {"winking", &emoji_1f609_64}, + {"cool", &emoji_1f60e_64}, + {"relaxed", &emoji_1f60c_64}, + {"delicious", &emoji_1f924_64}, + {"kissy", &emoji_1f618_64}, + {"confident", &emoji_1f60f_64}, + {"sleepy", &emoji_1f634_64}, + {"silly", &emoji_1f61c_64}, + {"confused", &emoji_1f644_64}, + }; + + auto it = emoji_map.find(name); + if (it != emoji_map.end()) { + return it->second; + } + + ESP_LOGW(TAG, "Emoji not found: %s", name); + return nullptr; +} + + +void CustomEmojiCollection::AddEmoji(const std::string& name, lv_img_dsc_t* image) { + emoji_collection_[name] = image; +} + +const lv_img_dsc_t* CustomEmojiCollection::GetEmojiImage(const char* name) const { + auto it = emoji_collection_.find(name); + if (it != emoji_collection_.end()) { + return it->second; + } + + ESP_LOGW(TAG, "Emoji not found: %s", name); + return nullptr; +} + +CustomEmojiCollection::~CustomEmojiCollection() { + for (auto it = emoji_collection_.begin(); it != emoji_collection_.end(); ++it) { + delete it->second; + } + emoji_collection_.clear(); +} \ No newline at end of file diff --git a/main/display/emoji_collection.h b/main/display/emoji_collection.h new file mode 100644 index 00000000..8883c660 --- /dev/null +++ b/main/display/emoji_collection.h @@ -0,0 +1,36 @@ +#ifndef EMOJI_COLLECTION_H +#define EMOJI_COLLECTION_H + +#include + +#include +#include + + +// Define interface for emoji collection +class EmojiCollection { +public: + virtual const lv_img_dsc_t* GetEmojiImage(const char* name) const = 0; + virtual ~EmojiCollection() = default; +}; + +class Twemoji32 : public EmojiCollection { +public: + virtual const lv_img_dsc_t* GetEmojiImage(const char* name) const override; +}; + +class Twemoji64 : public EmojiCollection { +public: + virtual const lv_img_dsc_t* GetEmojiImage(const char* name) const override; +}; + +class CustomEmojiCollection : public EmojiCollection { +private: + std::map emoji_collection_; +public: + void AddEmoji(const std::string& name, lv_img_dsc_t* image); + virtual const lv_img_dsc_t* GetEmojiImage(const char* name) const override; + virtual ~CustomEmojiCollection(); +}; + +#endif diff --git a/main/display/esplog_display.cc b/main/display/esplog_display.cc index 68784c2f..b7d4a212 100644 --- a/main/display/esplog_display.cc +++ b/main/display/esplog_display.cc @@ -31,11 +31,6 @@ void EspLogDisplay::SetEmotion(const char* emotion) ESP_LOGW(TAG, "SetEmotion: %s", emotion); } -void EspLogDisplay::SetIcon(const char* icon) -{ - ESP_LOGW(TAG, "SetIcon: %s", icon); -} - void EspLogDisplay::SetChatMessage(const char* role, const char* content) { ESP_LOGW(TAG, "Role:%s", role); diff --git a/main/display/esplog_display.h b/main/display/esplog_display.h index 031223a8..58b8903a 100644 --- a/main/display/esplog_display.h +++ b/main/display/esplog_display.h @@ -14,8 +14,7 @@ public: virtual void ShowNotification(const char* notification, int duration_ms = 3000); virtual void ShowNotification(const std::string ¬ification, int duration_ms = 3000); virtual void SetEmotion(const char* emotion) override; - virtual void SetChatMessage(const char* role, const char* content) override; - virtual void SetIcon(const char* icon) override; + virtual void SetChatMessage(const char* role, const char* content) override; virtual inline void SetPreviewImage(const lv_img_dsc_t* image) override {} virtual inline void SetTheme(const std::string& theme_name) override {} virtual inline void UpdateStatusBar(bool update_all = false) override {} diff --git a/main/display/lcd_display.cc b/main/display/lcd_display.cc index ce028a4b..a90f1fef 100644 --- a/main/display/lcd_display.cc +++ b/main/display/lcd_display.cc @@ -67,10 +67,11 @@ const ThemeColors LIGHT_THEME = { LV_FONT_DECLARE(font_awesome_30_4); -LcdDisplay::LcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, DisplayFonts fonts, int width, int height) - : panel_io_(panel_io), panel_(panel), fonts_(fonts) { +LcdDisplay::LcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, DisplayStyle style) + : panel_io_(panel_io), panel_(panel) { width_ = width; height_ = height; + style_ = style; // Load theme from settings Settings settings("display", false); @@ -82,12 +83,25 @@ LcdDisplay::LcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_ } else if (current_theme_name_ == "light") { current_theme_ = LIGHT_THEME; } + + // Create a timer to hide the preview image + esp_timer_create_args_t preview_timer_args = { + .callback = [](void* arg) { + LcdDisplay* display = static_cast(arg); + display->SetPreviewImage(nullptr); + }, + .arg = this, + .dispatch_method = ESP_TIMER_TASK, + .name = "preview_timer", + .skip_unhandled_events = false, + }; + esp_timer_create(&preview_timer_args, &preview_timer_); } SpiLcdDisplay::SpiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy, - DisplayFonts fonts) - : LcdDisplay(panel_io, panel, fonts, width, height) { + DisplayStyle style) + : LcdDisplay(panel_io, panel, width, height, style) { // draw white std::vector buffer(width_, 0xFFFF); @@ -163,8 +177,8 @@ SpiLcdDisplay::SpiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_h RgbLcdDisplay::RgbLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy, - DisplayFonts fonts) - : LcdDisplay(panel_io, panel, fonts, width, height) { + DisplayStyle style) + : LcdDisplay(panel_io, panel, width, height, style) { // draw white std::vector buffer(width_, 0xFFFF); @@ -225,8 +239,8 @@ RgbLcdDisplay::RgbLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_h MipiLcdDisplay::MipiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy, - DisplayFonts fonts) - : LcdDisplay(panel_io, panel, fonts, width, height) { + DisplayStyle style) + : LcdDisplay(panel_io, panel, width, height, style) { // Set the display to on ESP_LOGI(TAG, "Turning display on"); @@ -241,16 +255,16 @@ MipiLcdDisplay::MipiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel ESP_LOGI(TAG, "Adding LCD display"); const lvgl_port_display_cfg_t disp_cfg = { - .io_handle = panel_io, - .panel_handle = panel, - .control_handle = nullptr, - .buffer_size = static_cast(width_ * 50), - .double_buffer = false, - .hres = static_cast(width_), - .vres = static_cast(height_), - .monochrome = false, - /* Rotation values must be same as used in esp_lcd for initial settings of the screen */ - .rotation = { + .io_handle = panel_io, + .panel_handle = panel, + .control_handle = nullptr, + .buffer_size = static_cast(width_ * 50), + .double_buffer = false, + .hres = static_cast(width_), + .vres = static_cast(height_), + .monochrome = false, + /* Rotation values must be same as used in esp_lcd for initial settings of the screen */ + .rotation = { .swap_xy = swap_xy, .mirror_x = mirror_x, .mirror_y = mirror_y, @@ -281,6 +295,12 @@ MipiLcdDisplay::MipiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel } LcdDisplay::~LcdDisplay() { + SetPreviewImage(nullptr); + if (preview_timer_ != nullptr) { + esp_timer_stop(preview_timer_); + esp_timer_delete(preview_timer_); + } + // 然后再清理 LVGL 对象 if (content_ != nullptr) { lv_obj_del(content_); @@ -319,7 +339,7 @@ void LcdDisplay::SetupUI() { DisplayLockGuard lock(this); auto screen = lv_screen_active(); - lv_obj_set_style_text_font(screen, fonts_.text_font, 0); + lv_obj_set_style_text_font(screen, style_.text_font, 0); lv_obj_set_style_text_color(screen, current_theme_.text, 0); lv_obj_set_style_bg_color(screen, current_theme_.background, 0); @@ -374,12 +394,10 @@ void LcdDisplay::SetupUI() { // 设置状态栏的内容垂直居中 lv_obj_set_flex_align(status_bar_, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - // 创建emotion_label_在状态栏最左侧 - emotion_label_ = lv_label_create(status_bar_); - lv_obj_set_style_text_font(emotion_label_, &font_awesome_30_4, 0); - lv_obj_set_style_text_color(emotion_label_, current_theme_.text, 0); - lv_label_set_text(emotion_label_, FONT_AWESOME_MICROCHIP_AI); - lv_obj_set_style_margin_right(emotion_label_, 5, 0); // 添加右边距,与后面的元素分隔 + network_label_ = lv_label_create(status_bar_); + lv_label_set_text(network_label_, ""); + lv_obj_set_style_text_font(network_label_, style_.icon_font, 0); + lv_obj_set_style_text_color(network_label_, current_theme_.text, 0); notification_label_ = lv_label_create(status_bar_); lv_obj_set_flex_grow(notification_label_, 1); @@ -397,25 +415,19 @@ void LcdDisplay::SetupUI() { mute_label_ = lv_label_create(status_bar_); lv_label_set_text(mute_label_, ""); - lv_obj_set_style_text_font(mute_label_, fonts_.icon_font, 0); + lv_obj_set_style_text_font(mute_label_, style_.icon_font, 0); lv_obj_set_style_text_color(mute_label_, current_theme_.text, 0); - network_label_ = lv_label_create(status_bar_); - lv_label_set_text(network_label_, ""); - lv_obj_set_style_text_font(network_label_, fonts_.icon_font, 0); - lv_obj_set_style_text_color(network_label_, current_theme_.text, 0); - lv_obj_set_style_margin_left(network_label_, 5, 0); // 添加左边距,与前面的元素分隔 - battery_label_ = lv_label_create(status_bar_); lv_label_set_text(battery_label_, ""); - lv_obj_set_style_text_font(battery_label_, fonts_.icon_font, 0); + lv_obj_set_style_text_font(battery_label_, style_.icon_font, 0); lv_obj_set_style_text_color(battery_label_, current_theme_.text, 0); lv_obj_set_style_margin_left(battery_label_, 5, 0); // 添加左边距,与前面的元素分隔 low_battery_popup_ = lv_obj_create(screen); lv_obj_set_scrollbar_mode(low_battery_popup_, LV_SCROLLBAR_MODE_OFF); - lv_obj_set_size(low_battery_popup_, LV_HOR_RES * 0.9, fonts_.text_font->line_height * 2); - lv_obj_align(low_battery_popup_, LV_ALIGN_BOTTOM_MID, 0, 0); + lv_obj_set_size(low_battery_popup_, LV_HOR_RES * 0.9, style_.text_font->line_height * 2); + lv_obj_align(low_battery_popup_, LV_ALIGN_BOTTOM_MID, 0, -10); lv_obj_set_style_bg_color(low_battery_popup_, current_theme_.low_battery, 0); lv_obj_set_style_radius(low_battery_popup_, 10, 0); low_battery_label_ = lv_label_create(low_battery_popup_); @@ -423,6 +435,16 @@ void LcdDisplay::SetupUI() { lv_obj_set_style_text_color(low_battery_label_, lv_color_white(), 0); lv_obj_center(low_battery_label_); lv_obj_add_flag(low_battery_popup_, LV_OBJ_FLAG_HIDDEN); + + emoji_image_ = lv_img_create(screen); + lv_obj_align(emoji_image_, LV_ALIGN_TOP_MID, 0, style_.text_font->line_height + 10); + + // Display AI logo while booting + emotion_label_ = lv_label_create(screen); + lv_obj_center(emotion_label_); + lv_obj_set_style_text_font(emotion_label_, &font_awesome_30_4, 0); + lv_obj_set_style_text_color(emotion_label_, current_theme_.text, 0); + lv_label_set_text(emotion_label_, FONT_AWESOME_MICROCHIP_AI); } #if CONFIG_IDF_TARGET_ESP32P4 #define MAX_MESSAGES 40 @@ -435,9 +457,6 @@ void LcdDisplay::SetChatMessage(const char* role, const char* content) { return; } - //避免出现空的消息框 - if(strlen(content) == 0) return; - // 检查消息数量是否超过限制 uint32_t child_count = lv_obj_get_child_cnt(content_); if (child_count >= MAX_MESSAGES) { @@ -454,23 +473,33 @@ void LcdDisplay::SetChatMessage(const char* role, const char* content) { } // 折叠系统消息(如果是系统消息,检查最后一个消息是否也是系统消息) - if (strcmp(role, "system") == 0 && child_count > 0) { - // 获取最后一个消息容器 - lv_obj_t* last_container = lv_obj_get_child(content_, child_count - 1); - if (last_container != nullptr && lv_obj_get_child_cnt(last_container) > 0) { - // 获取容器内的气泡 - lv_obj_t* last_bubble = lv_obj_get_child(last_container, 0); - if (last_bubble != nullptr) { - // 检查气泡类型是否为系统消息 - void* bubble_type_ptr = lv_obj_get_user_data(last_bubble); - if (bubble_type_ptr != nullptr && strcmp((const char*)bubble_type_ptr, "system") == 0) { - // 如果最后一个消息也是系统消息,则删除它 - lv_obj_del(last_container); + if (strcmp(role, "system") == 0) { + if (child_count > 0) { + // 获取最后一个消息容器 + lv_obj_t* last_container = lv_obj_get_child(content_, child_count - 1); + if (last_container != nullptr && lv_obj_get_child_cnt(last_container) > 0) { + // 获取容器内的气泡 + lv_obj_t* last_bubble = lv_obj_get_child(last_container, 0); + if (last_bubble != nullptr) { + // 检查气泡类型是否为系统消息 + void* bubble_type_ptr = lv_obj_get_user_data(last_bubble); + if (bubble_type_ptr != nullptr && strcmp((const char*)bubble_type_ptr, "system") == 0) { + // 如果最后一个消息也是系统消息,则删除它 + lv_obj_del(last_container); + } } } } + } else { + // 隐藏居中显示的 AI logo + lv_obj_add_flag(emotion_label_, LV_OBJ_FLAG_HIDDEN); } - + + //避免出现空的消息框 + if(strlen(content) == 0) { + return; + } + // Create a message bubble lv_obj_t* msg_bubble = lv_obj_create(content_); lv_obj_set_style_radius(msg_bubble, 8, 0); @@ -484,7 +513,7 @@ void LcdDisplay::SetChatMessage(const char* role, const char* content) { lv_label_set_text(msg_text, content); // 计算文本实际宽度 - lv_coord_t text_width = lv_txt_get_width(content, strlen(content), fonts_.text_font, 0); + lv_coord_t text_width = lv_txt_get_width(content, strlen(content), style_.text_font, 0); // 计算气泡宽度 lv_coord_t max_width = LV_HOR_RES * 85 / 100 - 16; // 屏幕宽度的85% @@ -506,7 +535,6 @@ void LcdDisplay::SetChatMessage(const char* role, const char* content) { // 设置消息文本的宽度 lv_obj_set_width(msg_text, bubble_width); // 减去padding lv_label_set_long_mode(msg_text, LV_LABEL_LONG_WRAP); - lv_obj_set_style_text_font(msg_text, fonts_.text_font, 0); // 设置气泡宽度 lv_obj_set_width(msg_bubble, bubble_width); @@ -636,41 +664,18 @@ void LcdDisplay::SetPreviewImage(const lv_img_dsc_t* img_dsc) { // Create the image object inside the bubble lv_obj_t* preview_image = lv_image_create(img_bubble); - // Copy the image descriptor and data to avoid source data changes - lv_img_dsc_t* copied_img_dsc = (lv_img_dsc_t*)heap_caps_malloc(sizeof(lv_img_dsc_t), MALLOC_CAP_8BIT); - if (copied_img_dsc == nullptr) { - ESP_LOGE(TAG, "Failed to allocate memory for image descriptor"); - lv_obj_del(img_bubble); - return; - } - - // Copy the header - copied_img_dsc->header = img_dsc->header; - copied_img_dsc->data_size = img_dsc->data_size; - - // Copy the image data - uint8_t* copied_data = (uint8_t*)heap_caps_malloc(img_dsc->data_size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (copied_data == nullptr) { - // Fallback to internal RAM if SPIRAM allocation fails - copied_data = (uint8_t*)heap_caps_malloc(img_dsc->data_size, MALLOC_CAP_8BIT); - } - if (copied_data == nullptr) { - ESP_LOGE(TAG, "Failed to allocate memory for image data (size: %lu bytes)", img_dsc->data_size); - heap_caps_free(copied_img_dsc); - lv_obj_del(img_bubble); - return; - } - - memcpy(copied_data, img_dsc->data, img_dsc->data_size); - copied_img_dsc->data = copied_data; - // Calculate appropriate size for the image lv_coord_t max_width = LV_HOR_RES * 70 / 100; // 70% of screen width lv_coord_t max_height = LV_VER_RES * 50 / 100; // 50% of screen height // Calculate zoom factor to fit within maximum dimensions - lv_coord_t img_width = copied_img_dsc->header.w; - lv_coord_t img_height = copied_img_dsc->header.h; + lv_coord_t img_width = img_dsc->header.w; + lv_coord_t img_height = img_dsc->header.h; + if (img_width == 0 || img_height == 0) { + img_width = max_width; + img_height = max_height; + ESP_LOGW(TAG, "Invalid image dimensions: %ld x %ld, using default dimensions: %ld x %ld", img_width, img_height, max_width, max_height); + } lv_coord_t zoom_w = (max_width * 256) / img_width; lv_coord_t zoom_h = (max_height * 256) / img_height; @@ -680,17 +685,17 @@ void LcdDisplay::SetPreviewImage(const lv_img_dsc_t* img_dsc) { if (zoom > 256) zoom = 256; // Set image properties - lv_image_set_src(preview_image, copied_img_dsc); + lv_image_set_src(preview_image, img_dsc); lv_image_set_scale(preview_image, zoom); // Add event handler to clean up copied data when image is deleted lv_obj_add_event_cb(preview_image, [](lv_event_t* e) { - lv_img_dsc_t* copied_img_dsc = (lv_img_dsc_t*)lv_event_get_user_data(e); - if (copied_img_dsc != nullptr) { - heap_caps_free((void*)copied_img_dsc->data); - heap_caps_free(copied_img_dsc); + lv_img_dsc_t* img_dsc = (lv_img_dsc_t*)lv_event_get_user_data(e); + if (img_dsc != nullptr) { + heap_caps_free((void*)img_dsc->data); + heap_caps_free(img_dsc); } - }, LV_EVENT_DELETE, (void*)copied_img_dsc); + }, LV_EVENT_DELETE, (void*)img_dsc); // Calculate actual scaled image dimensions lv_coord_t scaled_width = (img_width * zoom) / 256; @@ -718,7 +723,7 @@ void LcdDisplay::SetupUI() { DisplayLockGuard lock(this); auto screen = lv_screen_active(); - lv_obj_set_style_text_font(screen, fonts_.text_font, 0); + lv_obj_set_style_text_font(screen, style_.text_font, 0); lv_obj_set_style_text_color(screen, current_theme_.text, 0); lv_obj_set_style_bg_color(screen, current_theme_.background, 0); @@ -734,7 +739,7 @@ void LcdDisplay::SetupUI() { /* Status bar */ status_bar_ = lv_obj_create(container_); - lv_obj_set_size(status_bar_, LV_HOR_RES, fonts_.text_font->line_height); + lv_obj_set_size(status_bar_, LV_HOR_RES, style_.text_font->line_height); lv_obj_set_style_radius(status_bar_, 0, 0); lv_obj_set_style_bg_color(status_bar_, current_theme_.background, 0); lv_obj_set_style_text_color(status_bar_, current_theme_.text, 0); @@ -752,13 +757,22 @@ void LcdDisplay::SetupUI() { lv_obj_set_flex_flow(content_, LV_FLEX_FLOW_COLUMN); // 垂直布局(从上到下) lv_obj_set_flex_align(content_, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_SPACE_EVENLY); // 子对象居中对齐,等距分布 - emotion_label_ = lv_label_create(content_); + emoji_box_ = lv_obj_create(content_); + lv_obj_set_size(emoji_box_, LV_SIZE_CONTENT, LV_SIZE_CONTENT); + lv_obj_set_style_bg_opa(emoji_box_, LV_OPA_TRANSP, 0); + lv_obj_set_style_pad_all(emoji_box_, 0, 0); + lv_obj_set_style_border_width(emoji_box_, 0, 0); + + emotion_label_ = lv_label_create(emoji_box_); lv_obj_set_style_text_font(emotion_label_, &font_awesome_30_4, 0); lv_obj_set_style_text_color(emotion_label_, current_theme_.text, 0); lv_label_set_text(emotion_label_, FONT_AWESOME_MICROCHIP_AI); + emoji_image_ = lv_img_create(emoji_box_); + lv_obj_center(emoji_image_); + preview_image_ = lv_image_create(content_); - lv_obj_set_size(preview_image_, width_ * 0.5, height_ * 0.5); + lv_obj_set_size(preview_image_, width_ / 2, height_ / 2); lv_obj_align(preview_image_, LV_ALIGN_CENTER, 0, 0); lv_obj_add_flag(preview_image_, LV_OBJ_FLAG_HIDDEN); @@ -779,7 +793,7 @@ void LcdDisplay::SetupUI() { network_label_ = lv_label_create(status_bar_); lv_label_set_text(network_label_, ""); - lv_obj_set_style_text_font(network_label_, fonts_.icon_font, 0); + lv_obj_set_style_text_font(network_label_, style_.icon_font, 0); lv_obj_set_style_text_color(network_label_, current_theme_.text, 0); notification_label_ = lv_label_create(status_bar_); @@ -795,20 +809,21 @@ void LcdDisplay::SetupUI() { lv_obj_set_style_text_align(status_label_, LV_TEXT_ALIGN_CENTER, 0); lv_obj_set_style_text_color(status_label_, current_theme_.text, 0); lv_label_set_text(status_label_, Lang::Strings::INITIALIZING); + mute_label_ = lv_label_create(status_bar_); lv_label_set_text(mute_label_, ""); - lv_obj_set_style_text_font(mute_label_, fonts_.icon_font, 0); + lv_obj_set_style_text_font(mute_label_, style_.icon_font, 0); lv_obj_set_style_text_color(mute_label_, current_theme_.text, 0); battery_label_ = lv_label_create(status_bar_); lv_label_set_text(battery_label_, ""); - lv_obj_set_style_text_font(battery_label_, fonts_.icon_font, 0); + lv_obj_set_style_text_font(battery_label_, style_.icon_font, 0); lv_obj_set_style_text_color(battery_label_, current_theme_.text, 0); low_battery_popup_ = lv_obj_create(screen); lv_obj_set_scrollbar_mode(low_battery_popup_, LV_SCROLLBAR_MODE_OFF); - lv_obj_set_size(low_battery_popup_, LV_HOR_RES * 0.9, fonts_.text_font->line_height * 2); - lv_obj_align(low_battery_popup_, LV_ALIGN_BOTTOM_MID, 0, 0); + lv_obj_set_size(low_battery_popup_, LV_HOR_RES * 0.9, style_.text_font->line_height * 2); + lv_obj_align(low_battery_popup_, LV_ALIGN_BOTTOM_MID, 0, -10); lv_obj_set_style_bg_color(low_battery_popup_, current_theme_.low_battery, 0); lv_obj_set_style_radius(low_battery_popup_, 10, 0); low_battery_label_ = lv_label_create(low_battery_popup_); @@ -821,109 +836,67 @@ void LcdDisplay::SetupUI() { void LcdDisplay::SetPreviewImage(const lv_img_dsc_t* img_dsc) { DisplayLockGuard lock(this); if (preview_image_ == nullptr) { + ESP_LOGE(TAG, "Preview image is not initialized"); return; } + + auto old_src = (const lv_img_dsc_t*)lv_image_get_src(preview_image_); + if (old_src != nullptr) { + lv_image_set_src(preview_image_, nullptr); + heap_caps_free((void*)old_src->data); + heap_caps_free((void*)old_src); + } if (img_dsc != nullptr) { // 设置图片源并显示预览图片 lv_image_set_src(preview_image_, img_dsc); - if (img_dsc->header.w > 0) { + if (img_dsc->header.w > 0 && img_dsc->header.h > 0) { // zoom factor 0.5 lv_image_set_scale(preview_image_, 128 * width_ / img_dsc->header.w); } + // Hide emoji_box_ + lv_obj_add_flag(emoji_box_, LV_OBJ_FLAG_HIDDEN); lv_obj_remove_flag(preview_image_, LV_OBJ_FLAG_HIDDEN); - // 隐藏emotion_label_ - if (emotion_label_ != nullptr) { - lv_obj_add_flag(emotion_label_, LV_OBJ_FLAG_HIDDEN); - } + esp_timer_stop(preview_timer_); + ESP_ERROR_CHECK(esp_timer_start_once(preview_timer_, PREVIEW_IMAGE_DURATION_MS * 1000)); } else { - // 隐藏预览图片并显示emotion_label_ + esp_timer_stop(preview_timer_); + lv_obj_remove_flag(emoji_box_, LV_OBJ_FLAG_HIDDEN); lv_obj_add_flag(preview_image_, LV_OBJ_FLAG_HIDDEN); - if (emotion_label_ != nullptr) { - lv_obj_remove_flag(emotion_label_, LV_OBJ_FLAG_HIDDEN); - } } } #endif void LcdDisplay::SetEmotion(const char* emotion) { - struct Emotion { - const char* icon; - const char* text; - }; + if (emoji_image_ == nullptr) { + return; + } - static const std::vector emotions = { - {"😶", "neutral"}, - {"🙂", "happy"}, - {"😆", "laughing"}, - {"😂", "funny"}, - {"😔", "sad"}, - {"😠", "angry"}, - {"😭", "crying"}, - {"😍", "loving"}, - {"😳", "embarrassed"}, - {"😯", "surprised"}, - {"😱", "shocked"}, - {"🤔", "thinking"}, - {"😉", "winking"}, - {"😎", "cool"}, - {"😌", "relaxed"}, - {"🤤", "delicious"}, - {"😘", "kissy"}, - {"😏", "confident"}, - {"😴", "sleepy"}, - {"😜", "silly"}, - {"🙄", "confused"} - }; - - // 查找匹配的表情 - std::string_view emotion_view(emotion); - auto it = std::find_if(emotions.begin(), emotions.end(), - [&emotion_view](const Emotion& e) { return e.text == emotion_view; }); - if (fonts_.emoji_font == nullptr || it == emotions.end()) { + auto img_dsc = style_.emoji_collection != nullptr ? style_.emoji_collection->GetEmojiImage(emotion) : nullptr; + if (img_dsc == nullptr) { const char* utf8 = font_awesome_get_utf8(emotion); - if (utf8 != nullptr) { - SetIcon(utf8); + if (utf8 != nullptr && emotion_label_ != nullptr) { + DisplayLockGuard lock(this); + lv_label_set_text(emotion_label_, utf8); + lv_obj_remove_flag(emotion_label_, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(emoji_image_, LV_OBJ_FLAG_HIDDEN); } return; } DisplayLockGuard lock(this); - if (emotion_label_ == nullptr) { - return; - } - - // 如果找到匹配的表情就显示对应图标,否则显示默认的neutral表情 - lv_obj_set_style_text_font(emotion_label_, fonts_.emoji_font, 0); - if (it != emotions.end()) { - lv_label_set_text(emotion_label_, it->icon); + lv_image_set_src(emoji_image_, img_dsc); +#if CONFIG_USE_WECHAT_MESSAGE_STYLE + // Wechat message style中,如果emotion是neutral,则隐藏emoji_image_ + if (strcmp(emotion, "neutral") == 0) { + lv_obj_add_flag(emoji_image_, LV_OBJ_FLAG_HIDDEN); } else { - lv_label_set_text(emotion_label_, "😶"); - } - -#if !CONFIG_USE_WECHAT_MESSAGE_STYLE - // 显示emotion_label_,隐藏preview_image_ - lv_obj_remove_flag(emotion_label_, LV_OBJ_FLAG_HIDDEN); - if (preview_image_ != nullptr) { - lv_obj_add_flag(preview_image_, LV_OBJ_FLAG_HIDDEN); - } -#endif -} - -void LcdDisplay::SetIcon(const char* icon) { - DisplayLockGuard lock(this); - if (emotion_label_ == nullptr) { - return; - } - lv_obj_set_style_text_font(emotion_label_, &font_awesome_30_4, 0); - lv_label_set_text(emotion_label_, icon); - -#if !CONFIG_USE_WECHAT_MESSAGE_STYLE - // 显示emotion_label_,隐藏preview_image_ - lv_obj_remove_flag(emotion_label_, LV_OBJ_FLAG_HIDDEN); - if (preview_image_ != nullptr) { - lv_obj_add_flag(preview_image_, LV_OBJ_FLAG_HIDDEN); + lv_obj_remove_flag(emoji_image_, LV_OBJ_FLAG_HIDDEN); } +#else + // 显示emoji_image_,隐藏emotion_label_, preview_image_ + lv_obj_remove_flag(emoji_image_, LV_OBJ_FLAG_HIDDEN); + lv_obj_add_flag(emotion_label_, LV_OBJ_FLAG_HIDDEN); #endif } diff --git a/main/display/lcd_display.h b/main/display/lcd_display.h index 3c6de33b..341424c6 100644 --- a/main/display/lcd_display.h +++ b/main/display/lcd_display.h @@ -8,6 +8,9 @@ #include #include +#include + +#define PREVIEW_IMAGE_DURATION_MS 5000 // Theme color structure struct ThemeColors { @@ -34,8 +37,10 @@ protected: lv_obj_t* container_ = nullptr; lv_obj_t* side_bar_ = nullptr; lv_obj_t* preview_image_ = nullptr; + lv_obj_t* emoji_image_ = nullptr; + lv_obj_t* emoji_box_ = nullptr; + esp_timer_handle_t preview_timer_ = nullptr; - DisplayFonts fonts_; ThemeColors current_theme_; void SetupUI(); @@ -44,12 +49,11 @@ protected: protected: // 添加protected构造函数 - LcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, DisplayFonts fonts, int width, int height); + LcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, DisplayStyle style); public: ~LcdDisplay(); virtual void SetEmotion(const char* emotion) override; - virtual void SetIcon(const char* icon) override; virtual void SetPreviewImage(const lv_img_dsc_t* img_dsc) override; #if CONFIG_USE_WECHAT_MESSAGE_STYLE virtual void SetChatMessage(const char* role, const char* content) override; @@ -59,13 +63,22 @@ public: virtual void SetTheme(const std::string& theme_name) override; }; +// SPI LCD显示器 +class SpiLcdDisplay : public LcdDisplay { +public: + SpiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, + int width, int height, int offset_x, int offset_y, + bool mirror_x, bool mirror_y, bool swap_xy, + DisplayStyle style); +}; + // RGB LCD显示器 class RgbLcdDisplay : public LcdDisplay { public: RgbLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy, - DisplayFonts fonts); + DisplayStyle style); }; // MIPI LCD显示器 @@ -74,33 +87,7 @@ public: MipiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, int offset_x, int offset_y, bool mirror_x, bool mirror_y, bool swap_xy, - DisplayFonts fonts); + DisplayStyle style); }; -// // SPI LCD显示器 -class SpiLcdDisplay : public LcdDisplay { -public: - SpiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, - int width, int height, int offset_x, int offset_y, - bool mirror_x, bool mirror_y, bool swap_xy, - DisplayFonts fonts); -}; - -// QSPI LCD显示器 -class QspiLcdDisplay : public LcdDisplay { -public: - QspiLcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, - int width, int height, int offset_x, int offset_y, - bool mirror_x, bool mirror_y, bool swap_xy, - DisplayFonts fonts); -}; - -// MCU8080 LCD显示器 -class Mcu8080LcdDisplay : public LcdDisplay { -public: - Mcu8080LcdDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, - int width, int height, int offset_x, int offset_y, - bool mirror_x, bool mirror_y, bool swap_xy, - DisplayFonts fonts); -}; #endif // LCD_DISPLAY_H diff --git a/main/display/oled_display.cc b/main/display/oled_display.cc index d3fb3aaf..f1870227 100644 --- a/main/display/oled_display.cc +++ b/main/display/oled_display.cc @@ -14,10 +14,11 @@ LV_FONT_DECLARE(font_awesome_30_1); OledDisplay::OledDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, - int width, int height, bool mirror_x, bool mirror_y, DisplayFonts fonts) - : panel_io_(panel_io), panel_(panel), fonts_(fonts) { + int width, int height, bool mirror_x, bool mirror_y, DisplayStyle style) + : panel_io_(panel_io), panel_(panel) { width_ = width; height_ = height; + style_ = style; ESP_LOGI(TAG, "Initialize LVGL"); lvgl_port_cfg_t port_cfg = ESP_LVGL_PORT_INIT_CONFIG(); @@ -120,7 +121,7 @@ void OledDisplay::SetupUI_128x64() { DisplayLockGuard lock(this); auto screen = lv_screen_active(); - lv_obj_set_style_text_font(screen, fonts_.text_font, 0); + lv_obj_set_style_text_font(screen, style_.text_font, 0); lv_obj_set_style_text_color(screen, lv_color_black(), 0); /* Container */ @@ -191,7 +192,7 @@ void OledDisplay::SetupUI_128x64() { network_label_ = lv_label_create(status_bar_); lv_label_set_text(network_label_, ""); - lv_obj_set_style_text_font(network_label_, fonts_.icon_font, 0); + lv_obj_set_style_text_font(network_label_, style_.icon_font, 0); notification_label_ = lv_label_create(status_bar_); lv_obj_set_flex_grow(notification_label_, 1); @@ -206,15 +207,15 @@ void OledDisplay::SetupUI_128x64() { mute_label_ = lv_label_create(status_bar_); lv_label_set_text(mute_label_, ""); - lv_obj_set_style_text_font(mute_label_, fonts_.icon_font, 0); + lv_obj_set_style_text_font(mute_label_, style_.icon_font, 0); battery_label_ = lv_label_create(status_bar_); lv_label_set_text(battery_label_, ""); - lv_obj_set_style_text_font(battery_label_, fonts_.icon_font, 0); + lv_obj_set_style_text_font(battery_label_, style_.icon_font, 0); low_battery_popup_ = lv_obj_create(screen); lv_obj_set_scrollbar_mode(low_battery_popup_, LV_SCROLLBAR_MODE_OFF); - lv_obj_set_size(low_battery_popup_, LV_HOR_RES * 0.9, fonts_.text_font->line_height * 2); + lv_obj_set_size(low_battery_popup_, LV_HOR_RES * 0.9, style_.text_font->line_height * 2); lv_obj_align(low_battery_popup_, LV_ALIGN_BOTTOM_MID, 0, 0); lv_obj_set_style_bg_color(low_battery_popup_, lv_color_black(), 0); lv_obj_set_style_radius(low_battery_popup_, 10, 0); @@ -229,7 +230,7 @@ void OledDisplay::SetupUI_128x32() { DisplayLockGuard lock(this); auto screen = lv_screen_active(); - lv_obj_set_style_text_font(screen, fonts_.text_font, 0); + lv_obj_set_style_text_font(screen, style_.text_font, 0); /* Container */ container_ = lv_obj_create(screen); @@ -282,15 +283,15 @@ void OledDisplay::SetupUI_128x32() { mute_label_ = lv_label_create(status_bar_); lv_label_set_text(mute_label_, ""); - lv_obj_set_style_text_font(mute_label_, fonts_.icon_font, 0); + lv_obj_set_style_text_font(mute_label_, style_.icon_font, 0); network_label_ = lv_label_create(status_bar_); lv_label_set_text(network_label_, ""); - lv_obj_set_style_text_font(network_label_, fonts_.icon_font, 0); + lv_obj_set_style_text_font(network_label_, style_.icon_font, 0); battery_label_ = lv_label_create(status_bar_); lv_label_set_text(battery_label_, ""); - lv_obj_set_style_text_font(battery_label_, fonts_.icon_font, 0); + lv_obj_set_style_text_font(battery_label_, style_.icon_font, 0); chat_message_label_ = lv_label_create(side_bar_); lv_obj_set_size(chat_message_label_, width_ - 32, LV_SIZE_CONTENT); diff --git a/main/display/oled_display.h b/main/display/oled_display.h index f6053728..5842a375 100644 --- a/main/display/oled_display.h +++ b/main/display/oled_display.h @@ -6,6 +6,7 @@ #include #include + class OledDisplay : public Display { private: esp_lcd_panel_io_handle_t panel_io_ = nullptr; @@ -17,8 +18,7 @@ private: lv_obj_t* content_right_ = nullptr; lv_obj_t* container_ = nullptr; lv_obj_t* side_bar_ = nullptr; - - DisplayFonts fonts_; + DisplayStyle style_; virtual bool Lock(int timeout_ms = 0) override; virtual void Unlock() override; @@ -28,7 +28,7 @@ private: public: OledDisplay(esp_lcd_panel_io_handle_t panel_io, esp_lcd_panel_handle_t panel, int width, int height, bool mirror_x, bool mirror_y, - DisplayFonts fonts); + DisplayStyle style); ~OledDisplay(); virtual void SetChatMessage(const char* role, const char* content) override; diff --git a/main/mcp_server.cc b/main/mcp_server.cc index 2d86e212..fc80e8ac 100644 --- a/main/mcp_server.cc +++ b/main/mcp_server.cc @@ -13,6 +13,7 @@ #include "application.h" #include "display.h" #include "board.h" +#include "settings.h" #define TAG "MCP" @@ -101,7 +102,7 @@ void McpServer::AddCommonTools() { }), [camera](const PropertyList& properties) -> ReturnValue { if (!camera->Capture()) { - return "{\"success\": false, \"message\": \"Failed to capture photo\"}"; + throw std::runtime_error("Failed to capture photo"); } auto question = properties["question"].value(); return camera->Explain(question); @@ -112,6 +113,104 @@ void McpServer::AddCommonTools() { tools_.insert(tools_.end(), original_tools.begin(), original_tools.end()); } +void McpServer::AddUserOnlyTools() { + // System tools + AddUserOnlyTool("self.get_system_info", + "Get the system information", + PropertyList(), + [this](const PropertyList& properties) -> ReturnValue { + auto& board = Board::GetInstance(); + return board.GetSystemInfoJson(); + }); + + AddUserOnlyTool("self.reboot", "Reboot the system", + PropertyList(), + [this](const PropertyList& properties) -> ReturnValue { + std::thread([]() { + ESP_LOGW(TAG, "User requested reboot"); + vTaskDelay(pdMS_TO_TICKS(1000)); + auto& app = Application::GetInstance(); + app.Reboot(); + }).detach(); + return true; + }); + + // Display control + auto display = Board::GetInstance().GetDisplay(); + if (display) { + AddUserOnlyTool("self.screen.get_info", "Information about the screen, including width, height, etc.", + PropertyList(), + [display](const PropertyList& properties) -> ReturnValue { + cJSON *json = cJSON_CreateObject(); + cJSON_AddNumberToObject(json, "width", display->width()); + cJSON_AddNumberToObject(json, "height", display->height()); + return json; + }); + + AddUserOnlyTool("self.screen.preview_image", "Preview an image on the screen", + PropertyList({ + Property("url", kPropertyTypeString) + }), + [display](const PropertyList& properties) -> ReturnValue { + auto url = properties["url"].value(); + auto http = Board::GetInstance().GetNetwork()->CreateHttp(3); + + if (!http->Open("GET", url)) { + throw std::runtime_error("Failed to open URL: " + url); + } + if (http->GetStatusCode() != 200) { + throw std::runtime_error("Unexpected status code: " + std::to_string(http->GetStatusCode())); + } + + size_t content_length = http->GetBodyLength(); + char* data = (char*)heap_caps_malloc(content_length, MALLOC_CAP_8BIT); + size_t total_read = 0; + while (total_read < content_length) { + int ret = http->Read(data + total_read, content_length - total_read); + if (ret < 0) { + heap_caps_free(data); + throw std::runtime_error("Failed to download image: " + url); + } + total_read += ret; + } + http->Close(); + + auto img_dsc = (lv_img_dsc_t*)heap_caps_calloc(1, sizeof(lv_img_dsc_t), MALLOC_CAP_8BIT); + img_dsc->data_size = content_length; + img_dsc->data = (uint8_t*)data; + if (lv_image_decoder_get_info(img_dsc, &img_dsc->header) != LV_RESULT_OK) { + heap_caps_free(data); + heap_caps_free(img_dsc); + throw std::runtime_error("Failed to get image info"); + } + ESP_LOGI(TAG, "Preview image: %s size: %d resolution: %d x %d", url.c_str(), content_length, img_dsc->header.w, img_dsc->header.h); + + auto& app = Application::GetInstance(); + app.Schedule([display, img_dsc]() { + display->SetPreviewImage(img_dsc); + }); + return true; + }); + } + + // Assets download url + auto assets = Board::GetInstance().GetAssets(); + if (assets) { + if (assets->partition_valid()) { + AddUserOnlyTool("self.assets.set_download_url", "Set the download url for the assets", + PropertyList({ + Property("url", kPropertyTypeString) + }), + [assets](const PropertyList& properties) -> ReturnValue { + auto url = properties["url"].value(); + Settings settings("assets", true); + settings.SetString("download_url", url); + return true; + }); + } + } +} + void McpServer::AddTool(McpTool* tool) { // Prevent adding duplicate tools if (std::find_if(tools_.begin(), tools_.end(), [tool](const McpTool* t) { return t->name() == tool->name(); }) != tools_.end()) { @@ -119,7 +218,7 @@ void McpServer::AddTool(McpTool* tool) { return; } - ESP_LOGI(TAG, "Add tool: %s", tool->name().c_str()); + ESP_LOGI(TAG, "Add tool: %s%s", tool->name().c_str(), tool->user_only() ? " [user]" : ""); tools_.push_back(tool); } @@ -210,13 +309,18 @@ void McpServer::ParseMessage(const cJSON* json) { ReplyResult(id_int, message); } else if (method_str == "tools/list") { std::string cursor_str = ""; + bool list_user_only_tools = false; if (params != nullptr) { auto cursor = cJSON_GetObjectItem(params, "cursor"); if (cJSON_IsString(cursor)) { cursor_str = std::string(cursor->valuestring); } + auto with_system_tools = cJSON_GetObjectItem(params, "withSystemTools"); + if (cJSON_IsBool(with_system_tools)) { + list_user_only_tools = with_system_tools->valueint == 1; + } } - GetToolsList(id_int, cursor_str); + GetToolsList(id_int, cursor_str, list_user_only_tools); } else if (method_str == "tools/call") { if (!cJSON_IsObject(params)) { ESP_LOGE(TAG, "tools/call: Missing params"); @@ -265,7 +369,7 @@ void McpServer::ReplyError(int id, const std::string& message) { Application::GetInstance().SendMcpMessage(payload); } -void McpServer::GetToolsList(int id, const std::string& cursor) { +void McpServer::GetToolsList(int id, const std::string& cursor, bool list_user_only_tools) { const int max_payload_size = 8000; std::string json = "{\"tools\":["; @@ -283,6 +387,11 @@ void McpServer::GetToolsList(int id, const std::string& cursor) { continue; } } + + if (!list_user_only_tools && (*it)->user_only()) { + ++it; + continue; + } // 添加tool前检查大小 std::string tool_json = (*it)->to_json() + ","; diff --git a/main/mcp_server.h b/main/mcp_server.h index ac2b936f..547d1384 100644 --- a/main/mcp_server.h +++ b/main/mcp_server.h @@ -9,11 +9,45 @@ #include #include #include +#include #include +class ImageContent { +private: + std::string encoded_data_; + std::string mime_type_; + + static std::string Base64Encode(const std::string& data) { + size_t dlen = 0, olen = 0; + mbedtls_base64_encode((unsigned char*)nullptr, 0, &dlen, (const unsigned char*)data.data(), data.size()); + std::string result(dlen, 0); + mbedtls_base64_encode((unsigned char*)result.data(), result.size(), &olen, (const unsigned char*)data.data(), data.size()); + return result; + } + +public: + ImageContent(const std::string& mime_type, const std::string& data) { + mime_type_ = mime_type; + // base64 encode data + encoded_data_ = Base64Encode(data); + } + + std::string to_json() const { + cJSON *json = cJSON_CreateObject(); + cJSON_AddStringToObject(json, "type", "image"); + cJSON_AddStringToObject(json, "mimeType", mime_type_.c_str()); + cJSON_AddStringToObject(json, "data", encoded_data_.c_str()); + char* json_str = cJSON_PrintUnformatted(json); + std::string result(json_str); + cJSON_free(json_str); + cJSON_Delete(json); + return result; + } +}; + // 添加类型别名 -using ReturnValue = std::variant; +using ReturnValue = std::variant; enum PropertyType { kPropertyTypeBoolean, @@ -240,16 +274,32 @@ public: // 返回结果 cJSON* result = cJSON_CreateObject(); cJSON* content = cJSON_CreateArray(); - cJSON* text = cJSON_CreateObject(); - cJSON_AddStringToObject(text, "type", "text"); - if (std::holds_alternative(return_value)) { - cJSON_AddStringToObject(text, "text", std::get(return_value).c_str()); - } else if (std::holds_alternative(return_value)) { - cJSON_AddStringToObject(text, "text", std::get(return_value) ? "true" : "false"); - } else if (std::holds_alternative(return_value)) { - cJSON_AddStringToObject(text, "text", std::to_string(std::get(return_value)).c_str()); + + if (std::holds_alternative(return_value)) { + auto image_content = std::get(return_value); + cJSON* image = cJSON_CreateObject(); + cJSON_AddStringToObject(image, "type", "image"); + cJSON_AddStringToObject(image, "image", image_content->to_json().c_str()); + cJSON_AddItemToArray(content, image); + delete image_content; + } else { + cJSON* text = cJSON_CreateObject(); + cJSON_AddStringToObject(text, "type", "text"); + if (std::holds_alternative(return_value)) { + cJSON_AddStringToObject(text, "text", std::get(return_value).c_str()); + } else if (std::holds_alternative(return_value)) { + cJSON_AddStringToObject(text, "text", std::get(return_value) ? "true" : "false"); + } else if (std::holds_alternative(return_value)) { + cJSON_AddStringToObject(text, "text", std::to_string(std::get(return_value)).c_str()); + } else if (std::holds_alternative(return_value)) { + cJSON* json = std::get(return_value); + char* json_str = cJSON_PrintUnformatted(json); + cJSON_AddStringToObject(text, "text", json_str); + cJSON_free(json_str); + cJSON_Delete(json); + } + cJSON_AddItemToArray(content, text); } - cJSON_AddItemToArray(content, text); cJSON_AddItemToObject(result, "content", content); cJSON_AddBoolToObject(result, "isError", false); @@ -269,6 +319,7 @@ public: } void AddCommonTools(); + void AddUserOnlyTools(); void AddTool(McpTool* tool); void AddTool(const std::string& name, const std::string& description, const PropertyList& properties, std::function callback); void AddUserOnlyTool(const std::string& name, const std::string& description, const PropertyList& properties, std::function callback); @@ -284,7 +335,7 @@ private: void ReplyResult(int id, const std::string& result); void ReplyError(int id, const std::string& message); - void GetToolsList(int id, const std::string& cursor); + void GetToolsList(int id, const std::string& cursor, bool list_user_only_tools); void DoToolCall(int id, const std::string& tool_name, const cJSON* tool_arguments, int stack_size); std::vector tools_; diff --git a/main/ota.cc b/main/ota.cc index e3a086e7..0998e0ea 100644 --- a/main/ota.cc +++ b/main/ota.cc @@ -89,7 +89,7 @@ bool Ota::CheckVersion() { auto http = SetupHttp(); - std::string data = board.GetJson(); + std::string data = board.GetSystemInfoJson(); std::string method = data.length() > 0 ? "POST" : "GET"; http->SetContent(std::move(data)); diff --git a/partitions/v2/16m.csv b/partitions/v2/16m.csv index bdfe26b8..8af93a35 100644 --- a/partitions/v2/16m.csv +++ b/partitions/v2/16m.csv @@ -3,7 +3,6 @@ nvs, data, nvs, 0x9000, 0x4000, otadata, data, ota, 0xd000, 0x2000, phy_init, data, phy, 0xf000, 0x1000, -model, data, spiffs, 0x10000, 0xF0000, -ota_0, app, ota_0, 0x100000, 4M, -ota_1, app, ota_1, 0x500000, 4M, -assets, data, spiffs, 0x900000, 7M +ota_0, app, ota_0, 0x20000, 0x3f0000, +ota_1, app, ota_1, , 0x3f0000, +assets, data, spiffs, 0x800000, 8M diff --git a/partitions/v2/16m_c3.csv b/partitions/v2/16m_c3.csv index be67e32a..e4440235 100644 --- a/partitions/v2/16m_c3.csv +++ b/partitions/v2/16m_c3.csv @@ -3,7 +3,6 @@ nvs, data, nvs, 0x9000, 0x4000, otadata, data, ota, 0xd000, 0x2000, phy_init, data, phy, 0xf000, 0x1000, -model, data, spiffs, 0x10000, 0xF0000, -ota_0, app, ota_0, 0x100000, 4M, -ota_1, app, ota_1, 0x500000, 4M, -assets, data, spiffs, 0x900000, 4000K +ota_0, app, ota_0, 0x20000, 0x3f0000, +ota_1, app, ota_1, , 0x3f0000, +assets, data, spiffs, 0x800000, 4000K diff --git a/partitions/v2/32m.csv b/partitions/v2/32m.csv index 27a814f0..d829cbb9 100644 --- a/partitions/v2/32m.csv +++ b/partitions/v2/32m.csv @@ -4,7 +4,6 @@ nvsfactory, data, nvs, , 200K, nvs, data, nvs, , 840K, otadata, data, ota, , 0x2000, phy_init, data, phy, , 0x1000, -model, data, spiffs, , 0xF0000, ota_0, app, ota_0, 0x200000, 4M, ota_1, app, ota_1, 0x600000, 4M, assets, data, spiffs, 0xA00000, 16M diff --git a/partitions/v2/8m.csv b/partitions/v2/8m.csv index a896a331..bae9f150 100644 --- a/partitions/v2/8m.csv +++ b/partitions/v2/8m.csv @@ -3,7 +3,6 @@ nvs, data, nvs, 0x9000, 0x4000, otadata, data, ota, 0xd000, 0x2000, phy_init, data, phy, 0xf000, 0x1000, -model, data, spiffs, 0x10000, 0xF0000, -ota_0, app, ota_0, 0x100000, 3M, -ota_1, app, ota_1, 0x400000, 3M, -assets, data, spiffs, 0x700000, 1M +ota_0, app, ota_0, 0x20000, 0x2f0000, +ota_1, app, ota_1, , 0x2f0000, +assets, data, spiffs, 0x600000, 2M diff --git a/scripts/spiffs_assets/README.md b/scripts/spiffs_assets/README.md new file mode 100644 index 00000000..9cd0f924 --- /dev/null +++ b/scripts/spiffs_assets/README.md @@ -0,0 +1,110 @@ +# SPIFFS Assets Builder + +这个脚本用于构建 ESP32 项目的 SPIFFS 资源分区,将各种资源文件打包成可在设备上使用的格式。 + +## 功能特性 + +- 处理唤醒网络模型 (WakeNet Model) +- 集成文本字体文件 +- 处理表情符号图片集合 +- 自动生成资源索引文件 +- 打包生成最终的 `assets.bin` 文件 + +## 依赖要求 + +- Python 3.6+ +- 相关资源文件 + +## 使用方法 + +### 基本语法 + +```bash +./build.py --wakenet_model \ + --text_font \ + --emoji_collection +``` + +### 参数说明 + +| 参数 | 类型 | 必需 | 说明 | +|------|------|------|------| +| `--wakenet_model` | 目录路径 | 否 | 唤醒网络模型目录路径 | +| `--text_font` | 文件路径 | 否 | 文本字体文件路径 | +| `--emoji_collection` | 目录路径 | 否 | 表情符号图片集合目录路径 | + +### 使用示例 + +```bash +# 完整参数示例 +./build.py \ + --wakenet_model ../../managed_components/espressif__esp-sr/model/wakenet_model/wn9_nihaoxiaozhi_tts \ + --text_font ../../components/xiaozhi-fonts/build/font_puhui_common_20_4.bin \ + --emoji_collection ../../components/xiaozhi-fonts/build/emojis_64/ + +# 仅处理字体文件 +./build.py --text_font ../../components/xiaozhi-fonts/build/font_puhui_common_20_4.bin + +# 仅处理表情符号 +./build.py --emoji_collection ../../components/xiaozhi-fonts/build/emojis_64/ +``` + +## 工作流程 + +1. **创建构建目录结构** + - `build/` - 主构建目录 + - `build/assets/` - 资源文件目录 + - `build/output/` - 输出文件目录 + +2. **处理唤醒网络模型** + - 复制模型文件到构建目录 + - 使用 `pack_model.py` 生成 `srmodels.bin` + - 将生成的模型文件复制到资源目录 + +3. **处理文本字体** + - 复制字体文件到资源目录 + - 支持 `.bin` 格式的字体文件 + +4. **处理表情符号集合** + - 扫描指定目录中的图片文件 + - 支持 `.png` 和 `.gif` 格式 + - 自动生成表情符号索引 + +5. **生成配置文件** + - `index.json` - 资源索引文件 + - `config.json` - 构建配置文件 + +6. **打包最终资源** + - 使用 `spiffs_assets_gen.py` 生成 `assets.bin` + - 复制到构建根目录 + +## 输出文件 + +构建完成后,会在 `build/` 目录下生成以下文件: + +- `assets/` - 所有资源文件 +- `assets.bin` - 最终的 SPIFFS 资源文件 +- `config.json` - 构建配置 +- `output/` - 中间输出文件 + +## 支持的资源格式 + +- **模型文件**: `.bin` (通过 pack_model.py 处理) +- **字体文件**: `.bin` +- **图片文件**: `.png`, `.gif` +- **配置文件**: `.json` + +## 错误处理 + +脚本包含完善的错误处理机制: + +- 检查源文件/目录是否存在 +- 验证子进程执行结果 +- 提供详细的错误信息和警告 + +## 注意事项 + +1. 确保所有依赖的 Python 脚本都在同一目录下 +2. 资源文件路径使用绝对路径或相对于脚本目录的路径 +3. 构建过程会清理之前的构建文件 +4. 生成的 `assets.bin` 文件大小受 SPIFFS 分区大小限制 diff --git a/scripts/spiffs_assets/build.py b/scripts/spiffs_assets/build.py new file mode 100755 index 00000000..9745566f --- /dev/null +++ b/scripts/spiffs_assets/build.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python3 +""" +Build the spiffs assets partition + +Usage: + ./build.py --wakenet_model \ + --text_font \ + --emoji_collection + +Example: + ./build.py --wakenet_model ../../managed_components/espressif__esp-sr/model/wakenet_model/wn9_nihaoxiaozhi_tts \ + --text_font ../../components/xiaozhi-fonts/build/font_puhui_common_20_4.bin \ + --emoji_collection ../../components/xiaozhi-fonts/build/emojis_64/ +""" + +import os +import sys +import shutil +import argparse +import subprocess +import json +from pathlib import Path + + +def ensure_dir(directory): + """Ensure directory exists, create if not""" + os.makedirs(directory, exist_ok=True) + + +def copy_file(src, dst): + """Copy file""" + if os.path.exists(src): + shutil.copy2(src, dst) + print(f"Copied: {src} -> {dst}") + else: + print(f"Warning: Source file does not exist: {src}") + + +def copy_directory(src, dst): + """Copy directory""" + if os.path.exists(src): + shutil.copytree(src, dst, dirs_exist_ok=True) + print(f"Copied directory: {src} -> {dst}") + else: + print(f"Warning: Source directory does not exist: {src}") + + +def process_wakenet_model(wakenet_model_dir, build_dir, assets_dir): + """Process wakenet_model parameter""" + if not wakenet_model_dir: + return None + + # Copy input directory to build directory + wakenet_build_dir = os.path.join(build_dir, "wakenet_model") + if os.path.exists(wakenet_build_dir): + shutil.rmtree(wakenet_build_dir) + copy_directory(wakenet_model_dir, os.path.join(wakenet_build_dir, os.path.basename(wakenet_model_dir))) + + # Use pack_model.py to generate srmodels.bin + srmodels_output = os.path.join(wakenet_build_dir, "srmodels.bin") + try: + subprocess.run([ + sys.executable, "pack_model.py", + "-m", wakenet_build_dir, + "-o", "srmodels.bin" + ], check=True, cwd=os.path.dirname(__file__)) + print(f"Generated: {srmodels_output}") + # Copy srmodels.bin to assets directory + copy_file(srmodels_output, os.path.join(assets_dir, "srmodels.bin")) + return "srmodels.bin" + except subprocess.CalledProcessError as e: + print(f"Error: Failed to generate srmodels.bin: {e}") + return None + + +def process_text_font(text_font_file, assets_dir): + """Process text_font parameter""" + if not text_font_file: + return None + + # Copy input file to build/assets directory + font_filename = os.path.basename(text_font_file) + font_dst = os.path.join(assets_dir, font_filename) + copy_file(text_font_file, font_dst) + + return font_filename + + +def process_emoji_collection(emoji_collection_dir, assets_dir): + """Process emoji_collection parameter""" + if not emoji_collection_dir: + return [] + + emoji_list = [] + + # Copy each image from input directory to build/assets directory + for root, dirs, files in os.walk(emoji_collection_dir): + for file in files: + if file.lower().endswith(('.png', '.gif')): + # Copy file + src_file = os.path.join(root, file) + dst_file = os.path.join(assets_dir, file) + copy_file(src_file, dst_file) + + # Get filename without extension + filename_without_ext = os.path.splitext(file)[0] + + # Add to emoji list + emoji_list.append({ + "name": filename_without_ext, + "file": file + }) + + return emoji_list + + +def generate_index_json(assets_dir, srmodels, text_font, emoji_collection): + """Generate index.json file""" + index_data = { + "version": 1 + } + + if srmodels: + index_data["srmodels"] = srmodels + + if text_font: + index_data["text_font"] = text_font + + if emoji_collection: + index_data["emoji_collection"] = emoji_collection + + # Write index.json + index_path = os.path.join(assets_dir, "index.json") + with open(index_path, 'w', encoding='utf-8') as f: + json.dump(index_data, f, indent=4, ensure_ascii=False) + + print(f"Generated: {index_path}") + + +def generate_config_json(build_dir, assets_dir): + """Generate config.json file""" + # Get absolute path of current working directory + workspace_dir = os.path.abspath(os.path.join(os.path.dirname(__file__))) + + config_data = { + "include_path": os.path.join(workspace_dir, "build/include"), + "assets_path": os.path.join(workspace_dir, "build/assets"), + "image_file": os.path.join(workspace_dir, "build/output/assets.bin"), + "lvgl_ver": "9.3.0", + "assets_size": "0x400000", + "support_format": ".png, .gif, .jpg, .bin, .json", + "name_length": "32", + "split_height": "0", + "support_qoi": False, + "support_spng": False, + "support_sjpg": False, + "support_sqoi": False, + "support_raw": False, + "support_raw_dither": False, + "support_raw_bgr": False + } + + # Write config.json + config_path = os.path.join(build_dir, "config.json") + with open(config_path, 'w', encoding='utf-8') as f: + json.dump(config_data, f, indent=4, ensure_ascii=False) + + print(f"Generated: {config_path}") + return config_path + + +def main(): + parser = argparse.ArgumentParser(description='Build the spiffs assets partition') + parser.add_argument('--wakenet_model', help='Path to wakenet model directory') + parser.add_argument('--text_font', help='Path to text font file') + parser.add_argument('--emoji_collection', help='Path to emoji collection directory') + + args = parser.parse_args() + + # Get script directory + script_dir = os.path.dirname(os.path.abspath(__file__)) + + # Set directory paths + build_dir = os.path.join(script_dir, "build") + assets_dir = os.path.join(build_dir, "assets") + if os.path.exists(assets_dir): + shutil.rmtree(assets_dir) + + # Ensure directories exist + ensure_dir(build_dir) + ensure_dir(assets_dir) + + print("Starting to build SPIFFS assets partition...") + + # Process each parameter + srmodels = process_wakenet_model(args.wakenet_model, build_dir, assets_dir) + text_font = process_text_font(args.text_font, assets_dir) + emoji_collection = process_emoji_collection(args.emoji_collection, assets_dir) + + # Generate index.json + generate_index_json(assets_dir, srmodels, text_font, emoji_collection) + + # Generate config.json + config_path = generate_config_json(build_dir, assets_dir) + + # Use spiffs_assets_gen.py to package final build/assets.bin + try: + subprocess.run([ + sys.executable, "spiffs_assets_gen.py", + "--config", config_path + ], check=True, cwd=script_dir) + print("Successfully packaged assets.bin") + except subprocess.CalledProcessError as e: + print(f"Error: Failed to package assets.bin: {e}") + sys.exit(1) + + # Copy build/output/assets.bin to build/assets.bin + shutil.copy(os.path.join(build_dir, "output", "assets.bin"), os.path.join(build_dir, "assets.bin")) + print("Build completed!") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/scripts/spiffs_assets/build_all.py b/scripts/spiffs_assets/build_all.py new file mode 100644 index 00000000..e1581229 --- /dev/null +++ b/scripts/spiffs_assets/build_all.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +""" +Build multiple spiffs assets partitions with different parameter combinations + +This script calls build.py with different combinations of: +- wakenet_models +- text_fonts +- emoji_collections + +And generates assets.bin files with names like: +wn9_nihaoxiaozhi_tts-font_puhui_common_20_4-emojis_32.bin +""" + +import os +import sys +import shutil +import subprocess +import argparse +from pathlib import Path + + +def ensure_dir(directory): + """Ensure directory exists, create if not""" + os.makedirs(directory, exist_ok=True) + + +def get_file_path(base_dir, filename): + """Get full path for a file, handling 'none' case""" + if filename == "none": + return None + return os.path.join(base_dir, f"{filename}.bin" if not filename.startswith("emojis_") else filename) + + +def build_assets(wakenet_model, text_font, emoji_collection, build_dir, final_dir): + """Build assets.bin using build.py with given parameters""" + + # Prepare arguments for build.py + cmd = [sys.executable, "build.py"] + + if wakenet_model != "none": + wakenet_path = os.path.join("../../managed_components/espressif__esp-sr/model/wakenet_model", wakenet_model) + cmd.extend(["--wakenet_model", wakenet_path]) + + if text_font != "none": + text_font_path = os.path.join("../../components/xiaozhi-fonts/build", f"{text_font}.bin") + cmd.extend(["--text_font", text_font_path]) + + if emoji_collection != "none": + emoji_path = os.path.join("../../components/xiaozhi-fonts/build", emoji_collection) + cmd.extend(["--emoji_collection", emoji_path]) + + print(f"\n正在构建: {wakenet_model}-{text_font}-{emoji_collection}") + print(f"执行命令: {' '.join(cmd)}") + + try: + # Run build.py + result = subprocess.run(cmd, check=True, cwd=os.path.dirname(__file__)) + + # Generate output filename + output_name = f"{wakenet_model}-{text_font}-{emoji_collection}.bin" + + # Copy generated assets.bin to final directory with new name + src_path = os.path.join(build_dir, "assets.bin") + dst_path = os.path.join(final_dir, output_name) + + if os.path.exists(src_path): + shutil.copy2(src_path, dst_path) + print(f"✓ 成功生成: {output_name}") + return True + else: + print(f"✗ 错误: 未找到生成的 assets.bin 文件") + return False + + except subprocess.CalledProcessError as e: + print(f"✗ 构建失败: {e}") + return False + except Exception as e: + print(f"✗ 未知错误: {e}") + return False + + +def main(): + # Configuration + wakenet_models = [ + "none", + "wn9_nihaoxiaozhi_tts", + "wn9s_nihaoxiaozhi" + ] + + text_fonts = [ + "none", + "font_puhui_common_14_1", + "font_puhui_common_16_4", + "font_puhui_common_20_4", + "font_puhui_common_30_4", + ] + + emoji_collections = [ + "none", + "emojis_32", + "emojis_64", + ] + + # Get script directory + script_dir = os.path.dirname(os.path.abspath(__file__)) + + # Set directory paths + build_dir = os.path.join(script_dir, "build") + final_dir = os.path.join(build_dir, "final") + + # Ensure directories exist + ensure_dir(build_dir) + ensure_dir(final_dir) + + print("开始构建多个 SPIFFS assets 分区...") + print(f"输出目录: {final_dir}") + + # Track successful builds + successful_builds = 0 + total_combinations = len(wakenet_models) * len(text_fonts) * len(emoji_collections) + + # Build all combinations + for wakenet_model in wakenet_models: + for text_font in text_fonts: + for emoji_collection in emoji_collections: + if build_assets(wakenet_model, text_font, emoji_collection, build_dir, final_dir): + successful_builds += 1 + + print(f"\n构建完成!") + print(f"成功构建: {successful_builds}/{total_combinations}") + print(f"输出文件位置: {final_dir}") + + # List generated files + if os.path.exists(final_dir): + files = [f for f in os.listdir(final_dir) if f.endswith('.bin')] + if files: + print("\n生成的文件:") + for file in sorted(files): + file_size = os.path.getsize(os.path.join(final_dir, file)) + print(f" {file} ({file_size:,} bytes)") + else: + print("\n未找到生成的 .bin 文件") + + +if __name__ == "__main__": + main() + + diff --git a/scripts/spiffs_assets/pack_model.py b/scripts/spiffs_assets/pack_model.py new file mode 100644 index 00000000..1fc85aa9 --- /dev/null +++ b/scripts/spiffs_assets/pack_model.py @@ -0,0 +1,123 @@ +import os +import struct +import argparse + + +def struct_pack_string(string, max_len=None): + """ + pack string to binary data. + if max_len is None, max_len = len(string) + 1 + else len(string) < max_len, the left will be padded by struct.pack('x') + + string: input python string + max_len: output + """ + + if max_len == None : + max_len = len(string) + else: + assert len(string) <= max_len + + left_num = max_len - len(string) + out_bytes = None + for char in string: + if out_bytes == None: + out_bytes = struct.pack('b', ord(char)) + else: + out_bytes += struct.pack('b', ord(char)) + for i in range(left_num): + out_bytes += struct.pack('x') + return out_bytes + +def read_data(filename): + """ + Read binary data, like index and mndata + """ + data = None + with open(filename, "rb") as f: + data = f.read() + return data + +def pack_models(model_path, out_file="srmodels.bin"): + """ + Pack all models into one binary file by the following format: + { + model_num: int + model1_info: model_info_t + model2_info: model_info_t + ... + model1_index,model1_data,model1_MODEL_INFO + model1_index,model1_data,model1_MODEL_INFO + ... + }model_pack_t + + { + model_name: char[32] + file_number: int + file1_name: char[32] + file1_start: int + file1_len: int + file2_name: char[32] + file2_start: int // data_len = info_start - data_start + file2_len: int + ... + }model_info_t + + model_path: the path of models + out_file: the ouput binary filename + """ + + models = {} + file_num = 0 + model_num = 0 + for root, dirs, _ in os.walk(model_path): + for model_name in dirs: + models[model_name] = {} + model_dir = os.path.join(root, model_name) + model_num += 1 + for _, _, files in os.walk(model_dir): + for file_name in files: + file_num += 1 + file_path = os.path.join(model_dir, file_name) + models[model_name][file_name] = read_data(file_path) + + model_num = len(models) + header_len = 4 + model_num*(32+4) + file_num*(32+4+4) + out_bin = struct.pack('I', model_num) # model number + data_bin = None + for key in models: + model_bin = struct_pack_string(key, 32) # + model name + model_bin += struct.pack('I', len(models[key])) # + file number in this model + + for file_name in models[key]: + model_bin += struct_pack_string(file_name, 32) # + file name + if data_bin == None: + model_bin += struct.pack('I', header_len) + data_bin = models[key][file_name] + model_bin += struct.pack('I', len(models[key][file_name])) + # print(file_name, header_len, len(models[key][file_name]), len(data_bin)) + else: + model_bin += struct.pack('I', header_len+len(data_bin)) + # print(file_name, header_len+len(data_bin), len(models[key][file_name])) + data_bin += models[key][file_name] + model_bin += struct.pack('I', len(models[key][file_name])) + + out_bin += model_bin + assert len(out_bin) == header_len + if data_bin != None: + out_bin += data_bin + + out_file = os.path.join(model_path, out_file) + with open(out_file, "wb") as f: + f.write(out_bin) + + +if __name__ == "__main__": + # input parameter + parser = argparse.ArgumentParser(description='Model package tool') + parser.add_argument('-m', '--model_path', help="the path of model files") + parser.add_argument('-o', '--out_file', default="srmodels.bin", help="the path of binary file") + args = parser.parse_args() + + # convert(args.model_path, args.out_file) + pack_models(model_path=args.model_path, out_file=args.out_file) diff --git a/scripts/spiffs_assets/spiffs_assets_gen.py b/scripts/spiffs_assets/spiffs_assets_gen.py new file mode 100644 index 00000000..e07aaaaf --- /dev/null +++ b/scripts/spiffs_assets/spiffs_assets_gen.py @@ -0,0 +1,647 @@ +# SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: Apache-2.0 +import io +import os +import argparse +import json +import shutil +import math +import sys +import time +import numpy as np +import importlib +import subprocess +import urllib.request + +from PIL import Image +from datetime import datetime +from dataclasses import dataclass +from typing import List +from pathlib import Path +from packaging import version + +sys.dont_write_bytecode = True + +GREEN = '\033[1;32m' +RED = '\033[1;31m' +RESET = '\033[0m' + +@dataclass +class AssetCopyConfig: + assets_path: str + target_path: str + spng_enable: bool + sjpg_enable: bool + qoi_enable: bool + sqoi_enable: bool + row_enable: bool + support_format: List[str] + split_height: int + +@dataclass +class PackModelsConfig: + target_path: str + include_path: str + image_file: str + assets_path: str + name_length: int + +def generate_header_filename(path): + asset_name = os.path.basename(path) + + header_filename = f'mmap_generate_{asset_name}.h' + return header_filename + +def compute_checksum(data): + checksum = sum(data) & 0xFFFF + return checksum + +def sort_key(filename): + basename, extension = os.path.splitext(filename) + return extension, basename + +def download_v8_script(convert_path): + """ + Ensure that the lvgl_image_converter repository is present at the specified path. + If not, clone the repository. Then, checkout to a specific commit. + + Parameters: + - convert_path (str): The directory path where lvgl_image_converter should be located. + """ + + # Check if convert_path is not empty + if convert_path: + # If the directory does not exist, create it and clone the repository + if not os.path.exists(convert_path): + os.makedirs(convert_path, exist_ok=True) + try: + subprocess.run( + ['git', 'clone', 'https://github.com/W-Mai/lvgl_image_converter.git', convert_path], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + check=True + ) + except subprocess.CalledProcessError as e: + print(f'Git clone failed: {e}') + sys.exit(1) + + # Checkout to the specific commit + try: + subprocess.run( + ['git', 'checkout', '9174634e9dcc1b21a63668969406897aad650f35'], + cwd=convert_path, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + check=True + ) + except subprocess.CalledProcessError as e: + print(f'Failed to checkout to the specific commit: {e}') + sys.exit(1) + else: + print('Error: convert_path is NULL') + sys.exit(1) + +def download_v9_script(url: str, destination: str) -> None: + """ + Download a Python script from a URL to a local destination. + + Parameters: + - url (str): URL to download the script from. + - destination (str): Local path to save the downloaded script. + + Raises: + - Exception: If the download fails. + """ + file_path = Path(destination) + + # Check if the file already exists + if file_path.exists(): + if file_path.is_file(): + return + + try: + # Create the parent directories if they do not exist + file_path.parent.mkdir(parents=True, exist_ok=True) + + # Open the URL and retrieve the data + with urllib.request.urlopen(url) as response, open(file_path, 'wb') as out_file: + data = response.read() # Read the entire response + out_file.write(data) # Write data to the local file + + except urllib.error.HTTPError as e: + print(f'HTTP Error: {e.code} - {e.reason} when accessing {url}') + sys.exit(1) + except urllib.error.URLError as e: + print(f'URL Error: {e.reason} when accessing {url}') + sys.exit(1) + except Exception as e: + print(f'An unexpected error occurred: {e}') + sys.exit(1) + +def split_image(im, block_size, input_dir, ext, convert_to_qoi): + """Splits the image into blocks based on the block size.""" + width, height = im.size + + if block_size: + splits = math.ceil(height / block_size) + else: + splits = 1 + + for i in range(splits): + if i < splits - 1: + crop = im.crop((0, i * block_size, width, (i + 1) * block_size)) + else: + crop = im.crop((0, i * block_size, width, height)) + + output_path = os.path.join(input_dir, str(i) + ext) + crop.save(output_path, quality=100) + + qoi_module = importlib.import_module('qoi-conv.qoi') + Qoi = qoi_module.Qoi + replace_extension = qoi_module.replace_extension + + if convert_to_qoi: + with Image.open(output_path) as img: + if img.mode != 'RGBA': + img = img.convert('RGBA') + + img_data = np.asarray(img) + out_path = qoi_module.replace_extension(output_path, 'qoi') + new_image = qoi_module.Qoi().save(out_path, img_data) + os.remove(output_path) + + + return width, height, splits + +def create_header(width, height, splits, split_height, lenbuf, ext): + """Creates the header for the output file based on the format.""" + header = bytearray() + + if ext.lower() == '.jpg': + header += bytearray('_SJPG__'.encode('UTF-8')) + elif ext.lower() == '.png': + header += bytearray('_SPNG__'.encode('UTF-8')) + elif ext.lower() == '.qoi': + header += bytearray('_SQOI__'.encode('UTF-8')) + + # 6 BYTES VERSION + header += bytearray(('\x00V1.00\x00').encode('UTF-8')) + + # WIDTH 2 BYTES + header += width.to_bytes(2, byteorder='little') + + # HEIGHT 2 BYTES + header += height.to_bytes(2, byteorder='little') + + # NUMBER OF ITEMS 2 BYTES + header += splits.to_bytes(2, byteorder='little') + + # SPLIT HEIGHT 2 BYTES + header += split_height.to_bytes(2, byteorder='little') + + for item_len in lenbuf: + # LENGTH 2 BYTES + header += item_len.to_bytes(2, byteorder='little') + + return header + +def save_image(output_file_path, header, split_data): + """Saves the image with the constructed header and split data.""" + with open(output_file_path, 'wb') as f: + if header is not None: + f.write(header + split_data) + else: + f.write(split_data) + +def handle_lvgl_version_v9(input_file: str, input_dir: str, + input_filename: str, convert_path: str) -> None: + """ + Handle conversion for LVGL versions greater than 9.0. + + Parameters: + - input_file (str): Path to the input image file. + - input_dir (str): Directory of the input file. + - input_filename (str): Name of the input file. + - convert_path (str): Path for conversion scripts and outputs. + """ + + convert_file = os.path.join(convert_path, 'LVGLImage.py') + lvgl_image_url = 'https://raw.githubusercontent.com/lvgl/lvgl/master/scripts/LVGLImage.py' + + download_v9_script(url=lvgl_image_url, destination=convert_file) + lvgl_script = Path(convert_file) + + cmd = [ + 'python', + str(lvgl_script), + '--ofmt', 'BIN', + '--cf', config_data['support_raw_cf'], + '--compress', 'NONE', + '--output', str(input_dir), + input_file + ] + + try: + result = subprocess.run( + cmd, + check=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) + print(f'Completed {input_filename} -> BIN') + except subprocess.CalledProcessError as e: + print('An error occurred while executing LVGLImage.py:') + print(e.stderr) + sys.exit(e.returncode) + +def handle_lvgl_version_v8(input_file: str, input_dir: str, input_filename: str, convert_path: str) -> None: + """ + Handle conversion for supported LVGL versions (<= 9.0). + + Parameters: + - input_file (str): Path to the input image file. + - input_dir (str): Directory of the input file. + - input_filename (str): Name of the input file. + - convert_path (str): Path for conversion scripts and outputs. + """ + + download_v8_script(convert_path=convert_path) + + if convert_path not in sys.path: + sys.path.append(convert_path) + + try: + import lv_img_conv + except ImportError as e: + print(f"Failed to import 'lv_img_conv' from '{convert_path}': {e}") + sys.exit(1) + + try: + lv_img_conv.conv_one_file( + root=Path(input_dir), + filepath=Path(input_file), + f=config_data['support_raw_ff'], + cf=config_data['support_raw_cf'], + ff='BIN', + dither=config_data['support_raw_dither'], + bgr_mode=config_data['support_raw_bgr'], + ) + print(f'Completed {input_filename} -> BIN') + except KeyError as e: + print(f'Missing configuration key: {e}') + sys.exit(1) + except Exception as e: + print(f'An error occurred during conversion: {e}') + sys.exit(1) + +def process_image(input_file, height_str, output_extension, convert_to_qoi=False): + """Main function to process the image and save it as .sjpg, .spng, or .sqoi.""" + try: + SPLIT_HEIGHT = int(height_str) + if SPLIT_HEIGHT < 0: + raise ValueError('Height must be a positive integer') + except ValueError as e: + print('Error: Height must be a positive integer') + sys.exit(1) + + input_dir, input_filename = os.path.split(input_file) + base_filename, ext = os.path.splitext(input_filename) + OUTPUT_FILE_NAME = base_filename + + try: + im = Image.open(input_file) + except Exception as e: + print('Error:', e) + sys.exit(0) + + width, height, splits = split_image(im, SPLIT_HEIGHT, input_dir, ext, convert_to_qoi) + + split_data = bytearray() + lenbuf = [] + + if convert_to_qoi: + ext = '.qoi' + + for i in range(splits): + with open(os.path.join(input_dir, str(i) + ext), 'rb') as f: + a = f.read() + split_data += a + lenbuf.append(len(a)) + os.remove(os.path.join(input_dir, str(i) + ext)) + + header = None + if splits == 1 and convert_to_qoi: + output_file_path = os.path.join(input_dir, OUTPUT_FILE_NAME + ext) + else: + header = create_header(width, height, splits, SPLIT_HEIGHT, lenbuf, ext) + output_file_path = os.path.join(input_dir, OUTPUT_FILE_NAME + output_extension) + + save_image(output_file_path, header, split_data) + + print('Completed', input_filename, '->', os.path.basename(output_file_path)) + +def convert_image_to_qoi(input_file, height_str): + process_image(input_file, height_str, '.sqoi', convert_to_qoi=True) + +def convert_image_to_simg(input_file, height_str): + input_dir, input_filename = os.path.split(input_file) + _, ext = os.path.splitext(input_filename) + output_extension = '.sjpg' if ext.lower() == '.jpg' else '.spng' + process_image(input_file, height_str, output_extension, convert_to_qoi=False) + +def convert_image_to_raw(input_file: str) -> None: + """ + Convert an image to raw binary format compatible with LVGL. + + Parameters: + - input_file (str): Path to the input image file. + + Raises: + - FileNotFoundError: If required scripts are not found. + - subprocess.CalledProcessError: If the external conversion script fails. + - KeyError: If required keys are missing in config_data. + """ + input_dir, input_filename = os.path.split(input_file) + _, ext = os.path.splitext(input_filename) + convert_path = os.path.join(os.path.dirname(input_file), 'lvgl_image_converter') + lvgl_ver_str = config_data.get('lvgl_ver', '9.0.0') + + try: + lvgl_version = version.parse(lvgl_ver_str) + except version.InvalidVersion: + print(f'Invalid LVGL version format: {lvgl_ver_str}') + sys.exit(1) + + if lvgl_version >= version.parse('9.0.0'): + handle_lvgl_version_v9( + input_file=input_file, + input_dir=input_dir, + input_filename=input_filename, + convert_path=convert_path + ) + else: + handle_lvgl_version_v8( + input_file=input_file, + input_dir=input_dir, + input_filename=input_filename, + convert_path=convert_path + ) + +def pack_assets(config: PackModelsConfig): + """ + Pack models based on the provided configuration. + """ + + target_path = config.target_path + assets_include_path = config.include_path + out_file = config.image_file + assets_path = config.assets_path + max_name_len = config.name_length + + merged_data = bytearray() + file_info_list = [] + skip_files = ['config.json', 'lvgl_image_converter'] + + file_list = sorted(os.listdir(target_path), key=sort_key) + for filename in file_list: + if filename in skip_files: + continue + + file_path = os.path.join(target_path, filename) + file_name = os.path.basename(file_path) + file_size = os.path.getsize(file_path) + + try: + img = Image.open(file_path) + width, height = img.size + except Exception as e: + # print("Error:", e) + _, file_extension = os.path.splitext(file_path) + if file_extension.lower() in ['.sjpg', '.spng', '.sqoi']: + offset = 14 + with open(file_path, 'rb') as f: + f.seek(offset) + width_bytes = f.read(2) + height_bytes = f.read(2) + width = int.from_bytes(width_bytes, byteorder='little') + height = int.from_bytes(height_bytes, byteorder='little') + else: + width, height = 0, 0 + + file_info_list.append((file_name, len(merged_data), file_size, width, height)) + # Add 0x5A5A prefix to merged_data + merged_data.extend(b'\x5A' * 2) + + with open(file_path, 'rb') as bin_file: + bin_data = bin_file.read() + + merged_data.extend(bin_data) + + total_files = len(file_info_list) + + mmap_table = bytearray() + for file_name, offset, file_size, width, height in file_info_list: + if len(file_name) > int(max_name_len): + print(f'\033[1;33mWarn:\033[0m "{file_name}" exceeds {max_name_len} bytes and will be truncated.') + fixed_name = file_name.ljust(int(max_name_len), '\0')[:int(max_name_len)] + mmap_table.extend(fixed_name.encode('utf-8')) + mmap_table.extend(file_size.to_bytes(4, byteorder='little')) + mmap_table.extend(offset.to_bytes(4, byteorder='little')) + mmap_table.extend(width.to_bytes(2, byteorder='little')) + mmap_table.extend(height.to_bytes(2, byteorder='little')) + + combined_data = mmap_table + merged_data + combined_checksum = compute_checksum(combined_data) + combined_data_length = len(combined_data).to_bytes(4, byteorder='little') + header_data = total_files.to_bytes(4, byteorder='little') + combined_checksum.to_bytes(4, byteorder='little') + final_data = header_data + combined_data_length + combined_data + + with open(out_file, 'wb') as output_bin: + output_bin.write(final_data) + + os.makedirs(assets_include_path, exist_ok=True) + current_year = datetime.now().year + + asset_name = os.path.basename(assets_path) + file_path = os.path.join(assets_include_path, f'mmap_generate_{asset_name}.h') + with open(file_path, 'w') as output_header: + output_header.write('/*\n') + output_header.write(' * SPDX-FileCopyrightText: 2022-{} Espressif Systems (Shanghai) CO LTD\n'.format(current_year)) + output_header.write(' *\n') + output_header.write(' * SPDX-License-Identifier: Apache-2.0\n') + output_header.write(' */\n\n') + output_header.write('/**\n') + output_header.write(' * @file\n') + output_header.write(" * @brief This file was generated by esp_mmap_assets, don't modify it\n") + output_header.write(' */\n\n') + output_header.write('#pragma once\n\n') + output_header.write("#include \"esp_mmap_assets.h\"\n\n") + output_header.write(f'#define MMAP_{asset_name.upper()}_FILES {total_files}\n') + output_header.write(f'#define MMAP_{asset_name.upper()}_CHECKSUM 0x{combined_checksum:04X}\n\n') + output_header.write(f'enum MMAP_{asset_name.upper()}_LISTS {{\n') + + for i, (file_name, _, _, _, _) in enumerate(file_info_list): + enum_name = file_name.replace('.', '_') + output_header.write(f' MMAP_{asset_name.upper()}_{enum_name.upper()} = {i}, /*!< {file_name} */\n') + + output_header.write('};\n') + + print(f'All bin files have been merged into {os.path.basename(out_file)}') + +def copy_assets(config: AssetCopyConfig): + """ + Copy assets to target_path based on the provided configuration. + """ + format_tuple = tuple(config.support_format) + assets_path = config.assets_path + target_path = config.target_path + + for filename in os.listdir(assets_path): + if any(filename.endswith(suffix) for suffix in format_tuple): + source_file = os.path.join(assets_path, filename) + target_file = os.path.join(target_path, filename) + shutil.copyfile(source_file, target_file) + + conversion_map = { + '.jpg': [ + (config.sjpg_enable, convert_image_to_simg), + (config.qoi_enable, convert_image_to_qoi), + ], + '.png': [ + (config.spng_enable, convert_image_to_simg), + (config.qoi_enable, convert_image_to_qoi), + ], + } + + file_ext = os.path.splitext(filename)[1].lower() + conversions = conversion_map.get(file_ext, []) + converted = False + + for enable_flag, convert_func in conversions: + if enable_flag: + convert_func(target_file, config.split_height) + os.remove(target_file) + converted = True + break + + if not converted and config.row_enable: + convert_image_to_raw(target_file) + os.remove(target_file) + else: + print(f'No match found for file: {filename}, format_tuple: {format_tuple}') + +def process_assets_build(config_data): + assets_path = config_data['assets_path'] + image_file = config_data['image_file'] + target_path = os.path.dirname(image_file) + include_path = config_data['include_path'] + name_length = config_data['name_length'] + split_height = config_data['split_height'] + support_format = [fmt.strip() for fmt in config_data['support_format'].split(',')] + + copy_config = AssetCopyConfig( + assets_path=assets_path, + target_path=target_path, + spng_enable=config_data['support_spng'], + sjpg_enable=config_data['support_sjpg'], + qoi_enable=config_data['support_qoi'], + sqoi_enable=config_data['support_sqoi'], + row_enable=config_data['support_raw'], + support_format=support_format, + split_height=split_height + ) + + pack_config = PackModelsConfig( + target_path=target_path, + include_path=include_path, + image_file=image_file, + assets_path=assets_path, + name_length=name_length + ) + + print('--support_format:', support_format) + + if '.jpg' in support_format or '.png' in support_format: + print('--support_spng:', copy_config.spng_enable) + print('--support_sjpg:', copy_config.sjpg_enable) + print('--support_qoi:', copy_config.qoi_enable) + print('--support_raw:', copy_config.row_enable) + + if copy_config.sqoi_enable: + print('--support_sqoi:', copy_config.sqoi_enable) + if copy_config.spng_enable or copy_config.sjpg_enable or copy_config.sqoi_enable: + print('--split_height:', copy_config.split_height) + if copy_config.row_enable: + print('--lvgl_version:', config_data['lvgl_ver']) + + if not os.path.exists(target_path): + os.makedirs(target_path, exist_ok=True) + for filename in os.listdir(target_path): + file_path = os.path.join(target_path, filename) + if os.path.isfile(file_path) or os.path.islink(file_path): + os.unlink(file_path) + elif os.path.isdir(file_path): + shutil.rmtree(file_path) + + copy_assets(copy_config) + pack_assets(pack_config) + + total_size = os.path.getsize(os.path.join(target_path, image_file)) + recommended_size = math.ceil(total_size / 1024) + partition_size = math.ceil(int(config_data['assets_size'], 16)) + + print(f'{"Total size:":<30} {GREEN}{total_size / 1024:>8.2f}K ({total_size}){RESET}') + print(f'{"Partition size:":<30} {GREEN}{partition_size / 1024:>8.2f}K ({partition_size}){RESET}') + + if int(config_data['assets_size'], 16) <= total_size: + print(f'Recommended partition size: {GREEN}{recommended_size}K{RESET}') + print(f'{RED}Error:Binary size exceeds partition size.{RESET}') + sys.exit(1) + +def process_assets_merge(config_data): + app_bin_path = config_data['app_bin_path'] + image_file = config_data['image_file'] + target_path = os.path.dirname(image_file) + + combined_bin_path = os.path.join(target_path, 'combined.bin') + append_bin_path = os.path.join(target_path, image_file) + + app_size = os.path.getsize(app_bin_path) + asset_size = os.path.getsize(append_bin_path) + total_size = asset_size + app_size + recommended_size = math.ceil(total_size / 1024) + partition_size = math.ceil(int(config_data['assets_size'], 16)) + + print(f'{"Asset size:":<30} {GREEN}{asset_size / 1024:>8.2f}K ({asset_size}){RESET}') + print(f'{"App size:":<30} {GREEN}{app_size / 1024:>8.2f}K ({app_size}){RESET}') + print(f'{"Total size:":<30} {GREEN}{total_size / 1024:>8.2f}K ({total_size}){RESET}') + print(f'{"Partition size:":<30} {GREEN}{partition_size / 1024:>8.2f}K ({partition_size}){RESET}') + + if total_size > partition_size: + print(f'Recommended partition size: {GREEN}{recommended_size}K{RESET}') + print(f'{RED}Error:Binary size exceeds partition size.{RESET}') + sys.exit(1) + + with open(combined_bin_path, 'wb') as combined_bin: + with open(app_bin_path, 'rb') as app_bin: + combined_bin.write(app_bin.read()) + with open(append_bin_path, 'rb') as img_bin: + combined_bin.write(img_bin.read()) + + shutil.move(combined_bin_path, app_bin_path) + print(f'Append bin created: {os.path.basename(app_bin_path)}') + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Move and Pack assets.') + parser.add_argument('--config', required=True, help='Path to the configuration file') + parser.add_argument('--merge', action='store_true', help='Merge assets with app binary') + args = parser.parse_args() + + with open(args.config, 'r') as f: + config_data = json.load(f) + + if args.merge: + process_assets_merge(config_data) + else: + process_assets_build(config_data) diff --git a/sdkconfig.defaults b/sdkconfig.defaults index 2fa1abbe..c63b677e 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -11,7 +11,7 @@ CONFIG_HTTPD_MAX_REQ_HDR_LEN=2048 CONFIG_HTTPD_MAX_URI_LEN=2048 CONFIG_PARTITION_TABLE_CUSTOM=y -CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions/v1/16m.csv" +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions/v2/16m.csv" CONFIG_PARTITION_TABLE_OFFSET=0x8000 CONFIG_ESP_TASK_WDT_TIMEOUT_S=10 @@ -80,4 +80,5 @@ CONFIG_LV_USE_TILEVIEW=n CONFIG_LV_USE_WIN=n CONFIG_LV_BUILD_EXAMPLES=n +CONFIG_LV_BUILD_DEMOS=n diff --git a/sdkconfig.defaults.esp32c3 b/sdkconfig.defaults.esp32c3 index 6114d30b..be746bff 100644 --- a/sdkconfig.defaults.esp32c3 +++ b/sdkconfig.defaults.esp32c3 @@ -1,13 +1,15 @@ CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions/v2/16m_c3.csv" CONFIG_SR_WN_WN9S_NIHAOXIAOZHI=y CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=3 CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=6 CONFIG_ESP_WIFI_RX_BA_WIN=3 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=16 CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA=y + CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=n CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=0 CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=768 -CONFIG_LWIP_IPV6=n -CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=16 \ No newline at end of file +CONFIG_LWIP_IPV6=n \ No newline at end of file diff --git a/sdkconfig.defaults.esp32c6 b/sdkconfig.defaults.esp32c6 index 7de622de..59ff6358 100644 --- a/sdkconfig.defaults.esp32c6 +++ b/sdkconfig.defaults.esp32c6 @@ -1,4 +1,5 @@ CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y +CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions/v2/16m_c3.csv" CONFIG_ESPTOOLPY_FLASHMODE_QIO=y CONFIG_SR_WN_WN9S_NIHAOXIAOZHI=y diff --git a/sdkconfig.defaults.esp32s3 b/sdkconfig.defaults.esp32s3 index d1ec5589..c94136f2 100644 --- a/sdkconfig.defaults.esp32s3 +++ b/sdkconfig.defaults.esp32s3 @@ -12,6 +12,12 @@ CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=65536 CONFIG_SPIRAM_MEMTEST=n CONFIG_MBEDTLS_EXTERNAL_MEM_ALLOC=y +CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=3 +CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=6 +CONFIG_ESP_WIFI_RX_BA_WIN=3 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=16 +CONFIG_MBEDTLS_DYNAMIC_FREE_CONFIG_DATA=y + CONFIG_ESP32S3_INSTRUCTION_CACHE_32KB=y CONFIG_ESP32S3_DATA_CACHE_LINE_64B=y