diff --git a/main/application.cc b/main/application.cc index 84568c11..c21da702 100644 --- a/main/application.cc +++ b/main/application.cc @@ -54,7 +54,7 @@ void Application::CheckNewVersion() { while (true) { if (ota_.CheckVersion()) { if (ota_.HasNewVersion()) { - Alert("OTA 升级", "正在升级系统", "happy", std::string(p3_upgrade_start, p3_upgrade_end - p3_upgrade_start)); + Alert("OTA 升级", "正在升级系统", "happy", std::string_view(p3_upgrade_start, p3_upgrade_end - p3_upgrade_start)); // Wait for the chat state to be idle do { vTaskDelay(pdMS_TO_TICKS(3000)); @@ -123,33 +123,37 @@ void Application::ShowActivationCode() { struct digit_sound { char digit; - const char* sound_data_start; - const char* sound_data_end; + const char* data; + size_t size; }; - 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); + static const std::array digit_sounds{{ + digit_sound{'0', p3_0_start, size_t(p3_0_end - p3_0_start)}, + digit_sound{'1', p3_1_start, size_t(p3_1_end - p3_1_start)}, + digit_sound{'2', p3_2_start, size_t(p3_2_end - p3_2_start)}, + digit_sound{'3', p3_3_start, size_t(p3_3_end - p3_3_start)}, + digit_sound{'4', p3_4_start, size_t(p3_4_end - p3_4_start)}, + digit_sound{'5', p3_5_start, size_t(p3_5_end - p3_5_start)}, + digit_sound{'6', p3_6_start, size_t(p3_6_end - p3_6_start)}, + digit_sound{'7', p3_7_start, size_t(p3_7_end - p3_7_start)}, + digit_sound{'8', p3_8_start, size_t(p3_8_end - p3_8_start)}, + digit_sound{'9', p3_9_start, size_t(p3_9_end - p3_9_start)} + }}; + + // This sentence uses 9KB of SRAM, so we need to wait for it to finish + Alert("激活设备", message, "happy", std::string_view(p3_activation_start, p3_activation_end - p3_activation_start)); + vTaskDelay(pdMS_TO_TICKS(1000)); + background_task_->WaitForCompletion(); + for (const auto& digit : code) { - auto it = std::find_if(digit_sounds, digit_sounds + sizeof(digit_sounds) / sizeof(digit_sound), + auto it = std::find_if(digit_sounds.begin(), digit_sounds.end(), [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); + if (it != digit_sounds.end()) { + PlayLocalFile(it->data, it->size); } } - Alert("激活设备", message, "happy", sound); } -void Application::Alert(const std::string& status, const std::string& message, const std::string& emotion, const std::string& sound) { +void Application::Alert(const std::string& status, const std::string& message, const std::string& emotion, const std::string_view& sound) { ESP_LOGW(TAG, "Alert %s: %s [%s]", status.c_str(), message.c_str(), emotion.c_str()); auto display = Board::GetInstance().GetDisplay(); display->SetStatus(status); diff --git a/main/application.h b/main/application.h index b66cdf3b..cd8d7df9 100644 --- a/main/application.h +++ b/main/application.h @@ -56,7 +56,7 @@ public: bool IsVoiceDetected() const { return voice_detected_; } void Schedule(std::function callback); void SetDeviceState(DeviceState state); - void Alert(const std::string& status, const std::string& message, const std::string& emotion = "", const std::string& sound = ""); + void Alert(const std::string& status, const std::string& message, const std::string& emotion = "", const std::string_view& sound = ""); void AbortSpeaking(AbortReason reason); void ToggleChatState(); void StartListening(); diff --git a/main/boards/common/ml307_board.cc b/main/boards/common/ml307_board.cc index 11b14386..7ae13ea0 100644 --- a/main/boards/common/ml307_board.cc +++ b/main/boards/common/ml307_board.cc @@ -48,10 +48,10 @@ void Ml307Board::WaitForNetworkReady() { display->SetStatus("等待网络..."); int result = modem_.WaitForNetworkReady(); if (result == -1) { - application.Alert("PIN_ERROR", "请插入SIM卡", "sad", std::string(p3_err_pin_start, p3_err_pin_end - p3_err_pin_start)); + application.Alert("PIN_ERROR", "请插入SIM卡", "sad", std::string_view(p3_err_pin_start, p3_err_pin_end - p3_err_pin_start)); return; } else if (result == -2) { - application.Alert("REG_ERROR", "无法接入网络,请检查流量卡状态", "sad", std::string(p3_err_reg_start, p3_err_reg_end - p3_err_reg_start)); + application.Alert("REG_ERROR", "无法接入网络,请检查流量卡状态", "sad", std::string_view(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 338ae18a..20847000 100644 --- a/main/boards/common/wifi_board.cc +++ b/main/boards/common/wifi_board.cc @@ -52,7 +52,7 @@ void WifiBoard::EnterWifiConfigMode() { hint += "\n\n"; // 播报配置 WiFi 的提示 - application.Alert("配网模式", hint, "", std::string(p3_wificonfig_start, p3_wificonfig_end - p3_wificonfig_start)); + application.Alert("配网模式", hint, "", std::string_view(p3_wificonfig_start, p3_wificonfig_end - p3_wificonfig_start)); // Wait forever until reset after configuration while (true) { diff --git a/sdkconfig.defaults b/sdkconfig.defaults index 3ad228f0..fc581e2a 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -21,6 +21,7 @@ CONFIG_MBEDTLS_DYNAMIC_BUFFER=y CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=n CONFIG_ESP_WIFI_IRAM_OPT=n CONFIG_ESP_WIFI_RX_IRAM_OPT=n +CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER=y CONFIG_CODEC_I2C_BACKWARD_COMPATIBLE=n