From a1bade4e0fbb4191313c0a6b40cc9e3def04c438 Mon Sep 17 00:00:00 2001 From: yusuhua <57382265+yusuhua@users.noreply.github.com> Date: Sat, 8 Mar 2025 02:21:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0LilyGo=20T-Circle-S3=E5=92=8C?= =?UTF-8?q?T-CameraPlus-S3=E7=9A=84=E5=B1=8F=E5=B9=95=E8=83=8C=E5=85=89?= =?UTF-8?q?=E5=92=8C=E4=BD=8E=E5=8A=9F=E8=80=97=E6=A8=A1=E5=BC=8F=20(#304)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 增加LilyGo T-Circle-S3和T-CameraPlus-S3的屏幕背光和低功耗模式 * 增加LilyGo T-Circle-S3和T-CameraPlus-S3的屏幕背光和低功耗模式 --- main/boards/lilygo-t-cameraplus-s3/README.md | 33 +++++++++++++++++++ .../lilygo-t-cameraplus-s3.cc | 30 +++++++++++++++++ .../tcamerapluss3_audio_codec.cc | 10 ++---- main/boards/lilygo-t-circle-s3/README.md | 28 ++++++++++++++++ .../lilygo-t-circle-s3/lilygo-t-circle-s3.cc | 30 +++++++++++++++++ .../tcircles3_audio_codec.cc | 10 ++---- 6 files changed, 127 insertions(+), 14 deletions(-) create mode 100644 main/boards/lilygo-t-cameraplus-s3/README.md create mode 100644 main/boards/lilygo-t-circle-s3/README.md diff --git a/main/boards/lilygo-t-cameraplus-s3/README.md b/main/boards/lilygo-t-cameraplus-s3/README.md new file mode 100644 index 0000000..551ce51 --- /dev/null +++ b/main/boards/lilygo-t-cameraplus-s3/README.md @@ -0,0 +1,33 @@ +# 编译配置命令 + +**配置编译目标为 ESP32S3:** + +```bash +idf.py set-target esp32s3 +``` + +**打开 menuconfig:** + +```bash +idf.py menuconfig +``` + +**选择板子:** + +``` +Xiaozhi Assistant -> Board Type -> LILYGO T-CameraPlus-S3 +``` + +**修改 psram 配置:** + +``` +Component config -> ESP PSRAM -> SPI RAM config -> Mode (QUAD/OCT) -> Quad Mode PSRAM +``` + +**编译:** + +```bash +idf.py build +``` + +LILYGO T-CameraPlus-S3 \ No newline at end of file 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 0bdc00a..25d7a38 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 @@ -4,6 +4,7 @@ #include "application.h" #include "button.h" #include "config.h" +#include "power_save_timer.h" #include "i2c_device.h" #include "iot/thing_manager.h" @@ -57,6 +58,25 @@ private: Cst816x *cst816d_; LcdDisplay *display_; Button key1_button_; + PowerSaveTimer* power_save_timer_; + + void InitializePowerSaveTimer() { + power_save_timer_ = new PowerSaveTimer(-1, 60, 300); + power_save_timer_->OnEnterSleepMode([this]() { + ESP_LOGI(TAG, "Enabling sleep mode"); + auto display = GetDisplay(); + display->SetChatMessage("system", ""); + display->SetEmotion("sleepy"); + GetBacklight()->SetBrightness(10); + }); + power_save_timer_->OnExitSleepMode([this]() { + auto display = GetDisplay(); + display->SetChatMessage("system", ""); + display->SetEmotion("neutral"); + GetBacklight()->RestoreBrightness(); + }); + power_save_timer_->SetEnabled(true); + } void InitI2c(){ // Initialize I2C peripheral @@ -179,6 +199,7 @@ private: if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) { ResetWifiConfiguration(); } + power_save_timer_->WakeUp(); app.ToggleChatState(); }); } @@ -187,10 +208,12 @@ private: void InitializeIot() { auto &thing_manager = iot::ThingManager::GetInstance(); thing_manager.AddThing(iot::CreateThing("Speaker")); + thing_manager.AddThing(iot::CreateThing("Backlight")); } public: LilygoTCameraPlusS3Board() : key1_button_(KEY1_BUTTON_GPIO) { + InitializePowerSaveTimer(); InitI2c(); InitCst816d(); I2cDetect(); @@ -218,6 +241,13 @@ public: virtual Display *GetDisplay() override{ return display_; } + + virtual void SetPowerSaveMode(bool enabled) override { + if (!enabled) { + power_save_timer_->WakeUp(); + } + WifiBoard::SetPowerSaveMode(enabled); + } virtual Backlight* GetBacklight() override { static PwmBacklight backlight(DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT); diff --git a/main/boards/lilygo-t-cameraplus-s3/tcamerapluss3_audio_codec.cc b/main/boards/lilygo-t-cameraplus-s3/tcamerapluss3_audio_codec.cc index 95f817a..6a56277 100644 --- a/main/boards/lilygo-t-cameraplus-s3/tcamerapluss3_audio_codec.cc +++ b/main/boards/lilygo-t-cameraplus-s3/tcamerapluss3_audio_codec.cc @@ -114,17 +114,13 @@ int Tcamerapluss3AudioCodec::Read(int16_t *dest, int samples){ return samples; } -void AdjustTcamerapluss3Volume(const int16_t *input_data, int16_t *output_data, size_t samples, float volume){ - for (size_t i = 0; i < samples; i++){ - output_data[i] = (float)input_data[i] * volume; - } -} - int Tcamerapluss3AudioCodec::Write(const int16_t *data, int samples){ if (output_enabled_){ size_t bytes_read; auto output_data = (int16_t *)malloc(samples * sizeof(int16_t)); - AdjustTcamerapluss3Volume(data, output_data, samples, (float)(volume_ / 100.0)); + for (size_t i = 0; i < samples; i++){ + output_data[i] = (float)data[i] * (float)(volume_ / 100.0); + } i2s_channel_write(tx_handle_, output_data, samples * sizeof(int16_t), &bytes_read, portMAX_DELAY); free(output_data); } diff --git a/main/boards/lilygo-t-circle-s3/README.md b/main/boards/lilygo-t-circle-s3/README.md new file mode 100644 index 0000000..6b7b678 --- /dev/null +++ b/main/boards/lilygo-t-circle-s3/README.md @@ -0,0 +1,28 @@ +# 编译配置命令 + +**配置编译目标为 ESP32S3:** + +```bash +idf.py set-target esp32s3 +``` + +**打开 menuconfig:** + +```bash +idf.py menuconfig +``` + +**选择板子:** + +``` +Xiaozhi Assistant -> Board Type -> LILYGO T-Circle-S3 +``` + + +**编译:** + +```bash +idf.py build +``` + +LILYGO T-Circle-S3 \ No newline at end of file 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 c53404a..99ab83a 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 @@ -4,6 +4,7 @@ #include "application.h" #include "button.h" #include "config.h" +#include "power_save_timer.h" #include "i2c_device.h" #include "iot/thing_manager.h" @@ -59,6 +60,25 @@ private: Cst816x *cst816d_; LcdDisplay *display_; Button boot_button_; + PowerSaveTimer* power_save_timer_; + + void InitializePowerSaveTimer() { + power_save_timer_ = new PowerSaveTimer(-1, 60, 300); + power_save_timer_->OnEnterSleepMode([this]() { + ESP_LOGI(TAG, "Enabling sleep mode"); + auto display = GetDisplay(); + display->SetChatMessage("system", ""); + display->SetEmotion("sleepy"); + GetBacklight()->SetBrightness(10); + }); + power_save_timer_->OnExitSleepMode([this]() { + auto display = GetDisplay(); + display->SetChatMessage("system", ""); + display->SetEmotion("neutral"); + GetBacklight()->RestoreBrightness(); + }); + power_save_timer_->SetEnabled(true); + } void InitI2c(){ // Initialize I2C peripheral @@ -197,6 +217,7 @@ private: if (app.GetDeviceState() == kDeviceStateStarting && !WifiStation::GetInstance().IsConnected()) { ResetWifiConfiguration(); } + power_save_timer_->WakeUp(); app.ToggleChatState(); }); } @@ -205,10 +226,12 @@ private: void InitializeIot() { auto &thing_manager = iot::ThingManager::GetInstance(); thing_manager.AddThing(iot::CreateThing("Speaker")); + thing_manager.AddThing(iot::CreateThing("Backlight")); } public: LilygoTCircleS3Board() : boot_button_(BOOT_BUTTON_GPIO) { + InitializePowerSaveTimer(); InitI2c(); InitCst816d(); I2cDetect(); @@ -236,6 +259,13 @@ public: virtual Display *GetDisplay() override{ return display_; } + + virtual void SetPowerSaveMode(bool enabled) override { + if (!enabled) { + power_save_timer_->WakeUp(); + } + WifiBoard::SetPowerSaveMode(enabled); + } virtual Backlight* GetBacklight() override { static PwmBacklight backlight(DISPLAY_BACKLIGHT_PIN, DISPLAY_BACKLIGHT_OUTPUT_INVERT); diff --git a/main/boards/lilygo-t-circle-s3/tcircles3_audio_codec.cc b/main/boards/lilygo-t-circle-s3/tcircles3_audio_codec.cc index 0b49959..68db1cb 100644 --- a/main/boards/lilygo-t-circle-s3/tcircles3_audio_codec.cc +++ b/main/boards/lilygo-t-circle-s3/tcircles3_audio_codec.cc @@ -132,17 +132,13 @@ int Tcircles3AudioCodec::Read(int16_t *dest, int samples){ return samples; } -void AdjustTcircles3Volume(const int16_t *input_data, int16_t *output_data, size_t samples, float volume){ - for (size_t i = 0; i < samples; i++){ - output_data[i] = (float)input_data[i] * volume; - } -} - int Tcircles3AudioCodec::Write(const int16_t *data, int samples){ if (output_enabled_){ size_t bytes_read; auto output_data = (int16_t *)malloc(samples * sizeof(int16_t)); - AdjustTcircles3Volume(data, output_data, samples, (float)(volume_ / 100.0)); + for (size_t i = 0; i < samples; i++){ + output_data[i] = (float)data[i] * (float)(volume_ / 100.0); + } i2s_channel_write(tx_handle_, output_data, samples * sizeof(int16_t), &bytes_read, portMAX_DELAY); free(output_data); }