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);
}