From 3a71c1e8951aa849307178b359248d49e9ffde12 Mon Sep 17 00:00:00 2001 From: Terrence Date: Sun, 16 Feb 2025 06:59:19 +0800 Subject: [PATCH] Enhance device activation and OTA update process - Add support for device activation with audio feedback - Refactor OTA update flow to include activation code handling - Update asset management for localized sound resources - Improve error handling and device state management - Reorganize binary asset includes and CMake configuration --- CMakeLists.txt | 2 +- main/CMakeLists.txt | 12 ++- main/application.cc | 120 +++++++++++++++++---------- main/application.h | 6 +- main/assets/err_pin.p3 | Bin 3128 -> 0 bytes main/assets/err_reg.p3 | Bin 6707 -> 0 bytes main/assets/upgrade.p3 | Bin 3010 -> 0 bytes main/assets/wificonfig.p3 | Bin 3038 -> 0 bytes main/assets/zh/0.p3 | Bin 0 -> 1323 bytes main/assets/zh/1.p3 | Bin 0 -> 1475 bytes main/assets/zh/2.p3 | Bin 0 -> 1162 bytes main/assets/zh/3.p3 | Bin 0 -> 1364 bytes main/assets/zh/4.p3 | Bin 0 -> 1477 bytes main/assets/zh/5.p3 | Bin 0 -> 1478 bytes main/assets/zh/6.p3 | Bin 0 -> 1351 bytes main/assets/zh/7.p3 | Bin 0 -> 1538 bytes main/assets/zh/8.p3 | Bin 0 -> 1173 bytes main/assets/zh/9.p3 | Bin 0 -> 1231 bytes main/assets/zh/activation.p3 | Bin 0 -> 8937 bytes main/assets/zh/binary.h | 39 +++++++++ main/assets/zh/err_pin.p3 | Bin 0 -> 3636 bytes main/assets/zh/err_reg.p3 | Bin 0 -> 6746 bytes main/assets/zh/sounds.tar.gz | Bin 0 -> 41598 bytes main/assets/zh/upgrade.p3 | Bin 0 -> 2822 bytes main/assets/zh/welcome.p3 | Bin 0 -> 3719 bytes main/assets/zh/wificonfig.p3 | Bin 0 -> 3161 bytes main/background_task.cc | 5 +- main/boards/common/ml307_board.cc | 7 +- main/boards/common/wifi_board.cc | 10 +-- main/display/display.cc | 5 ++ main/display/display.h | 1 + main/display/lcd_display.cc | 8 -- main/display/lcd_display.h | 2 - main/display/ssd1306_display.cc | 64 +++++++++++--- main/display/ssd1306_display.h | 4 + main/led/circular_strip.cc | 7 +- main/led/single_led.cc | 6 +- main/ota.cc | 2 + main/protocols/websocket_protocol.cc | 6 +- 39 files changed, 220 insertions(+), 86 deletions(-) delete mode 100644 main/assets/err_pin.p3 delete mode 100644 main/assets/err_reg.p3 delete mode 100644 main/assets/upgrade.p3 delete mode 100644 main/assets/wificonfig.p3 create mode 100644 main/assets/zh/0.p3 create mode 100644 main/assets/zh/1.p3 create mode 100644 main/assets/zh/2.p3 create mode 100644 main/assets/zh/3.p3 create mode 100644 main/assets/zh/4.p3 create mode 100644 main/assets/zh/5.p3 create mode 100644 main/assets/zh/6.p3 create mode 100644 main/assets/zh/7.p3 create mode 100644 main/assets/zh/8.p3 create mode 100644 main/assets/zh/9.p3 create mode 100644 main/assets/zh/activation.p3 create mode 100644 main/assets/zh/binary.h create mode 100644 main/assets/zh/err_pin.p3 create mode 100644 main/assets/zh/err_reg.p3 create mode 100644 main/assets/zh/sounds.tar.gz create mode 100644 main/assets/zh/upgrade.p3 create mode 100644 main/assets/zh/welcome.p3 create mode 100644 main/assets/zh/wificonfig.p3 diff --git a/CMakeLists.txt b/CMakeLists.txt index ea8ffd0f..dccdb48e 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.1.2") +set(PROJECT_VER "1.1.9") # 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 3873cbc5..2590469a 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -13,8 +13,6 @@ set(SOURCES "audio_codecs/audio_codec.cc" "display/ssd1306_display.cc" "boards/lilygo-t-circle-s3/esp_lcd_gc9d01n.c" "protocols/protocol.cc" - "protocols/mqtt_protocol.cc" - "protocols/websocket_protocol.cc" "iot/thing.cc" "iot/thing_manager.cc" "system_info.cc" @@ -107,6 +105,12 @@ endif() file(GLOB BOARD_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/boards/${BOARD_TYPE}/*.cc) list(APPEND SOURCES ${BOARD_SOURCES}) +if(CONFIG_CONNECTION_TYPE_MQTT_UDP) + list(APPEND SOURCES "protocols/mqtt_protocol.cc") +elseif(CONFIG_CONNECTION_TYPE_WEBSOCKET) + list(APPEND SOURCES "protocols/websocket_protocol.cc") +endif() + if(CONFIG_USE_AUDIO_PROCESSING) list(APPEND SOURCES "audio_processing/audio_processor.cc" "audio_processing/wake_word_detect.cc") endif() @@ -119,8 +123,10 @@ if(CONFIG_IDF_TARGET_ESP32) "audio_codecs/es8388_audio_codec.cc") endif() +file(GLOB ASSETS ${CMAKE_CURRENT_SOURCE_DIR}/assets/zh/*.p3) + idf_component_register(SRCS ${SOURCES} - EMBED_FILES "assets/err_reg.p3" "assets/err_pin.p3" "assets/wificonfig.p3" "assets/upgrade.p3" + EMBED_FILES ${ASSETS} INCLUDE_DIRS ${INCLUDE_DIRS} WHOLE_ARCHIVE ) diff --git a/main/application.cc b/main/application.cc index c0ba33d7..8ffd4efa 100644 --- a/main/application.cc +++ b/main/application.cc @@ -8,6 +8,7 @@ #include "websocket_protocol.h" #include "font_awesome_symbols.h" #include "iot/thing_manager.h" +#include "assets/zh/binary.h" #include #include @@ -17,14 +18,6 @@ #define TAG "Application" -extern const char p3_err_reg_start[] asm("_binary_err_reg_p3_start"); -extern const char p3_err_reg_end[] asm("_binary_err_reg_p3_end"); -extern const char p3_err_pin_start[] asm("_binary_err_pin_p3_start"); -extern const char p3_err_pin_end[] asm("_binary_err_pin_p3_end"); -extern const char p3_wificonfig_start[] asm("_binary_wificonfig_p3_start"); -extern const char p3_wificonfig_end[] asm("_binary_wificonfig_p3_end"); -extern const char p3_upgrade_start[] asm("_binary_upgrade_p3_start"); -extern const char p3_upgrade_end[] asm("_binary_upgrade_p3_end"); static const char* const STATE_STRINGS[] = { "unknown", @@ -35,6 +28,7 @@ static const char* const STATE_STRINGS[] = { "listening", "speaking", "upgrading", + "activating", "fatal_error", "invalid_state" }; @@ -42,9 +36,6 @@ static const char* const STATE_STRINGS[] = { Application::Application() { event_group_ = xEventGroupCreate(); background_task_ = new BackgroundTask(4096 * 8); - - ota_.SetCheckVersionUrl(CONFIG_OTA_VERSION_URL); - ota_.SetHeader("Device-Id", SystemInfo::GetMacAddress().c_str()); } Application::~Application() { @@ -61,13 +52,9 @@ void Application::CheckNewVersion() { ota_.SetPostData(board.GetJson()); while (true) { - bool success = ota_.CheckVersion(); - if (ota_.HasActivationCode()) { - DisplayActivationCode(); - } - if (success) { + if (ota_.CheckVersion()) { if (ota_.HasNewVersion()) { - Alert("Info", "正在升级固件"); + Alert("OTA 升级", "正在升级系统", "happy", std::string(p3_upgrade_start, p3_upgrade_end - p3_upgrade_start)); // Wait for the chat state to be idle do { vTaskDelay(pdMS_TO_TICKS(3000)); @@ -78,7 +65,7 @@ void Application::CheckNewVersion() { SetDeviceState(kDeviceStateUpgrading); display->SetIcon(FONT_AWESOME_DOWNLOAD); - display->SetStatus("新版本 " + ota_.GetFirmwareVersion()); + display->SetChatMessage("system", "新版本 " + ota_.GetFirmwareVersion()); board.SetPowerSaveMode(false); #if CONFIG_USE_AUDIO_PROCESSING @@ -100,20 +87,29 @@ void Application::CheckNewVersion() { ota_.StartUpgrade([display](int progress, size_t speed) { char buffer[64]; snprintf(buffer, sizeof(buffer), "%d%% %zuKB/s", progress, speed / 1024); - display->SetStatus(buffer); + display->SetChatMessage("system", buffer); }); // If upgrade success, the device will reboot and never reach here display->SetStatus("更新失败"); ESP_LOGI(TAG, "Firmware upgrade failed..."); vTaskDelay(pdMS_TO_TICKS(3000)); - esp_restart(); + Reboot(); }); } else { ota_.MarkCurrentVersionValid(); display->ShowNotification("版本 " + ota_.GetCurrentVersion()); + + // Check if the activation code is valid + if (ota_.HasActivationCode()) { + SetDeviceState(kDeviceStateActivating); + ShowActivationCode(); + } else { + SetDeviceState(kDeviceStateIdle); + display->SetChatMessage("system", ""); + return; + } } - return; } // Check again in 60 seconds @@ -121,31 +117,53 @@ void Application::CheckNewVersion() { } } -void Application::DisplayActivationCode() { - ESP_LOGW(TAG, "Activation Message: %s", ota_.GetActivationMessage().c_str()); - ESP_LOGW(TAG, "Activation Code: %s", ota_.GetActivationCode().c_str()); - auto display = Board::GetInstance().GetDisplay(); - display->ShowNotification(ota_.GetActivationMessage(), 30000); +void Application::ShowActivationCode() { + auto& message = ota_.GetActivationMessage(); + auto& code = ota_.GetActivationCode(); + + struct digit_sound { + char digit; + const char* sound_data_start; + const char* sound_data_end; + }; + digit_sound digit_sounds[] = { + {'0', p3_0_start, p3_0_end}, + {'1', p3_1_start, p3_1_end}, + {'2', p3_2_start, p3_2_end}, + {'3', p3_3_start, p3_3_end}, + {'4', p3_4_start, p3_4_end}, + {'5', p3_5_start, p3_5_end}, + {'6', p3_6_start, p3_6_end}, + {'7', p3_7_start, p3_7_end}, + {'8', p3_8_start, p3_8_end}, + {'9', p3_9_start, p3_9_end}, + }; + std::string sound = std::string(p3_activation_start, p3_activation_end - p3_activation_start); + for (const auto& digit : code) { + auto it = std::find_if(digit_sounds, digit_sounds + sizeof(digit_sounds) / sizeof(digit_sound), + [digit](const digit_sound& ds) { return ds.digit == digit; }); + if (it != digit_sounds + sizeof(digit_sounds) / sizeof(digit_sound)) { + sound += std::string(it->sound_data_start, it->sound_data_end - it->sound_data_start); + } + } + Alert("激活设备", message, "happy", sound); } -void Application::Alert(const std::string& title, const std::string& message) { - ESP_LOGW(TAG, "Alert: %s, %s", title.c_str(), message.c_str()); +void Application::Alert(const std::string& status, const std::string& message, const std::string& emotion, const std::string& sound) { + ESP_LOGW(TAG, "Alert %s: %s [%s]", status.c_str(), message.c_str(), emotion.c_str()); auto display = Board::GetInstance().GetDisplay(); - display->ShowNotification(message); - - if (message == "进入配网模式") { - PlayLocalFile(p3_wificonfig_start, p3_wificonfig_end - p3_wificonfig_start); - } else if (message == "正在升级固件") { - PlayLocalFile(p3_upgrade_start, p3_upgrade_end - p3_upgrade_start); - } else if (message == "请插入SIM卡") { - PlayLocalFile(p3_err_pin_start, p3_err_pin_end - p3_err_pin_start); - } else if (message == "无法接入网络,请检查流量卡状态") { - PlayLocalFile(p3_err_reg_start, p3_err_reg_end - p3_err_reg_start); + display->SetStatus(status); + display->SetEmotion(emotion); + display->SetChatMessage("system", message); + if (!sound.empty()) { + PlayLocalFile(sound.data(), sound.size()); } } void Application::PlayLocalFile(const char* data, size_t size) { ESP_LOGI(TAG, "PlayLocalFile: %zu bytes", size); + auto codec = Board::GetInstance().GetAudioCodec(); + codec->EnableOutput(true); SetDecodeSampleRate(16000); for (const char* p = data; p < data + size; ) { auto p3 = (BinaryProtocol3*)p; @@ -164,6 +182,11 @@ void Application::PlayLocalFile(const char* data, size_t size) { void Application::ToggleChatState() { Schedule([this]() { + if (device_state_ == kDeviceStateActivating) { + Reboot(); + return; + } + if (!protocol_) { ESP_LOGE(TAG, "Protocol not initialized"); return; @@ -172,7 +195,7 @@ void Application::ToggleChatState() { if (device_state_ == kDeviceStateIdle) { SetDeviceState(kDeviceStateConnecting); if (!protocol_->OpenAudioChannel()) { - Alert("Error", "Failed to open audio channel"); + Alert("ERROR", "无法建立音频通道"); SetDeviceState(kDeviceStateIdle); return; } @@ -190,6 +213,11 @@ void Application::ToggleChatState() { void Application::StartListening() { Schedule([this]() { + if (device_state_ == kDeviceStateActivating) { + Reboot(); + return; + } + if (!protocol_) { ESP_LOGE(TAG, "Protocol not initialized"); return; @@ -201,7 +229,7 @@ void Application::StartListening() { SetDeviceState(kDeviceStateConnecting); if (!protocol_->OpenAudioChannel()) { SetDeviceState(kDeviceStateIdle); - Alert("Error", "Failed to open audio channel"); + Alert("ERROR", "无法建立音频通道"); return; } } @@ -275,14 +303,14 @@ void Application::Start() { board.StartNetwork(); // Initialize the protocol - display->SetStatus("初始化协议"); + display->SetStatus("加载协议..."); #ifdef CONFIG_CONNECTION_TYPE_WEBSOCKET protocol_ = std::make_unique(); #else protocol_ = std::make_unique(); #endif protocol_->OnNetworkError([this](const std::string& message) { - Alert("Error", std::move(message)); + Alert("ERROR", message); }); protocol_->OnIncomingAudio([this](std::vector&& data) { std::lock_guard lock(mutex_); @@ -371,6 +399,9 @@ void Application::Start() { }); // Check for new firmware version or get the MQTT broker address + ota_.SetCheckVersionUrl(CONFIG_OTA_VERSION_URL); + ota_.SetHeader("Device-Id", SystemInfo::GetMacAddress().c_str()); + ota_.SetHeader("Client-Id", board.GetUuid()); xTaskCreate([](void* arg) { Application* app = (Application*)arg; app->CheckNewVersion(); @@ -664,3 +695,8 @@ void Application::UpdateIotStates() { protocol_->SendIotStates(states); } } + +void Application::Reboot() { + ESP_LOGI(TAG, "Rebooting..."); + esp_restart(); +} \ No newline at end of file diff --git a/main/application.h b/main/application.h index 2b8552e7..c7321c16 100644 --- a/main/application.h +++ b/main/application.h @@ -35,6 +35,7 @@ enum DeviceState { kDeviceStateListening, kDeviceStateSpeaking, kDeviceStateUpgrading, + kDeviceStateActivating, kDeviceStateFatalError }; @@ -55,12 +56,13 @@ public: bool IsVoiceDetected() const { return voice_detected_; } void Schedule(std::function callback); void SetDeviceState(DeviceState state); - void Alert(const std::string& title, const std::string& message); + void Alert(const std::string& status, const std::string& message, const std::string& emotion = "", const std::string& sound = ""); void AbortSpeaking(AbortReason reason); void ToggleChatState(); void StartListening(); void StopListening(); void UpdateIotStates(); + void Reboot(); private: Application(); @@ -100,7 +102,7 @@ private: void ResetDecoder(); void SetDecodeSampleRate(int sample_rate); void CheckNewVersion(); - void DisplayActivationCode(); + void ShowActivationCode(); void PlayLocalFile(const char* data, size_t size); }; diff --git a/main/assets/err_pin.p3 b/main/assets/err_pin.p3 deleted file mode 100644 index f00ce48b544e6f4dd5e7af1502e600381efcb4db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3128 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 diff --git a/main/assets/err_reg.p3 b/main/assets/err_reg.p3 deleted file mode 100644 index af60b6800f64a4aa8a5ff1699346c0e573fd30c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6707 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 diff --git a/main/assets/upgrade.p3 b/main/assets/upgrade.p3 deleted file mode 100644 index 4447f26a5c0960c6487cc17ed9d5243f2310e192..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3010 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 MIXaRP|NjsE1J<^`e*gdg diff --git a/main/assets/zh/0.p3 b/main/assets/zh/0.p3 new file mode 100644 index 0000000000000000000000000000000000000000..ec909323ab66f40a9f9fc3c17e81a7d7e83b0850 GIT binary patch literal 1323 zcmbV{`9ISQ0LLer+&5dP*^ordGmoqysYrX6tI~HCt&uB{D`#^bGd)v|=b=O7T8`XI zu^7T0wWM-BB5GUqu#vD{JbRwk^A|ine?G7G`||;TKxYAvmm9>gEt1Gtv>|cDCXY#Z z6;E4LFk#@R-{{qkhIMXM(X%G9r+SkS{7Lymjk$2J>xx$VbMFNEw`ZJ!a#>@nGUSvU z6a)g{0XfWJ3ULE?lf=cmq$1*tZtXcA(#3;%6Hp^Ej)-$B7TT%)waAEmbM7m0LkQDU z^tNk&Zk)@zLO6q!?lG92U$Y#OwYp&MslGqc0^x3LeB`t|_-13h1fBwX#Lp-$b7DR? zv^e61D59mJHnTg}0_fdM+^;U;;K@T)}HiJ+wKgxK2)OszLzDhM_v`7!$9J za(fzb-NrLIzc*&b>WCxsDePVKZoVu8&|bLcXgjoidn{2h z<|-f%n|hDar+u3!->C<+?fmcT`uIv!yC!*XwyTmKs+0g%NB3hCn9g+!5otokfnfDY zt)=QZM|GsssW`yX7fEnkmA`)w@igf`ab29A`s=B`OZ z0e}E4fUfgg@|jo97T)G&T;4Kr$c~F`D*rV1^PX*7A=pf9Dq+}7;|o8-L&&5#&oU;n zi3GEEk0&AffsUO1_GwLQS3oht+DY`)r}-R{n&)R3CFlsaVM3E-z3JBCyQc(h8%S&Y z^C}YHUn*VyGrxx6Z>zkor-W>ycc!-mzU$NrIv6$4-dq~DWVEl6xPkAUROxphW?pNd z2YXtfBd5f>=xvCHf$DV~xeVvf7(=L$6vlZq$fNq`y*L$RN~K=W={_af`ktkRDOGol zdg`YvmJ8OZs4ok)v{?1;OWs`1K#768!!N>Q{lUN}ND805Vh}mca4Y6NQ4tl-EMB;W zBl$GDmG7N@?ILZMajX*dG}(7`g4mFT*|Br}FGW&GPV60gem)dz;W{k*o%Fu6;&@t> z;m#DZ{%?1E;bs0{e>?bIYl+MUNM{<-1kBA*^g;(^4LoOgQI`G8HlwVI3B_VKaQAdV zbJA#?ofv(f6`!_0`!k1FVwzWTm|NK$L4okt=gBtwNp*$D4NV7q5a(ju{r)Winrud^ z?I2NCTzh@lGj2CuNIV2U&M61f7w)RgVcawBg^?QZ6_^j#(m&fQi(u*2md7eJ*uo;~ zwU|?Bosc0Z{n~{T|C1$Y&)ELy(Z}Ao zVGGX3ee}X-B@HlA-<~9Pf$}>?1dU1fab!h=h?TZo(;F{Zmyizt;H_^bP(Roq3Bht$ z=OQmNffFhm^9-5UIWrUvl$n2jplS4@`ntS_q^t!~W`5y2q@C1>&7oR5+QlIL Z3%tTC?&?A|?QaJhq#@+RVw3+7{0%fVZ;Jo` literal 0 HcmV?d00001 diff --git a/main/assets/zh/1.p3 b/main/assets/zh/1.p3 new file mode 100644 index 0000000000000000000000000000000000000000..18935e7a37a6a6317a30e80b2f1bcffb0d47788d GIT binary patch literal 1475 zcmb7=`9ISS9LGnFkR^d&;SU9no@nzueKR^Cto>W z-NxvlPa~{&`~j2&ie(Er6)FyG=%{!|A#%oIgCRzsY#RM+R~S?`bUg{IA2M&^&~DWm ziwF&XU3elbHaGKr)3pTz0^I_HskDdN0u=dWH5IR64w1evfzr?X+;nTZDs?ajv|^05ggl|eeTVHRCF^6d6ef?7xW zTG%&(@-%)PARU-TC)i|A8tQLn^Bm4@>12Z)nq|^0Zc?SR%TUZgqgjw}BYA=lg)|y?Is? zU@bAC^%MN1%C$QUGOFUGG6A`{mjgCqE~I+B74e@IEkkxn^n2`ny|@~YbyrYpS#c^X zx(QQ7)hR1_%8f&p;S@NA)f;m#D!!2kF(41Xu_LCVm1%o~>s$!(Kw|dKXwm?fIF@}L z@wHQNsZaL3?hQGqp995;lAJF&O373AXsZR>$;GW1WUaeKMFLML4qzS4yeoH2V8H59 zXP_qza5qNW(Pv^z%D}1<`0|1fJPie-6=||W(CaTp#P%ws z1eUcP>03yY$dboWc`R>WgH4vyWIBX)V~--;V8}~+Y3p@EmfPX01{RW2Ok?HKm`rN) zp)X0ycaoba6h{;qTA)$b*KX*p3XKL)A9hW7<}MTzZ(}*7bEbUAzWScCLjp)NlP}6} zw8Iwy*Eweo=Wz(YhBzjuwVebJ^0-bFnNPzG2BQ}jz^EB^u7EvZX3)q@lmiPV5dtfl z+rrJ3HI-3nQUv_&KXP;NAM{h+;+n4%bVJ6s9I^G%$`4+pJKzX6lQ9k5Lem}iz6^($ z%}L^z4@ZebX|~1k&`H3WgKg;2AUvo0v|)HtJx0O5N4nKo|M*fP z(!aFayJ^8`aukY{6TSa}hL;)W{xyT+0XaNZcaQqXFW5#xEUKq!9NsrYGR2n`?8|c^ zY8cfMs{QSq+u9{gi1cFNrSMbY6q&ph=t}$-OG$+Myz?~w-)1>Gjn0mmp(LBJk0`BU zX?NQbhQI&83!o4`xyf6({NAfVbko>cL){N@Pw%jNQ!^0UC3=2rMV{8~C>_-2F6o*D z;d>UWqW8xuql{s;URM@6>UA8nO#z{D?V97 z%Srma*%}aT(UG*o;0Ex`>V$VK0DltuheEED!N?=E7do#gYZ{3=`7DIs7-2*E8;h-X zURcr23%wfXVmfUq-iCGupS?tC)$OtA5sXFt9$bFcd1 zVEyj4G-n)tz0uJ)dt#YQ-MJYyykb`&t#y)D(*pQCi&sD5D#+ylk0t@ubYqqIUE}F1 zZ`hR!_3_Ef9czYLd69~xGS$D8k|)b+NCA9ow=llS8`pbVo=;idE U1P@V<{WK^FC%9a7h5sM?3q^6p9RL6T literal 0 HcmV?d00001 diff --git a/main/assets/zh/2.p3 b/main/assets/zh/2.p3 new file mode 100644 index 0000000000000000000000000000000000000000..f391e4b0b578ace7a34d5d8a0f963b9f7e0058d0 GIT binary patch literal 1162 zcmZQzVDOJ%Fg8|wf9~V+ec#ecXLovp=jj~Kc#uE8OxTxK$YrHhSlQXb9alYaPoGw5 zaDFmM}K#gke11!YtJ=+CKg0wnwzhmT^cX>{2jxx`A4^Nc66Li5*F^wX~;Ov zUR+wT{Nqli*&i>Rh`(F3`$R@(;O~txE!Y39JA3!K@E+%<<(qX?stj&UtDLpa-FP!%#LkaSbu&xTjZh<$6xfd0BC1+#M}2=sweVdPMc?> zl#6%kaz=8vUupW(Xwm3)?8K6^FHhHqop|@(|H&s4?K7e~#m-GRF!jTMiM2ac+HYn% zwP5AB3;(%$b=Jh(Zn{Src>%O8 zFXHW?xw#iLwy3h?*%}_5d1mKP%eyf}p=Pzg3rnS>^fKr1r1A7ks-EYx{#f@bqb50n zzgFTOQZ8Lw^g~HjZC$DGE#sRVYZt0)Il&iOU0PJT?R3elM-pCp_v-KlTUPIwxaQQG z{)lhi)zd$1es=Ns44{o=5pQ?j@6z8U=((9wLteJ_a89zvS9j%;ZF@8;zW+UcYvBoj zw0X}=?{#V?$xmsoixidVT5zWAi-1LwQgg7SUv@;n?)gWr8OcxYo59<_w(@nKh)ws_ z2L|6(bpAdmXS(iL`qP9xeAYidUf=cNc5bMOolQSOA4~fIpv_GYXH z_j`{Y`X|Jv^Y*OULaW9U{=&XUE@KB@gGGzwwg@j~%6BU?^U|mYJUey2!1T2x>3!#K zpATSlDZ+2?7UzH!1Bk}gxgHvgVW=Yjm zy(Ypp7ZkV&o$-Dfl{@Rv3ZAx8Jn1FtChFnSx`R-fItNK5h&kR)B zD)K&yZ|CbwjgNCPa0@v@~+SHT)0J=XKn*aa+ literal 0 HcmV?d00001 diff --git a/main/assets/zh/3.p3 b/main/assets/zh/3.p3 new file mode 100644 index 0000000000000000000000000000000000000000..c2564814da573497b50c2049a0f5fcec3b6c5442 GIT binary patch literal 1364 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 literal 0 HcmV?d00001 diff --git a/main/assets/zh/6.p3 b/main/assets/zh/6.p3 new file mode 100644 index 0000000000000000000000000000000000000000..ddbec49e77e1b7a11eabbb3b7141cf3efaf3151d GIT binary patch literal 1351 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 literal 0 HcmV?d00001 diff --git a/main/assets/zh/9.p3 b/main/assets/zh/9.p3 new file mode 100644 index 0000000000000000000000000000000000000000..e1f147ad8673950d2c5c1eb0192e968e4be64b4f GIT binary patch literal 1231 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 wT*hyTo2L9l|Bna$5Az}ObN~PV literal 0 HcmV?d00001 diff --git a/main/assets/zh/binary.h b/main/assets/zh/binary.h new file mode 100644 index 00000000..9407fd9e --- /dev/null +++ b/main/assets/zh/binary.h @@ -0,0 +1,39 @@ +#ifndef BINARY_H +#define BINARY_H + +extern const char p3_err_reg_start[] asm("_binary_err_reg_p3_start"); +extern const char p3_err_reg_end[] asm("_binary_err_reg_p3_end"); +extern const char p3_err_pin_start[] asm("_binary_err_pin_p3_start"); +extern const char p3_err_pin_end[] asm("_binary_err_pin_p3_end"); +extern const char p3_wificonfig_start[] asm("_binary_wificonfig_p3_start"); +extern const char p3_wificonfig_end[] asm("_binary_wificonfig_p3_end"); +extern const char p3_upgrade_start[] asm("_binary_upgrade_p3_start"); +extern const char p3_upgrade_end[] asm("_binary_upgrade_p3_end"); +extern const char p3_activation_start[] asm("_binary_activation_p3_start"); +extern const char p3_activation_end[] asm("_binary_activation_p3_end"); +extern const char p3_welcome_start[] asm("_binary_welcome_p3_start"); +extern const char p3_welcome_end[] asm("_binary_welcome_p3_end"); + +extern const char p3_0_start[] asm("_binary_0_p3_start"); +extern const char p3_0_end[] asm("_binary_0_p3_end"); +extern const char p3_1_start[] asm("_binary_1_p3_start"); +extern const char p3_1_end[] asm("_binary_1_p3_end"); +extern const char p3_2_start[] asm("_binary_2_p3_start"); +extern const char p3_2_end[] asm("_binary_2_p3_end"); +extern const char p3_3_start[] asm("_binary_3_p3_start"); +extern const char p3_3_end[] asm("_binary_3_p3_end"); +extern const char p3_4_start[] asm("_binary_4_p3_start"); +extern const char p3_4_end[] asm("_binary_4_p3_end"); +extern const char p3_5_start[] asm("_binary_5_p3_start"); +extern const char p3_5_end[] asm("_binary_5_p3_end"); +extern const char p3_6_start[] asm("_binary_6_p3_start"); +extern const char p3_6_end[] asm("_binary_6_p3_end"); +extern const char p3_7_start[] asm("_binary_7_p3_start"); +extern const char p3_7_end[] asm("_binary_7_p3_end"); +extern const char p3_8_start[] asm("_binary_8_p3_start"); +extern const char p3_8_end[] asm("_binary_8_p3_end"); +extern const char p3_9_start[] asm("_binary_9_p3_start"); +extern const char p3_9_end[] asm("_binary_9_p3_end"); + + +#endif \ No newline at end of file diff --git a/main/assets/zh/err_pin.p3 b/main/assets/zh/err_pin.p3 new file mode 100644 index 0000000000000000000000000000000000000000..bf4d8190bdd01b197db048acc2405d9e7abb24e1 GIT binary patch literal 3636 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 B)Or8_ literal 0 HcmV?d00001 diff --git a/main/assets/zh/err_reg.p3 b/main/assets/zh/err_reg.p3 new file mode 100644 index 0000000000000000000000000000000000000000..cf316fa28d0d44844dccacd8bef56350390b5ad4 GIT binary patch literal 6746 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 literal 0 HcmV?d00001 diff --git a/main/assets/zh/sounds.tar.gz b/main/assets/zh/sounds.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..16a3bf099193571404895783b27ed508c433d3fc GIT binary patch literal 41598 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 SKKS7OH~t4bL;JS?@BjcZan`c{ literal 0 HcmV?d00001 diff --git a/main/assets/zh/upgrade.p3 b/main/assets/zh/upgrade.p3 new file mode 100644 index 0000000000000000000000000000000000000000..cb382f83acec50a7d14e4bf4339a4d716c82da8a GIT binary patch literal 2822 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 literal 0 HcmV?d00001 diff --git a/main/assets/zh/welcome.p3 b/main/assets/zh/welcome.p3 new file mode 100644 index 0000000000000000000000000000000000000000..c018b54a529364148fbef6604857c4f2e52867fa GIT binary patch literal 3719 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 literal 0 HcmV?d00001 diff --git a/main/background_task.cc b/main/background_task.cc index af4a5522..6d526f96 100644 --- a/main/background_task.cc +++ b/main/background_task.cc @@ -20,7 +20,10 @@ BackgroundTask::~BackgroundTask() { void BackgroundTask::Schedule(std::function callback) { std::lock_guard lock(mutex_); if (active_tasks_ >= 30) { - ESP_LOGW(TAG, "active_tasks_ == %u", active_tasks_.load()); + int free_sram = heap_caps_get_free_size(MALLOC_CAP_INTERNAL); + if (free_sram < 10000) { + ESP_LOGW(TAG, "active_tasks_ == %u, free_sram == %u", active_tasks_.load(), free_sram); + } } active_tasks_++; main_tasks_.emplace_back([this, cb = std::move(callback)]() { diff --git a/main/boards/common/ml307_board.cc b/main/boards/common/ml307_board.cc index 8a1a97b0..11b14386 100644 --- a/main/boards/common/ml307_board.cc +++ b/main/boards/common/ml307_board.cc @@ -3,6 +3,7 @@ #include "application.h" #include "display.h" #include "font_awesome_symbols.h" +#include "assets/zh/binary.h" #include #include @@ -24,7 +25,7 @@ std::string Ml307Board::GetBoardType() { void Ml307Board::StartNetwork() { auto display = Board::GetInstance().GetDisplay(); - display->SetStatus("初始化模块"); + display->SetStatus("检测模组..."); modem_.SetDebug(false); modem_.SetBaudRate(921600); @@ -47,10 +48,10 @@ void Ml307Board::WaitForNetworkReady() { display->SetStatus("等待网络..."); int result = modem_.WaitForNetworkReady(); if (result == -1) { - application.Alert("Error", "请插入SIM卡"); + application.Alert("PIN_ERROR", "请插入SIM卡", "sad", std::string(p3_err_pin_start, p3_err_pin_end - p3_err_pin_start)); return; } else if (result == -2) { - application.Alert("Error", "无法接入网络,请检查流量卡状态"); + application.Alert("REG_ERROR", "无法接入网络,请检查流量卡状态", "sad", std::string(p3_err_reg_start, p3_err_reg_end - p3_err_reg_start)); return; } diff --git a/main/boards/common/wifi_board.cc b/main/boards/common/wifi_board.cc index a0865ffc..d24b86f5 100644 --- a/main/boards/common/wifi_board.cc +++ b/main/boards/common/wifi_board.cc @@ -5,6 +5,7 @@ #include "system_info.h" #include "font_awesome_symbols.h" #include "settings.h" +#include "assets/zh/binary.h" #include #include @@ -37,7 +38,6 @@ std::string WifiBoard::GetBoardType() { void WifiBoard::EnterWifiConfigMode() { auto& application = Application::GetInstance(); - auto display = Board::GetInstance().GetDisplay(); application.SetDeviceState(kDeviceStateWifiConfiguring); auto& wifi_ap = WifiConfigurationAp::GetInstance(); @@ -49,11 +49,9 @@ void WifiBoard::EnterWifiConfigMode() { hint += wifi_ap.GetSsid(); hint += ",然后打开浏览器访问 "; hint += wifi_ap.GetWebServerUrl(); - - display->SetStatus(hint); // 播报配置 WiFi 的提示 - application.Alert("Info", "进入配网模式"); + application.Alert("配网模式", hint, "", std::string(p3_wificonfig_start, p3_wificonfig_end - p3_wificonfig_start)); // Wait forever until reset after configuration while (true) { @@ -83,11 +81,11 @@ void WifiBoard::StartNetwork() { auto& wifi_station = WifiStation::GetInstance(); wifi_station.OnScanBegin([this]() { auto display = Board::GetInstance().GetDisplay(); - display->ShowNotification("正在扫描 WiFi 网络", 30000); + display->ShowNotification("扫描 WiFi...", 30000); }); wifi_station.OnConnect([this](const std::string& ssid) { auto display = Board::GetInstance().GetDisplay(); - display->ShowNotification(std::string("正在连接 ") + ssid, 30000); + display->ShowNotification(std::string("连接 ") + ssid + "...", 30000); }); wifi_station.OnConnected([this](const std::string& ssid) { auto display = Board::GetInstance().GetDisplay(); diff --git a/main/display/display.cc b/main/display/display.cc index 23070d21..e4172b42 100644 --- a/main/display/display.cc +++ b/main/display/display.cc @@ -210,6 +210,11 @@ void Display::SetIcon(const char* icon) { } void Display::SetChatMessage(const std::string &role, const std::string &content) { + DisplayLockGuard lock(this); + if (chat_message_label_ == nullptr) { + return; + } + lv_label_set_text(chat_message_label_, content.c_str()); } void Display::SetBacklight(uint8_t brightness) { diff --git a/main/display/display.h b/main/display/display.h index effe679b..7bab9460 100644 --- a/main/display/display.h +++ b/main/display/display.h @@ -42,6 +42,7 @@ protected: lv_obj_t *notification_label_ = nullptr; lv_obj_t *mute_label_ = nullptr; lv_obj_t *battery_label_ = nullptr; + lv_obj_t* chat_message_label_ = nullptr; const char* battery_icon_ = nullptr; const char* network_icon_ = nullptr; bool muted_ = false; diff --git a/main/display/lcd_display.cc b/main/display/lcd_display.cc index 0279a3ac..68e13fe3 100644 --- a/main/display/lcd_display.cc +++ b/main/display/lcd_display.cc @@ -274,14 +274,6 @@ void LcdDisplay::SetupUI() { lv_obj_set_style_text_font(battery_label_, fonts_.icon_font, 0); } -void LcdDisplay::SetChatMessage(const std::string &role, const std::string &content) { - DisplayLockGuard lock(this); - if (chat_message_label_ == nullptr) { - return; - } - lv_label_set_text(chat_message_label_, content.c_str()); -} - void LcdDisplay::SetEmotion(const std::string &emotion) { struct Emotion { const char* icon; diff --git a/main/display/lcd_display.h b/main/display/lcd_display.h index dc72d1c9..f4fba4de 100644 --- a/main/display/lcd_display.h +++ b/main/display/lcd_display.h @@ -26,7 +26,6 @@ protected: lv_obj_t* content_ = nullptr; lv_obj_t* container_ = nullptr; lv_obj_t* side_bar_ = nullptr; - lv_obj_t* chat_message_label_ = nullptr; DisplayFonts fonts_; @@ -46,7 +45,6 @@ public: DisplayFonts fonts); ~LcdDisplay(); - virtual void SetChatMessage(const std::string &role, const std::string &content) override; virtual void SetEmotion(const std::string &emotion) override; virtual void SetIcon(const char* icon) override; virtual void SetBacklight(uint8_t brightness) override; diff --git a/main/display/ssd1306_display.cc b/main/display/ssd1306_display.cc index 57268f03..4c18c7b4 100644 --- a/main/display/ssd1306_display.cc +++ b/main/display/ssd1306_display.cc @@ -132,6 +132,20 @@ void Ssd1306Display::Unlock() { lvgl_port_unlock(); } +void Ssd1306Display::SetChatMessage(const std::string &role, const std::string &content) { + DisplayLockGuard lock(this); + if (content_right_ == nullptr) { + lv_label_set_text(chat_message_label_, content.c_str()); + } else { + if (content.empty()) { + lv_obj_add_flag(content_right_, LV_OBJ_FLAG_HIDDEN); + } else { + lv_label_set_text(chat_message_label_, content.c_str()); + lv_obj_clear_flag(content_right_, LV_OBJ_FLAG_HIDDEN); + } + } +} + void Ssd1306Display::SetupUI_128x64() { DisplayLockGuard lock(this); @@ -149,20 +163,46 @@ void Ssd1306Display::SetupUI_128x64() { /* Status bar */ status_bar_ = lv_obj_create(container_); - lv_obj_set_size(status_bar_, LV_HOR_RES, 18); + lv_obj_set_size(status_bar_, LV_HOR_RES, 16); + lv_obj_set_style_border_width(status_bar_, 0, 0); + lv_obj_set_style_pad_all(status_bar_, 0, 0); lv_obj_set_style_radius(status_bar_, 0, 0); /* Content */ content_ = lv_obj_create(container_); lv_obj_set_scrollbar_mode(content_, LV_SCROLLBAR_MODE_OFF); - lv_obj_set_style_radius(status_bar_, 0, 0); + lv_obj_set_style_radius(content_, 0, 0); + lv_obj_set_style_pad_all(content_, 0, 0); lv_obj_set_width(content_, LV_HOR_RES); lv_obj_set_flex_grow(content_, 1); + lv_obj_set_flex_flow(content_, LV_FLEX_FLOW_ROW); + lv_obj_set_style_flex_main_place(content_, LV_FLEX_ALIGN_CENTER, 0); - emotion_label_ = lv_label_create(content_); + // 创建左侧固定宽度的容器 + content_left_ = lv_obj_create(content_); + lv_obj_set_size(content_left_, 32, LV_SIZE_CONTENT); // 固定宽度32像素 + lv_obj_set_style_pad_all(content_left_, 0, 0); + lv_obj_set_style_border_width(content_left_, 0, 0); + + emotion_label_ = lv_label_create(content_left_); lv_obj_set_style_text_font(emotion_label_, &font_awesome_30_1, 0); lv_label_set_text(emotion_label_, FONT_AWESOME_AI_CHIP); lv_obj_center(emotion_label_); + lv_obj_set_style_pad_top(emotion_label_, 8, 0); + + // 创建右侧可扩展的容器 + content_right_ = lv_obj_create(content_); + lv_obj_set_size(content_right_, LV_SIZE_CONTENT, LV_SIZE_CONTENT); + lv_obj_set_style_pad_all(content_right_, 0, 0); + lv_obj_set_style_border_width(content_right_, 0, 0); + lv_obj_set_flex_grow(content_right_, 1); + lv_obj_add_flag(content_right_, LV_OBJ_FLAG_HIDDEN); + + chat_message_label_ = lv_label_create(content_right_); + lv_label_set_text(chat_message_label_, ""); + lv_label_set_long_mode(chat_message_label_, LV_LABEL_LONG_WRAP); + lv_obj_set_width(chat_message_label_, lv_pct(100)); + lv_obj_set_style_text_align(chat_message_label_, LV_TEXT_ALIGN_LEFT, 0); /* Status bar */ lv_obj_set_flex_flow(status_bar_, LV_FLEX_FLOW_ROW); @@ -250,17 +290,19 @@ void Ssd1306Display::SetupUI_128x32() { lv_label_set_text(battery_label_, ""); lv_obj_set_style_text_font(battery_label_, icon_font_, 0); - status_label_ = lv_label_create(side_bar_); - lv_obj_set_flex_grow(status_label_, 1); - lv_obj_set_width(status_label_, width_ - 32); - lv_label_set_long_mode(status_label_, LV_LABEL_LONG_SCROLL_CIRCULAR); + status_label_ = lv_label_create(status_bar_); + lv_obj_set_style_pad_left(status_label_, 2, 0); lv_label_set_text(status_label_, "正在初始化"); - notification_label_ = lv_label_create(side_bar_); - lv_obj_set_flex_grow(notification_label_, 1); - lv_obj_set_width(notification_label_, width_ - 32); - lv_label_set_long_mode(notification_label_, LV_LABEL_LONG_SCROLL_CIRCULAR); + notification_label_ = lv_label_create(status_bar_); lv_label_set_text(notification_label_, "通知"); + lv_obj_set_style_pad_left(notification_label_, 2, 0); lv_obj_add_flag(notification_label_, LV_OBJ_FLAG_HIDDEN); + + chat_message_label_ = lv_label_create(side_bar_); + lv_obj_set_flex_grow(chat_message_label_, 1); + lv_obj_set_width(chat_message_label_, width_ - 32); + lv_label_set_long_mode(chat_message_label_, LV_LABEL_LONG_SCROLL_CIRCULAR); + lv_label_set_text(chat_message_label_, ""); } diff --git a/main/display/ssd1306_display.h b/main/display/ssd1306_display.h index e1fbf194..70f09d31 100644 --- a/main/display/ssd1306_display.h +++ b/main/display/ssd1306_display.h @@ -13,6 +13,8 @@ private: lv_obj_t* status_bar_ = nullptr; lv_obj_t* content_ = nullptr; + lv_obj_t* content_left_ = nullptr; + lv_obj_t* content_right_ = nullptr; lv_obj_t* container_ = nullptr; lv_obj_t* side_bar_ = nullptr; @@ -29,6 +31,8 @@ public: Ssd1306Display(void* i2c_master_handle, int width, int height, bool mirror_x, bool mirror_y, const lv_font_t* text_font, const lv_font_t* icon_font); ~Ssd1306Display(); + + virtual void SetChatMessage(const std::string &role, const std::string &content); }; #endif // SSD1306_DISPLAY_H diff --git a/main/led/circular_strip.cc b/main/led/circular_strip.cc index 6be6a083..1712583c 100644 --- a/main/led/circular_strip.cc +++ b/main/led/circular_strip.cc @@ -211,8 +211,13 @@ void CircularStrip::OnStateChanged() { Blink(color, 100); break; } + case kDeviceStateActivating: { + StripColor color = { LOW_BRIGHTNESS, DEFAULT_BRIGHTNESS, LOW_BRIGHTNESS }; + Blink(color, 500); + break; + } default: - ESP_LOGE(TAG, "Invalid led strip event: %d", device_state); + ESP_LOGW(TAG, "Unknown led strip event: %d", device_state); return; } } diff --git a/main/led/single_led.cc b/main/led/single_led.cc index d4df70be..20a313cb 100644 --- a/main/led/single_led.cc +++ b/main/led/single_led.cc @@ -151,8 +151,12 @@ void SingleLed::OnStateChanged() { SetColor(0, DEFAULT_BRIGHTNESS, 0); StartContinuousBlink(100); break; + case kDeviceStateActivating: + SetColor(0, DEFAULT_BRIGHTNESS, 0); + StartContinuousBlink(500); + break; default: - ESP_LOGE(TAG, "Invalid led strip event: %d", device_state); + ESP_LOGW(TAG, "Unknown led strip event: %d", device_state); return; } } diff --git a/main/ota.cc b/main/ota.cc index 1181eb98..2b05f4de 100644 --- a/main/ota.cc +++ b/main/ota.cc @@ -71,6 +71,7 @@ bool Ota::CheckVersion() { return false; } + has_activation_code_ = false; cJSON *activation = cJSON_GetObjectItem(root, "activation"); if (activation != NULL) { cJSON* message = cJSON_GetObjectItem(activation, "message"); @@ -84,6 +85,7 @@ bool Ota::CheckVersion() { has_activation_code_ = true; } + has_mqtt_config_ = false; cJSON *mqtt = cJSON_GetObjectItem(root, "mqtt"); if (mqtt != NULL) { Settings settings("mqtt", true); diff --git a/main/protocols/websocket_protocol.cc b/main/protocols/websocket_protocol.cc index 9e625803..1c2e6895 100644 --- a/main/protocols/websocket_protocol.cc +++ b/main/protocols/websocket_protocol.cc @@ -10,8 +10,6 @@ #define TAG "WS" -#ifdef CONFIG_CONNECTION_TYPE_WEBSOCKET - WebsocketProtocol::WebsocketProtocol() { event_group_handle_ = xEventGroupCreate(); } @@ -61,7 +59,7 @@ bool WebsocketProtocol::OpenAudioChannel() { websocket_->SetHeader("Authorization", token.c_str()); websocket_->SetHeader("Protocol-Version", "1"); websocket_->SetHeader("Device-Id", SystemInfo::GetMacAddress().c_str()); - websocket_->SetHeader("X-Uuid", Board::GetInstance().GetUuid().c_str()); + websocket_->SetHeader("Client-Id", Board::GetInstance().GetUuid().c_str()); websocket_->OnData([this](const char* data, size_t len, bool binary) { if (binary) { @@ -147,5 +145,3 @@ void WebsocketProtocol::ParseServerHello(const cJSON* root) { xEventGroupSetBits(event_group_handle_, WEBSOCKET_PROTOCOL_SERVER_HELLO_EVENT); } - -#endif