forked from xiaozhi/xiaozhi-esp32
Bump to 1.3.0
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
# CMakeLists in this exact order for cmake to work correctly
|
# CMakeLists in this exact order for cmake to work correctly
|
||||||
cmake_minimum_required(VERSION 3.16)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
set(PROJECT_VER "1.2.2")
|
set(PROJECT_VER "1.3.0")
|
||||||
|
|
||||||
# Add this line to disable the specific warning
|
# Add this line to disable the specific warning
|
||||||
add_compile_options(-Wno-missing-field-initializers)
|
add_compile_options(-Wno-missing-field-initializers)
|
||||||
|
|||||||
@@ -36,9 +36,24 @@ static const char* const STATE_STRINGS[] = {
|
|||||||
Application::Application() {
|
Application::Application() {
|
||||||
event_group_ = xEventGroupCreate();
|
event_group_ = xEventGroupCreate();
|
||||||
background_task_ = new BackgroundTask(4096 * 8);
|
background_task_ = new BackgroundTask(4096 * 8);
|
||||||
|
|
||||||
|
esp_timer_create_args_t clock_timer_args = {
|
||||||
|
.callback = [](void* arg) {
|
||||||
|
Application* app = (Application*)arg;
|
||||||
|
app->OnClockTimer();
|
||||||
|
},
|
||||||
|
.arg = this,
|
||||||
|
.dispatch_method = ESP_TIMER_TASK,
|
||||||
|
.name = "clock_timer"
|
||||||
|
};
|
||||||
|
esp_timer_create(&clock_timer_args, &clock_timer_handle_);
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::~Application() {
|
Application::~Application() {
|
||||||
|
if (clock_timer_handle_ != nullptr) {
|
||||||
|
esp_timer_stop(clock_timer_handle_);
|
||||||
|
esp_timer_delete(clock_timer_handle_);
|
||||||
|
}
|
||||||
if (background_task_ != nullptr) {
|
if (background_task_ != nullptr) {
|
||||||
delete background_task_;
|
delete background_task_;
|
||||||
}
|
}
|
||||||
@@ -225,7 +240,6 @@ void Application::ToggleChatState() {
|
|||||||
if (device_state_ == kDeviceStateIdle) {
|
if (device_state_ == kDeviceStateIdle) {
|
||||||
SetDeviceState(kDeviceStateConnecting);
|
SetDeviceState(kDeviceStateConnecting);
|
||||||
if (!protocol_->OpenAudioChannel()) {
|
if (!protocol_->OpenAudioChannel()) {
|
||||||
Alert(Lang::Strings::ERROR, Lang::Strings::UNABLE_TO_ESTABLISH_AUDIO_CHANNEL, "sad");
|
|
||||||
SetDeviceState(kDeviceStateIdle);
|
SetDeviceState(kDeviceStateIdle);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -259,7 +273,6 @@ void Application::StartListening() {
|
|||||||
SetDeviceState(kDeviceStateConnecting);
|
SetDeviceState(kDeviceStateConnecting);
|
||||||
if (!protocol_->OpenAudioChannel()) {
|
if (!protocol_->OpenAudioChannel()) {
|
||||||
SetDeviceState(kDeviceStateIdle);
|
SetDeviceState(kDeviceStateIdle);
|
||||||
Alert(Lang::Strings::ERROR, Lang::Strings::UNABLE_TO_ESTABLISH_AUDIO_CHANNEL, "sad");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -506,6 +519,33 @@ void Application::Start() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
SetDeviceState(kDeviceStateIdle);
|
SetDeviceState(kDeviceStateIdle);
|
||||||
|
esp_timer_start_periodic(clock_timer_handle_, 1000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::OnClockTimer() {
|
||||||
|
static int count = 0;
|
||||||
|
count++;
|
||||||
|
|
||||||
|
// Print the debug info every 10 seconds
|
||||||
|
if (count % 10 == 0) {
|
||||||
|
// SystemInfo::PrintRealTimeStats(pdMS_TO_TICKS(1000));
|
||||||
|
int free_sram = heap_caps_get_free_size(MALLOC_CAP_INTERNAL);
|
||||||
|
int min_free_sram = heap_caps_get_minimum_free_size(MALLOC_CAP_INTERNAL);
|
||||||
|
ESP_LOGI(TAG, "Free internal: %u minimal internal: %u", free_sram, min_free_sram);
|
||||||
|
|
||||||
|
// If we have synchronized server time, set the status to clock "HH:MM" if the device is idle
|
||||||
|
if (ota_.HasServerTime()) {
|
||||||
|
Schedule([this]() {
|
||||||
|
if (device_state_ == kDeviceStateIdle) {
|
||||||
|
// Set status to clock "HH:MM"
|
||||||
|
time_t now = time(NULL);
|
||||||
|
char time_str[64];
|
||||||
|
strftime(time_str, sizeof(time_str), "%H:%M ", localtime(&now));
|
||||||
|
Board::GetInstance().GetDisplay()->SetStatus(time_str);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::Schedule(std::function<void()> callback) {
|
void Application::Schedule(std::function<void()> callback) {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <freertos/FreeRTOS.h>
|
#include <freertos/FreeRTOS.h>
|
||||||
#include <freertos/event_groups.h>
|
#include <freertos/event_groups.h>
|
||||||
#include <freertos/task.h>
|
#include <freertos/task.h>
|
||||||
|
#include <esp_timer.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
@@ -77,7 +78,8 @@ private:
|
|||||||
std::mutex mutex_;
|
std::mutex mutex_;
|
||||||
std::list<std::function<void()>> main_tasks_;
|
std::list<std::function<void()>> main_tasks_;
|
||||||
std::unique_ptr<Protocol> protocol_;
|
std::unique_ptr<Protocol> protocol_;
|
||||||
EventGroupHandle_t event_group_;
|
EventGroupHandle_t event_group_ = nullptr;
|
||||||
|
esp_timer_handle_t clock_timer_handle_ = nullptr;
|
||||||
volatile DeviceState device_state_ = kDeviceStateUnknown;
|
volatile DeviceState device_state_ = kDeviceStateUnknown;
|
||||||
bool keep_listening_ = false;
|
bool keep_listening_ = false;
|
||||||
bool aborted_ = false;
|
bool aborted_ = false;
|
||||||
@@ -104,7 +106,7 @@ private:
|
|||||||
void SetDecodeSampleRate(int sample_rate);
|
void SetDecodeSampleRate(int sample_rate);
|
||||||
void CheckNewVersion();
|
void CheckNewVersion();
|
||||||
void ShowActivationCode();
|
void ShowActivationCode();
|
||||||
|
void OnClockTimer();
|
||||||
void PlayLocalFile(const char* data, size_t size);
|
void PlayLocalFile(const char* data, size_t size);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
"LISTENING": "Listening...",
|
"LISTENING": "Listening...",
|
||||||
"SPEAKING": "Speaking...",
|
"SPEAKING": "Speaking...",
|
||||||
|
|
||||||
"UNABLE_TO_CONNECT_TO_SERVICE": "Unable to connect to service",
|
"UNABLE_TO_CONNECT_TO_SERVICE": "Unable to connect to service, please try again later",
|
||||||
"WAITING_FOR_RESPONSE_TIMEOUT": "Waiting for response timeout",
|
"WAITING_FOR_RESPONSE_TIMEOUT": "Waiting for response timeout",
|
||||||
"SENDING_FAILED_PLEASE_CHECK_THE_NETWORK": "Sending failed, please check the network",
|
"SENDING_FAILED_PLEASE_CHECK_THE_NETWORK": "Sending failed, please check the network",
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ private:
|
|||||||
},
|
},
|
||||||
.arg = this,
|
.arg = this,
|
||||||
.dispatch_method = ESP_TIMER_TASK,
|
.dispatch_method = ESP_TIMER_TASK,
|
||||||
.name = "Power Save Timer",
|
.name = "power_save_timer",
|
||||||
.skip_unhandled_events = false,
|
.skip_unhandled_events = false,
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(esp_timer_create(&power_save_timer_args, &power_save_timer_));
|
ESP_ERROR_CHECK(esp_timer_create(&power_save_timer_args, &power_save_timer_));
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ private:
|
|||||||
},
|
},
|
||||||
.arg = this,
|
.arg = this,
|
||||||
.dispatch_method = ESP_TIMER_TASK,
|
.dispatch_method = ESP_TIMER_TASK,
|
||||||
.name = "Power Save Timer",
|
.name = "power_save_timer",
|
||||||
.skip_unhandled_events = false,
|
.skip_unhandled_events = false,
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(esp_timer_create(&power_save_timer_args, &power_save_timer_));
|
ESP_ERROR_CHECK(esp_timer_create(&power_save_timer_args, &power_save_timer_));
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ Display::Display() {
|
|||||||
},
|
},
|
||||||
.arg = this,
|
.arg = this,
|
||||||
.dispatch_method = ESP_TIMER_TASK,
|
.dispatch_method = ESP_TIMER_TASK,
|
||||||
.name = "Notification Timer",
|
.name = "notification_timer",
|
||||||
.skip_unhandled_events = false,
|
.skip_unhandled_events = false,
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(esp_timer_create(¬ification_timer_args, ¬ification_timer_));
|
ESP_ERROR_CHECK(esp_timer_create(¬ification_timer_args, ¬ification_timer_));
|
||||||
@@ -40,7 +40,7 @@ Display::Display() {
|
|||||||
},
|
},
|
||||||
.arg = this,
|
.arg = this,
|
||||||
.dispatch_method = ESP_TIMER_TASK,
|
.dispatch_method = ESP_TIMER_TASK,
|
||||||
.name = "Update Display Timer",
|
.name = "update_display_timer",
|
||||||
.skip_unhandled_events = true,
|
.skip_unhandled_events = true,
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(esp_timer_create(&update_display_timer_args, &update_timer_));
|
ESP_ERROR_CHECK(esp_timer_create(&update_display_timer_args, &update_timer_));
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ CircularStrip::CircularStrip(gpio_num_t gpio, uint8_t max_leds) : max_leds_(max_
|
|||||||
},
|
},
|
||||||
.arg = this,
|
.arg = this,
|
||||||
.dispatch_method = ESP_TIMER_TASK,
|
.dispatch_method = ESP_TIMER_TASK,
|
||||||
.name = "Strip Timer",
|
.name = "strip_timer",
|
||||||
.skip_unhandled_events = false,
|
.skip_unhandled_events = false,
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(esp_timer_create(&strip_timer_args, &strip_timer_));
|
ESP_ERROR_CHECK(esp_timer_create(&strip_timer_args, &strip_timer_));
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ Led::Led(gpio_num_t gpio, uint8_t max_leds) {
|
|||||||
},
|
},
|
||||||
.arg = this,
|
.arg = this,
|
||||||
.dispatch_method = ESP_TIMER_TASK,
|
.dispatch_method = ESP_TIMER_TASK,
|
||||||
.name = "Led Strip Timer",
|
.name = "led_strip_timer",
|
||||||
.skip_unhandled_events = false,
|
.skip_unhandled_events = false,
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(esp_timer_create(&led_strip_timer_args, &led_strip_timer_));
|
ESP_ERROR_CHECK(esp_timer_create(&led_strip_timer_args, &led_strip_timer_));
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ SingleLed::SingleLed(gpio_num_t gpio) {
|
|||||||
},
|
},
|
||||||
.arg = this,
|
.arg = this,
|
||||||
.dispatch_method = ESP_TIMER_TASK,
|
.dispatch_method = ESP_TIMER_TASK,
|
||||||
.name = "Blink Timer",
|
.name = "blink_timer",
|
||||||
.skip_unhandled_events = false,
|
.skip_unhandled_events = false,
|
||||||
};
|
};
|
||||||
ESP_ERROR_CHECK(esp_timer_create(&blink_timer_args, &blink_timer_));
|
ESP_ERROR_CHECK(esp_timer_create(&blink_timer_args, &blink_timer_));
|
||||||
|
|||||||
10
main/main.cc
10
main/main.cc
@@ -26,13 +26,5 @@ extern "C" void app_main(void)
|
|||||||
|
|
||||||
// Launch the application
|
// Launch the application
|
||||||
Application::GetInstance().Start();
|
Application::GetInstance().Start();
|
||||||
|
// The main thread will exit and release the stack memory
|
||||||
// Dump CPU usage every 10 second
|
|
||||||
while (true) {
|
|
||||||
vTaskDelay(10000 / portTICK_PERIOD_MS);
|
|
||||||
// SystemInfo::PrintRealTimeStats(pdMS_TO_TICKS(1000));
|
|
||||||
int free_sram = heap_caps_get_free_size(MALLOC_CAP_INTERNAL);
|
|
||||||
int min_free_sram = heap_caps_get_minimum_free_size(MALLOC_CAP_INTERNAL);
|
|
||||||
ESP_LOGI(TAG, "Free internal: %u minimal internal: %u", free_sram, min_free_sram);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
23
main/ota.cc
23
main/ota.cc
@@ -100,6 +100,29 @@ bool Ota::CheckVersion() {
|
|||||||
has_mqtt_config_ = true;
|
has_mqtt_config_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
has_server_time_ = false;
|
||||||
|
cJSON *server_time = cJSON_GetObjectItem(root, "server_time");
|
||||||
|
if (server_time != NULL) {
|
||||||
|
cJSON *timestamp = cJSON_GetObjectItem(server_time, "timestamp");
|
||||||
|
cJSON *timezone_offset = cJSON_GetObjectItem(server_time, "timezone_offset");
|
||||||
|
|
||||||
|
if (timestamp != NULL) {
|
||||||
|
// 设置系统时间
|
||||||
|
struct timeval tv;
|
||||||
|
double ts = timestamp->valuedouble;
|
||||||
|
|
||||||
|
// 如果有时区偏移,计算本地时间
|
||||||
|
if (timezone_offset != NULL) {
|
||||||
|
ts += (timezone_offset->valueint * 60 * 1000); // 转换分钟为毫秒
|
||||||
|
}
|
||||||
|
|
||||||
|
tv.tv_sec = (time_t)(ts / 1000); // 转换毫秒为秒
|
||||||
|
tv.tv_usec = (suseconds_t)((long long)ts % 1000) * 1000; // 剩余的毫秒转换为微秒
|
||||||
|
settimeofday(&tv, NULL);
|
||||||
|
has_server_time_ = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cJSON *firmware = cJSON_GetObjectItem(root, "firmware");
|
cJSON *firmware = cJSON_GetObjectItem(root, "firmware");
|
||||||
if (firmware == NULL) {
|
if (firmware == NULL) {
|
||||||
ESP_LOGE(TAG, "Failed to get firmware object");
|
ESP_LOGE(TAG, "Failed to get firmware object");
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ public:
|
|||||||
bool HasNewVersion() { return has_new_version_; }
|
bool HasNewVersion() { return has_new_version_; }
|
||||||
bool HasMqttConfig() { return has_mqtt_config_; }
|
bool HasMqttConfig() { return has_mqtt_config_; }
|
||||||
bool HasActivationCode() { return has_activation_code_; }
|
bool HasActivationCode() { return has_activation_code_; }
|
||||||
|
bool HasServerTime() { return has_server_time_; }
|
||||||
void StartUpgrade(std::function<void(int progress, size_t speed)> callback);
|
void StartUpgrade(std::function<void(int progress, size_t speed)> callback);
|
||||||
void MarkCurrentVersionValid();
|
void MarkCurrentVersionValid();
|
||||||
|
|
||||||
@@ -31,6 +32,7 @@ private:
|
|||||||
std::string activation_code_;
|
std::string activation_code_;
|
||||||
bool has_new_version_ = false;
|
bool has_new_version_ = false;
|
||||||
bool has_mqtt_config_ = false;
|
bool has_mqtt_config_ = false;
|
||||||
|
bool has_server_time_ = false;
|
||||||
bool has_activation_code_ = false;
|
bool has_activation_code_ = false;
|
||||||
std::string current_version_;
|
std::string current_version_;
|
||||||
std::string firmware_version_;
|
std::string firmware_version_;
|
||||||
|
|||||||
@@ -46,6 +46,9 @@ bool MqttProtocol::StartMqttClient() {
|
|||||||
|
|
||||||
if (endpoint_.empty()) {
|
if (endpoint_.empty()) {
|
||||||
ESP_LOGE(TAG, "MQTT endpoint is not specified");
|
ESP_LOGE(TAG, "MQTT endpoint is not specified");
|
||||||
|
if (on_network_error_ != nullptr) {
|
||||||
|
on_network_error_(Lang::Strings::UNABLE_TO_CONNECT_TO_SERVICE);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user