v1.8.0: Audio 代码重构与低功耗优化 (#943)

* Reconstruct Audio Code

* Remove old IoT implementation

* Add MQTT-UDP documentation

* OTA升级失败时,可以继续使用
This commit is contained in:
Xiaoxia
2025-07-19 22:45:22 +08:00
committed by GitHub
parent 0621578f55
commit 3c71558a5f
173 changed files with 2099 additions and 3265 deletions

View File

@ -118,12 +118,12 @@ mkdir main/boards/my-custom-board
```cpp
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "mcp_server.h"
#include <esp_log.h>
#include <driver/i2c_master.h>
@ -220,12 +220,9 @@ private:
});
}
// IoT设备初始化
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
// 可以添加更多IoT设备
// MCP Tools 初始化
void InitializeTools() {
// 参考 MCP 文档
}
public:
@ -235,7 +232,7 @@ public:
InitializeSpi();
InitializeDisplay();
InitializeButtons();
InitializeIot();
InitializeTools();
GetBacklight()->SetBrightness(100);
}

View File

@ -1,13 +1,11 @@
#include "wifi_board.h"
#include "audio_codec.h"
#include "es8311_audio_codec.h"
#include "no_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "led/single_led.h"
#include "iot/thing_manager.h"
#include "i2c_device.h"
#include <wifi_station.h>
@ -25,6 +23,68 @@
LV_FONT_DECLARE(font_puhui_20_4);
LV_FONT_DECLARE(font_awesome_20_4);
class ATK_NoAudioCodecDuplex : public NoAudioCodec {
public:
ATK_NoAudioCodecDuplex(int input_sample_rate, int output_sample_rate, gpio_num_t bclk, gpio_num_t ws, gpio_num_t dout, gpio_num_t din) {
duplex_ = true;
input_sample_rate_ = input_sample_rate;
output_sample_rate_ = output_sample_rate;
i2s_chan_config_t chan_cfg = {
.id = I2S_NUM_0,
.role = I2S_ROLE_MASTER,
.dma_desc_num = AUDIO_CODEC_DMA_DESC_NUM,
.dma_frame_num = AUDIO_CODEC_DMA_FRAME_NUM,
.auto_clear_after_cb = true,
.auto_clear_before_cb = false,
.intr_priority = 0,
};
ESP_ERROR_CHECK(i2s_new_channel(&chan_cfg, &tx_handle_, &rx_handle_));
i2s_std_config_t std_cfg = {
.clk_cfg = {
.sample_rate_hz = (uint32_t)output_sample_rate_,
.clk_src = I2S_CLK_SRC_DEFAULT,
.mclk_multiple = I2S_MCLK_MULTIPLE_256,
#ifdef I2S_HW_VERSION_2
.ext_clk_freq_hz = 0,
#endif
},
.slot_cfg = {
.data_bit_width = I2S_DATA_BIT_WIDTH_16BIT,
.slot_bit_width = I2S_SLOT_BIT_WIDTH_AUTO,
.slot_mode = I2S_SLOT_MODE_STEREO,
.slot_mask = I2S_STD_SLOT_BOTH,
.ws_width = I2S_DATA_BIT_WIDTH_16BIT,
.ws_pol = false,
.bit_shift = true,
#ifdef I2S_HW_VERSION_2
.left_align = true,
.big_endian = false,
.bit_order_lsb = false
#endif
},
.gpio_cfg = {
.mclk = I2S_GPIO_UNUSED,
.bclk = bclk,
.ws = ws,
.dout = dout,
.din = din,
.invert_flags = {
.mclk_inv = false,
.bclk_inv = false,
.ws_inv = false
}
}
};
ESP_ERROR_CHECK(i2s_channel_init_std_mode(tx_handle_, &std_cfg));
ESP_ERROR_CHECK(i2s_channel_init_std_mode(rx_handle_, &std_cfg));
ESP_LOGI(TAG, "Duplex channels created");
}
};
class XL9555_IN : public I2cDevice {
public:
XL9555_IN(i2c_master_bus_handle_t i2c_bus, uint8_t addr) : I2cDevice(i2c_bus, addr) {
@ -205,13 +265,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
atk_dnesp32s3_box() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c();
@ -219,7 +272,6 @@ public:
xl9555_in_->SetOutputState(5, 1);
xl9555_in_->SetOutputState(7, 1);
InitializeButtons();
InitializeIot();
}
virtual AudioCodec* GetAudioCodec() override {

View File

@ -1,12 +1,11 @@
#include "wifi_board.h"
#include "es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "power_save_timer.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
#include "power_manager.h"
@ -336,14 +335,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
atk_dnesp32s3_box0() :
right_button_(R_BUTTON_GPIO, false),
@ -356,7 +347,6 @@ public:
InitializeSpi();
InitializeSt7789Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "es8388_audio_codec.h"
#include "codecs/es8388_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "esp32_camera.h"
@ -144,13 +143,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
// 初始化摄像头ov2640
// 根据正点原子官方示例参数
void InitializeCamera() {
@ -214,7 +206,6 @@ public:
InitializeSpi();
InitializeSt7789Display();
InitializeButtons();
InitializeIot();
InitializeCamera();
}

View File

@ -1,12 +1,11 @@
#include "ml307_board.h"
#include "es8388_audio_codec.h"
#include "codecs/es8388_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "driver/gpio.h"
#include "assets/lang_config.h"
@ -176,13 +175,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
atk_dnesp32s3m_4g() : Ml307Board(Module_4G_TX_PIN, Module_4G_RX_PIN),
boot_button_(BOOT_BUTTON_GPIO),
@ -193,7 +185,6 @@ public:
InitializeSpi();
InitializeSt7735Display();
InitializeButtons();
InitializeIot();
if (DISPLAY_BACKLIGHT_PIN != GPIO_NUM_NC) {
GetBacklight()->RestoreBrightness();
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "es8388_audio_codec.h"
#include "codecs/es8388_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "driver/gpio.h"
#include "assets/lang_config.h"
@ -186,13 +185,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
atk_dnesp32s3m_wifi() :
boot_button_(BOOT_BUTTON_GPIO),
@ -203,7 +195,6 @@ public:
InitializeSpi();
InitializeSt7735Display();
InitializeButtons();
InitializeIot();
if (DISPLAY_BACKLIGHT_PIN != GPIO_NUM_NC) {
GetBacklight()->RestoreBrightness();
}

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include <driver/i2c_master.h>
@ -101,19 +100,12 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
}
public:
AtomMatrixEchoBaseBoard() : face_button_(BOOT_BUTTON_GPIO) {
InitializeI2c();
I2cDetect();
InitializePi4ioe();
InitializeButtons();
InitializeIot();
}
virtual Led* GetLed() override {

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "assets/lang_config.h"
#include <esp_log.h>
@ -197,13 +196,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
AtomS3EchoBaseBoard() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c();
@ -212,7 +204,6 @@ public:
InitializeSpi();
InitializeGc9107Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "assets/lang_config.h"
#include <esp_log.h>
@ -157,12 +156,6 @@ private:
camera_->SetHMirror(false);
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
}
virtual Camera* GetCamera() override {
return camera_;
}
@ -174,7 +167,6 @@ public:
I2cDetect();
CheckEchoBaseConnection();
InitializePi4ioe();
InitializeIot();
}
virtual AudioCodec* GetAudioCodec() override {

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "assets/lang_config.h"
#include <esp_log.h>
@ -273,13 +272,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
AtomS3rEchoBaseBoard() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c();
@ -290,7 +282,6 @@ public:
InitializeSpi();
InitializeGc9107Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include <wifi_station.h>
@ -173,22 +172,12 @@ private:
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
if (DISPLAY_BACKLIGHT_PIN != GPIO_NUM_NC) {
thing_manager.AddThing(iot::CreateThing("Screen"));
}
}
public:
CompactWifiBoardLCD() :
boot_button_(BOOT_BUTTON_GPIO), touch_button_(TOUCH_BUTTON_GPIO), asr_button_(ASR_BUTTON_GPIO) {
InitializeSpi();
InitializeLcdDisplay();
InitializeButtons();
InitializeIot();
if (DISPLAY_BACKLIGHT_PIN != GPIO_NUM_NC) {
GetBacklight()->RestoreBrightness();
}

View File

@ -1,12 +1,11 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "mcp_server.h"
#include "lamp_controller.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "display/oled_display.h"
@ -134,14 +133,8 @@ private:
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Lamp"));
#elif CONFIG_IOT_PROTOCOL_MCP
void InitializeTools() {
static LampController lamp(LAMP_GPIO);
#endif
}
public:
@ -150,7 +143,7 @@ public:
InitializeDisplayI2c();
InitializeSsd1306Display();
InitializeButtons();
InitializeIot();
InitializeTools();
}
virtual AudioCodec* GetAudioCodec() override

View File

@ -1,5 +1,5 @@
#include "dual_network_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/oled_display.h"
#include "system_reset.h"
#include "application.h"
@ -7,7 +7,6 @@
#include "config.h"
#include "mcp_server.h"
#include "lamp_controller.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
@ -155,14 +154,8 @@ private:
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Lamp"));
#elif CONFIG_IOT_PROTOCOL_MCP
void InitializeTools() {
static LampController lamp(LAMP_GPIO);
#endif
}
public:
@ -175,7 +168,7 @@ public:
InitializeDisplayI2c();
InitializeSsd1306Display();
InitializeButtons();
InitializeIot();
InitializeTools();
}
virtual Led* GetLed() override {

View File

@ -1,5 +1,5 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
@ -7,7 +7,6 @@
#include "config.h"
#include "mcp_server.h"
#include "lamp_controller.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include <wifi_station.h>
@ -150,15 +149,8 @@ private:
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Lamp"));
#elif CONFIG_IOT_PROTOCOL_MCP
void InitializeTools() {
static LampController lamp(LAMP_GPIO);
#endif
}
public:
@ -167,7 +159,7 @@ public:
InitializeSpi();
InitializeLcdDisplay();
InitializeButtons();
InitializeIot();
InitializeTools();
if (DISPLAY_BACKLIGHT_PIN != GPIO_NUM_NC) {
GetBacklight()->RestoreBrightness();
}

View File

@ -1,5 +1,5 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
@ -7,7 +7,6 @@
#include "config.h"
#include "mcp_server.h"
#include "lamp_controller.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "esp32_camera.h"
@ -179,24 +178,12 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
#elif CONFIG_IOT_PROTOCOL_MCP
#endif
}
public:
CompactWifiBoardS3Cam() :
boot_button_(BOOT_BUTTON_GPIO) {
InitializeSpi();
InitializeLcdDisplay();
InitializeButtons();
InitializeIot();
InitializeCamera();
if (DISPLAY_BACKLIGHT_PIN != GPIO_NUM_NC) {
GetBacklight()->RestoreBrightness();

View File

@ -1,5 +1,5 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/oled_display.h"
#include "system_reset.h"
#include "application.h"
@ -7,7 +7,6 @@
#include "config.h"
#include "mcp_server.h"
#include "lamp_controller.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
@ -153,14 +152,8 @@ private:
}
// 物联网初始化,逐步迁移到 MCP 协议
void InitializeIot() {
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Lamp"));
#elif CONFIG_IOT_PROTOCOL_MCP
void InitializeTools() {
static LampController lamp(LAMP_GPIO);
#endif
}
public:
@ -172,7 +165,7 @@ public:
InitializeDisplayI2c();
InitializeSsd1306Display();
InitializeButtons();
InitializeIot();
InitializeTools();
}
virtual Led* GetLed() override {

View File

@ -0,0 +1,81 @@
#include "adc_battery_monitor.h"
AdcBatteryMonitor::AdcBatteryMonitor(adc_unit_t adc_unit, adc_channel_t adc_channel, float upper_resistor, float lower_resistor, gpio_num_t charging_pin)
: charging_pin_(charging_pin) {
// Initialize charging pin
gpio_config_t gpio_cfg = {
.pin_bit_mask = 1ULL << charging_pin,
.mode = GPIO_MODE_INPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
ESP_ERROR_CHECK(gpio_config(&gpio_cfg));
// Initialize ADC battery estimation
adc_battery_estimation_t adc_cfg = {
.internal = {
.adc_unit = adc_unit,
.adc_bitwidth = ADC_BITWIDTH_12,
.adc_atten = ADC_ATTEN_DB_12,
},
.adc_channel = adc_channel,
.upper_resistor = upper_resistor,
.lower_resistor = lower_resistor
};
adc_cfg.charging_detect_cb = [](void *user_data) -> bool {
AdcBatteryMonitor *self = (AdcBatteryMonitor *)user_data;
return gpio_get_level(self->charging_pin_) == 1;
};
adc_cfg.charging_detect_user_data = this;
adc_battery_estimation_handle_ = adc_battery_estimation_create(&adc_cfg);
// Initialize timer
esp_timer_create_args_t timer_cfg = {
.callback = [](void *arg) {
AdcBatteryMonitor *self = (AdcBatteryMonitor *)arg;
self->CheckBatteryStatus();
},
.arg = this,
.name = "adc_battery_monitor",
};
ESP_ERROR_CHECK(esp_timer_create(&timer_cfg, &timer_handle_));
ESP_ERROR_CHECK(esp_timer_start_periodic(timer_handle_, 1000000));
}
AdcBatteryMonitor::~AdcBatteryMonitor() {
if (adc_battery_estimation_handle_) {
ESP_ERROR_CHECK(adc_battery_estimation_destroy(adc_battery_estimation_handle_));
}
}
bool AdcBatteryMonitor::IsCharging() {
bool is_charging = false;
ESP_ERROR_CHECK(adc_battery_estimation_get_charging_state(adc_battery_estimation_handle_, &is_charging));
return is_charging;
}
bool AdcBatteryMonitor::IsDischarging() {
return !IsCharging();
}
uint8_t AdcBatteryMonitor::GetBatteryLevel() {
float capacity = 0;
ESP_ERROR_CHECK(adc_battery_estimation_get_capacity(adc_battery_estimation_handle_, &capacity));
return capacity;
}
void AdcBatteryMonitor::OnChargingStatusChanged(std::function<void(bool)> callback) {
on_charging_status_changed_ = callback;
}
void AdcBatteryMonitor::CheckBatteryStatus() {
bool new_charging_status = IsCharging();
if (new_charging_status != is_charging_) {
is_charging_ = new_charging_status;
if (on_charging_status_changed_) {
on_charging_status_changed_(is_charging_);
}
}
}

View File

@ -0,0 +1,30 @@
#ifndef ADC_BATTERY_MONITOR_H
#define ADC_BATTERY_MONITOR_H
#include <functional>
#include <driver/gpio.h>
#include <adc_battery_estimation.h>
#include <esp_timer.h>
class AdcBatteryMonitor {
public:
AdcBatteryMonitor(adc_unit_t adc_unit, adc_channel_t adc_channel, float upper_resistor, float lower_resistor, gpio_num_t charging_pin = GPIO_NUM_NC);
~AdcBatteryMonitor();
bool IsCharging();
bool IsDischarging();
uint8_t GetBatteryLevel();
void OnChargingStatusChanged(std::function<void(bool)> callback);
private:
gpio_num_t charging_pin_;
adc_battery_estimation_handle_t adc_battery_estimation_handle_ = nullptr;
esp_timer_handle_t timer_handle_ = nullptr;
bool is_charging_ = false;
std::function<void(bool)> on_charging_status_changed_;
void CheckBatteryStatus();
};
#endif // ADC_BATTERY_MONITOR_H

View File

@ -29,7 +29,7 @@ namespace audio_wifi_config
continue;
}
if (!app->ReadAudio(audio_data, 16000, 480)) { // 16kHz, 480 samples corresponds to 30ms data
if (!app->GetAudioService().ReadAudioData(audio_data, 16000, 480)) { // 16kHz, 480 samples corresponds to 30ms data
// 读取音频失败,短暂延迟后重试
ESP_LOGI(kLogTag, "Failed to read audio data, retrying.");
vTaskDelay(pdMS_TO_TICKS(10));

View File

@ -18,7 +18,7 @@ AdcButton::AdcButton(const button_adc_config_t& adc_config) : Button(nullptr) {
Button::Button(button_handle_t button_handle) : button_handle_(button_handle) {
}
Button::Button(gpio_num_t gpio_num, bool active_high, uint16_t long_press_time, uint16_t short_press_time) : gpio_num_(gpio_num) {
Button::Button(gpio_num_t gpio_num, bool active_high, uint16_t long_press_time, uint16_t short_press_time, bool enable_power_save) : gpio_num_(gpio_num) {
if (gpio_num == GPIO_NUM_NC) {
return;
}
@ -29,7 +29,7 @@ Button::Button(gpio_num_t gpio_num, bool active_high, uint16_t long_press_time,
button_gpio_config_t gpio_config = {
.gpio_num = gpio_num,
.active_level = static_cast<uint8_t>(active_high ? 1 : 0),
.enable_power_save = false,
.enable_power_save = enable_power_save,
.disable_pull = false
};
ESP_ERROR_CHECK(iot_button_new_gpio_device(&button_config, &gpio_config, &button_handle_));

View File

@ -11,7 +11,7 @@
class Button {
public:
Button(button_handle_t button_handle);
Button(gpio_num_t gpio_num, bool active_high = false, uint16_t long_press_time = 0, uint16_t short_press_time = 0);
Button(gpio_num_t gpio_num, bool active_high = false, uint16_t long_press_time = 0, uint16_t short_press_time = 0, bool enable_power_save = false);
~Button();
void OnPressDown(std::function<void()> callback);
@ -40,4 +40,10 @@ public:
};
#endif
class PowerSaveButton : public Button {
public:
PowerSaveButton(gpio_num_t gpio_num) : Button(gpio_num, false, 0, 0, true) {
}
};
#endif // BUTTON_H_

View File

@ -66,12 +66,6 @@ void Ml307Board::StartNetwork() {
ESP_LOGI(TAG, "ML307 Revision: %s", module_revision.c_str());
ESP_LOGI(TAG, "ML307 IMEI: %s", imei.c_str());
ESP_LOGI(TAG, "ML307 ICCID: %s", iccid.c_str());
// Close all previous connections
modem_->ResetConnections();
// Enable sleep mode
modem_->SetSleepMode(true, 30);
}
NetworkInterface* Ml307Board::GetNetwork() {

View File

@ -0,0 +1,114 @@
#include "sleep_timer.h"
#include "application.h"
#include "board.h"
#include "display.h"
#include <esp_log.h>
#include <esp_sleep.h>
#include <esp_lvgl_port.h>
#define TAG "SleepTimer"
SleepTimer::SleepTimer(int seconds_to_light_sleep, int seconds_to_deep_sleep)
: seconds_to_light_sleep_(seconds_to_light_sleep), seconds_to_deep_sleep_(seconds_to_deep_sleep) {
esp_timer_create_args_t timer_args = {
.callback = [](void* arg) {
auto self = static_cast<SleepTimer*>(arg);
self->CheckTimer();
},
.arg = this,
.dispatch_method = ESP_TIMER_TASK,
.name = "sleep_timer",
.skip_unhandled_events = true,
};
ESP_ERROR_CHECK(esp_timer_create(&timer_args, &sleep_timer_));
}
SleepTimer::~SleepTimer() {
esp_timer_stop(sleep_timer_);
esp_timer_delete(sleep_timer_);
}
void SleepTimer::SetEnabled(bool enabled) {
if (enabled && !enabled_) {
ticks_ = 0;
enabled_ = enabled;
ESP_ERROR_CHECK(esp_timer_start_periodic(sleep_timer_, 1000000));
ESP_LOGI(TAG, "Sleep timer enabled");
} else if (!enabled && enabled_) {
ESP_ERROR_CHECK(esp_timer_stop(sleep_timer_));
enabled_ = enabled;
WakeUp();
ESP_LOGI(TAG, "Sleep timer disabled");
}
}
void SleepTimer::OnEnterLightSleepMode(std::function<void()> callback) {
on_enter_light_sleep_mode_ = callback;
}
void SleepTimer::OnExitLightSleepMode(std::function<void()> callback) {
on_exit_light_sleep_mode_ = callback;
}
void SleepTimer::OnEnterDeepSleepMode(std::function<void()> callback) {
on_enter_deep_sleep_mode_ = callback;
}
void SleepTimer::CheckTimer() {
auto& app = Application::GetInstance();
if (!app.CanEnterSleepMode()) {
ticks_ = 0;
return;
}
ticks_++;
if (seconds_to_light_sleep_ != -1 && ticks_ >= seconds_to_light_sleep_) {
if (!in_light_sleep_mode_) {
in_light_sleep_mode_ = true;
if (on_enter_light_sleep_mode_) {
on_enter_light_sleep_mode_();
}
app.Schedule([this, &app]() {
while (in_light_sleep_mode_) {
auto& board = Board::GetInstance();
board.GetDisplay()->UpdateStatusBar(true);
lv_refr_now(nullptr);
lvgl_port_stop();
// 配置timer唤醒源30秒后自动唤醒
esp_sleep_enable_timer_wakeup(30 * 1000000);
// 进入light sleep模式
esp_light_sleep_start();
lvgl_port_resume();
auto wakeup_reason = esp_sleep_get_wakeup_cause();
if (wakeup_reason != ESP_SLEEP_WAKEUP_TIMER) {
break;
}
}
WakeUp();
});
}
}
if (seconds_to_deep_sleep_ != -1 && ticks_ >= seconds_to_deep_sleep_) {
if (on_enter_deep_sleep_mode_) {
on_enter_deep_sleep_mode_();
}
esp_deep_sleep_start();
}
}
void SleepTimer::WakeUp() {
ticks_ = 0;
if (in_light_sleep_mode_) {
in_light_sleep_mode_ = false;
if (on_exit_light_sleep_mode_) {
on_exit_light_sleep_mode_();
}
}
}

View File

@ -0,0 +1,32 @@
#pragma once
#include <functional>
#include <esp_timer.h>
#include <esp_pm.h>
class SleepTimer {
public:
SleepTimer(int seconds_to_light_sleep = 20, int seconds_to_deep_sleep = -1);
~SleepTimer();
void SetEnabled(bool enabled);
void OnEnterLightSleepMode(std::function<void()> callback);
void OnExitLightSleepMode(std::function<void()> callback);
void OnEnterDeepSleepMode(std::function<void()> callback);
void WakeUp();
private:
void CheckTimer();
esp_timer_handle_t sleep_timer_ = nullptr;
bool enabled_ = false;
int ticks_ = 0;
int seconds_to_light_sleep_;
int seconds_to_deep_sleep_;
bool in_light_sleep_mode_ = false;
std::function<void()> on_enter_light_sleep_mode_;
std::function<void()> on_exit_light_sleep_mode_;
std::function<void()> on_enter_deep_sleep_mode_;
};

View File

@ -4,8 +4,7 @@
{
"name": "df-k10",
"sdkconfig_append": [
"CONFIG_SPIRAM_MODE_OCT=y",
"CONFIG_IOT_PROTOCOL_MCP=y"
"CONFIG_SPIRAM_MODE_OCT=y"
]
}
]

View File

@ -7,7 +7,6 @@
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "esp32_camera.h"
#include "led/circular_strip.h"
@ -258,11 +257,6 @@ public:
InitializeButtons();
InitializeIot();
InitializeCamera();
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
#endif
}
virtual Led* GetLed() override {

View File

@ -6,8 +6,7 @@
"sdkconfig_append": [
"CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=10",
"CONFIG_ESP_PHY_MAX_TX_POWER=10",
"CONFIG_SPIRAM_MODE_OCT=y",
"CONFIG_IOT_PROTOCOL_MCP=y"
"CONFIG_SPIRAM_MODE_OCT=y"
]
}
]

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "esp32_camera.h"
#include "led/gpio_led.h"
@ -30,12 +29,6 @@ class DfrobotEsp32S3AiCam : public WifiBoard {
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
}
void InitializeCamera() {
camera_config_t config = {};
config.ledc_channel = LEDC_CHANNEL_2; // LEDC通道选择 用于生成XCLK时钟 但是S3不用
@ -73,13 +66,7 @@ class DfrobotEsp32S3AiCam : public WifiBoard {
DfrobotEsp32S3AiCam() :
boot_button_(BOOT_BUTTON_GPIO) {
InitializeButtons();
InitializeIot();
InitializeCamera();
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
#endif
}
virtual Led* GetLed() override {

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/gpio_led.h"
#include <wifi_station.h>
#include <esp_log.h>
@ -100,12 +99,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
}
void InitializeGpio(gpio_num_t gpio_num_) {
gpio_config_t config = {
@ -128,7 +121,6 @@ public:
// 上拉io48 置高电平
InitializeGpio(GPIO_NUM_48);
InitializeButtons();
InitializeIot();
}
virtual Led* GetLed() override {

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "power_manager.h"
#include "power_save_timer.h"
@ -124,20 +123,11 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto &thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
DuChatX() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeSpi();
InitializeLcdDisplay();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
InitializePowerSaveTimer();
InitializePowerManager();

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "backlight.h"
#include <wifi_station.h>

View File

@ -2,7 +2,7 @@
"target": "esp32s3",
"builds": [
{
"name": "EchoEar",
"name": "echoear",
"sdkconfig_append": []
}
]

View File

@ -8,7 +8,7 @@
#include <wifi_station.h>
#include "application.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "button.h"
#include "config.h"
#include "display/lcd_display.h"

View File

@ -1,12 +1,11 @@
#include "wifi_board.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "display/lcd_display.h"
#include "esp_lcd_ili9341.h"
#include "font_awesome_symbols.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include <esp_lcd_panel_vendor.h>
@ -143,20 +142,12 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
EspBox3Board() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c();
InitializeSpi();
InitializeIli9341Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -6,7 +6,6 @@
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "assets/lang_config.h"
#include <esp_log.h>
@ -205,20 +204,12 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
EspBoxBoardLite() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c();
InitializeSpi();
InitializeIli9341Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,12 +1,11 @@
#include "wifi_board.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "display/lcd_display.h"
#include "esp_lcd_ili9341.h"
#include "font_awesome_symbols.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include <esp_lcd_panel_vendor.h>
@ -143,20 +142,12 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
EspBox3Board() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c();
InitializeSpi();
InitializeIli9341Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -28,7 +28,6 @@
"CONFIG_MMAP_FILE_NAME_LENGTH=25",
"CONFIG_ESP_CONSOLE_NONE=y",
"CONFIG_USE_ESP_WAKE_WORD=y",
"CONFIG_IOT_PROTOCOL_MCP=y",
"CONFIG_COMPILER_OPTIMIZATION_SIZE=y"
]
}

View File

@ -1,5 +1,5 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
@ -7,7 +7,6 @@
#include "pin_config.h"
#include "config.h"
#include "iot/thing_manager.h"
#include <wifi_station.h>
#include <esp_log.h>
@ -17,7 +16,6 @@
#include <esp_lcd_panel_ops.h>
#include <esp_lcd_panel_io_additions.h>
#include "audio_codecs/box_audio_codec.h"
#include "esp_io_expander_tca9554.h"
#define TAG "ESP_S3_LCD_EV_Board"
@ -175,17 +173,10 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
}
public:
ESP_S3_LCD_EV_Board() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeCodecI2c();
InitializeButtons();
InitializeIot();
InitializeRGB_GC9503V_Display();
}

View File

@ -1,5 +1,5 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "font_awesome_symbols.h"
#include "application.h"

View File

@ -1,9 +1,8 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "sdkconfig.h"
#include <wifi_station.h>
@ -162,13 +161,6 @@ private:
gpio_config(&io_conf_2);
}
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
void BlinkGreenFor5s() {
auto* led = static_cast<CircularStrip*>(GetLed());
if (!led) {
@ -201,7 +193,6 @@ public:
InitializeADC();
InitializeI2c();
InitializeButtons();
InitializeIot();
}
virtual Led* GetLed() override {

View File

@ -1,60 +0,0 @@
#include <freertos/FreeRTOS.h>
#include <freertos/timers.h>
#include <freertos/task.h>
#include <esp_log.h>
#include "board.h"
#include "boards/common/wifi_board.h"
#include "boards/esp32-cgc-144/config.h"
#include "iot/thing.h"
#include "audio_codec.h"
#define TAG "BoardControl"
namespace iot {
class BoardControl : public Thing {
public:
BoardControl() : Thing("BoardControl", "当前 AI 机器人管理和控制") {
// 修改音量调节
properties_.AddNumberProperty("volume", "当前音量值", [this]() -> int {
auto codec = Board::GetInstance().GetAudioCodec();
return codec->output_volume();
});
// 定义设备可以被远程执行的指令
#if defined(ESP32_CGC_144_lite)
methods_.AddMethod("SetVolume", "设置音量", ParameterList({
Parameter("volume", "0到100之间的整数", kValueTypeNumber, true)
}), [this](const ParameterList& parameters) {
auto codec = Board::GetInstance().GetAudioCodec();
// 获取传入的音量值
int volume = parameters["volume"].number();
// 限制音量值
if (volume > 66) {
volume = 66;
}
codec->SetOutputVolume(static_cast<uint8_t>(volume));
});
#else
methods_.AddMethod("SetVolume", "设置音量", ParameterList({
Parameter("volume", "0到100之间的整数", kValueTypeNumber, true)
}), [this](const ParameterList& parameters) {
auto codec = Board::GetInstance().GetAudioCodec();
// 获取传入的音量值
int volume = parameters["volume"].number();
// 限制音量值
if (volume > 100) {
volume = 100;
}
codec->SetOutputVolume(static_cast<uint8_t>(volume));
});
#endif
}
};
} // namespace iot
DECLARE_THING(BoardControl);

View File

@ -1,5 +1,5 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
@ -8,7 +8,6 @@
#include "power_save_timer.h"
#include "mcp_server.h"
#include "lamp_controller.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
@ -157,16 +156,8 @@ void InitializePowerManager() {
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("BoardControl"));
thing_manager.AddThing(iot::CreateThing("Battery"));
thing_manager.AddThing(iot::CreateThing("Lamp"));
#elif CONFIG_IOT_PROTOCOL_MCP
void InitializeTools() {
static LampController lamp(LAMP_GPIO);
#endif
}
public:
@ -177,7 +168,7 @@ public:
InitializeSpi();
InitializeSt7735Display();
InitializeButtons();
InitializeIot();
InitializeTools();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,5 +1,5 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
@ -7,7 +7,6 @@
#include "config.h"
#include "mcp_server.h"
#include "lamp_controller.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include <wifi_station.h>
@ -153,15 +152,8 @@ private:
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Lamp"));
#elif CONFIG_IOT_PROTOCOL_MCP
void InitializeTools() {
static LampController lamp(LAMP_GPIO);
#endif
}
public:
@ -170,7 +162,7 @@ public:
InitializeSpi();
InitializeLcdDisplay();
InitializeButtons();
InitializeIot();
InitializeTools();
GetBacklight()->RestoreBrightness();
}

View File

@ -3,7 +3,7 @@
#include "esp_lcd_sh8601.h"
#include "font_awesome_symbols.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "application.h"
#include "button.h"
#include "led/single_led.h"

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include "i2c_device.h"
@ -215,13 +214,6 @@ private:
}, this);
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
CustomBoard() {
InitializeI2c();
@ -229,7 +221,6 @@ public:
InitializeSpi();
InitializeSpd2010Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include "i2c_device.h"
@ -425,14 +424,6 @@ private:
}, this);
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
CustomBoard() {
InitializeI2c();
@ -440,7 +431,6 @@ public:
InitializeSpi();
Initializest77916Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include "i2c_device.h"
@ -374,13 +373,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
CustomBoard() :
boot_button_(BOOT_BUTTON_GPIO) {
@ -389,7 +381,6 @@ public:
InitializeSpi();
Initializest77916Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,5 +1,5 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include <esp_lcd_panel_vendor.h>
@ -269,12 +268,6 @@ private:
camera_ = new Esp32Camera(config);
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
}
public:
Esp32S3Korvo2V3Board() : boot_button_(BOOT_BUTTON_GPIO) {
@ -290,7 +283,6 @@ public:
#else
InitializeSt7789Display();
#endif
InitializeIot();
}
virtual AudioCodec* GetAudioCodec() override {

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include <esp_log.h>
@ -219,14 +218,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
GenJuTech_s3_1_54TFT() :
boot_button_(BOOT_BUTTON_GPIO),
@ -238,8 +229,7 @@ public:
InitializeCodecI2c();
InitializeSpi();
InitializeButtons();
InitializeSt7789Display();
InitializeIot();
InitializeSt7789Display();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include <esp_lcd_panel_vendor.h>
@ -232,25 +231,18 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
JiuchuanDevBoard() :
boot_button_(BOOT_BUTTON_GPIO),
pwr_button_(PWR_BUTTON_GPIO,true),
wifi_button(WIFI_BUTTON_GPIO),
cmd_button(CMD_BUTTON_GPIO) {
boot_button_(BOOT_BUTTON_GPIO),
pwr_button_(PWR_BUTTON_GPIO,true),
wifi_button(WIFI_BUTTON_GPIO),
cmd_button(CMD_BUTTON_GPIO) {
InitializeI2c();
InitializePowerManager();
InitializePowerSaveTimer();
InitializeButtons();
InitializeGC9301isplay();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,10 +1,9 @@
#include "ml307_board.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "display/oled_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
@ -176,12 +175,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
}
public:
KevinBoxBoard() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN),
boot_button_(BOOT_BUTTON_GPIO),
@ -194,7 +187,6 @@ public:
Enable4GModule();
InitializeButtons();
InitializeIot();
}
virtual Led* GetLed() override {

View File

@ -1,10 +1,9 @@
#include "dual_network_board.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "display/oled_display.h"
#include "application.h"
#include "button.h"
#include "led/single_led.h"
#include "iot/thing_manager.h"
#include "config.h"
#include "power_save_timer.h"
#include "axp2101.h"
@ -229,13 +228,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
KevinBoxBoard() : DualNetworkBoard(ML307_TX_PIN, ML307_RX_PIN),
boot_button_(BOOT_BUTTON_GPIO),
@ -250,7 +242,6 @@ public:
InitializeButtons();
InitializePowerSaveTimer();
InitializeIot();
}
virtual Led* GetLed() override {

View File

@ -1,5 +1,5 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "application.h"
#include "button.h"
#include "config.h"
@ -34,6 +34,14 @@ private:
},
};
ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &codec_i2c_bus_));
// Print I2C bus info
if (i2c_master_probe(codec_i2c_bus_, 0x18, 1000) != ESP_OK) {
while (true) {
ESP_LOGE(TAG, "Failed to probe I2C bus, please check if you have installed the correct firmware");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
}
void InitializeButtons() {
@ -52,19 +60,19 @@ private:
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
void InitializeTools() {
led_strip_ = new CircularStrip(BUILTIN_LED_GPIO, 8);
new LedStripControl(led_strip_);
}
public:
KevinBoxBoard() : boot_button_(BOOT_BUTTON_GPIO) {
// 把 ESP32C3 的 VDD SPI 引脚作为普通 GPIO 口使用
esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO);
KevinBoxBoard() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeCodecI2c();
InitializeButtons();
InitializeIot();
InitializeTools();
// 把 ESP32C3 的 VDD SPI 引脚作为普通 GPIO 口使用
esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO);
}
virtual Led* GetLed() override {

View File

@ -1,13 +1,12 @@
#include "wifi_board.h"
#include "ml307_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include <esp_log.h>
@ -126,13 +125,6 @@ private:
camera_ = new Esp32Camera(config);
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Lamp"));
}
public:
KEVIN_SP_V3Board() : boot_button_(BOOT_BUTTON_GPIO) {
@ -141,7 +133,6 @@ public:
InitializeButtons();
InitializeSt7789Display();
InitializeCamera();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include <esp_log.h>
@ -139,13 +138,6 @@ private:
camera_ = new Esp32Camera(config);
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Lamp"));
}
public:
KEVIN_SP_V4Board() : boot_button_(BOOT_BUTTON_GPIO) {
@ -155,7 +147,6 @@ public:
InitializeButtons();
InitializeSt7789Display();
InitializeCamera();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,12 +1,11 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "pin_config.h"
#include "config.h"
#include "iot/thing_manager.h"
#include <wifi_station.h>
#include <esp_log.h>
@ -143,18 +142,10 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
Yuying_313lcd() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeCodecI2c();
InitializeButtons();
InitializeIot();
InitializeRGB_GC9503V_Display();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "es8388_audio_codec.h"
#include "codecs/es8388_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include <esp_log.h>
@ -131,20 +130,12 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
labplus_ledong_v2() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c();
InitializeSpi();
InitializeJd9853Display();
InitializeButtons();
InitializeIot();
GetBacklight()->SetBrightness(100);
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "es8388_audio_codec.h"
#include "codecs/es8388_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include <esp_log.h>
@ -111,20 +110,12 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
mpython_v3() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c();
InitializeSpi();
InitializeSt7789Display();
InitializeButtons();
InitializeIot();
GetBacklight()->SetBrightness(100);
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include <esp_lcd_panel_vendor.h>
@ -100,20 +99,12 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
LichuangC3DevBoard() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeI2c();
InitializeSpi();
InitializeSt7789Display();
InitializeButtons();
InitializeIot();
GetBacklight()->SetBrightness(100);
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "esp32_camera.h"
#include <esp_log.h>
@ -249,11 +248,6 @@ public:
InitializeButtons();
InitializeCamera();
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
#endif
GetBacklight()->RestoreBrightness();
}

View File

@ -6,7 +6,6 @@
#include "config.h"
#include "power_save_timer.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "sy6970.h"
#include "pin_config.h"
#include "esp32_camera.h"
@ -277,6 +276,10 @@ private:
camera_->SetHMirror(1);
}
void InitializeTools() {
static IrFilterController irFilter(AP1511B_GPIO);
}
public:
LilygoTCameraPlusS3Board() : boot_button_(BOOT_BUTTON_GPIO), key1_button_(KEY1_BUTTON_GPIO) {
InitializePowerSaveTimer();
@ -288,14 +291,7 @@ public:
InitializeSt7789Display();
InitializeButtons();
InitializeCamera();
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto &thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
#elif CONFIG_IOT_PROTOCOL_MCP
static IrFilterController irFilter(AP1511B_GPIO);
#endif
InitializeTools();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,7 +1,7 @@
#ifndef _TCIRCLES3_AUDIO_CODEC_H
#define _TCIRCLES3_AUDIO_CODEC_H
#include "audio_codecs/audio_codec.h"
#include "audio_codec.h"
#include <esp_codec_dev.h>
#include <esp_codec_dev_defaults.h>

View File

@ -6,7 +6,6 @@
#include "config.h"
#include "power_save_timer.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include <driver/i2c_master.h>
@ -231,11 +230,6 @@ public:
InitSpi();
InitGc9d01nDisplay();
InitializeButtons();
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto &thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
#endif
GetBacklight()->RestoreBrightness();
}

View File

@ -1,7 +1,7 @@
#ifndef _TCIRCLES3_AUDIO_CODEC_H
#define _TCIRCLES3_AUDIO_CODEC_H
#include "audio_codecs/audio_codec.h"
#include "audio_codec.h"
#include <esp_codec_dev.h>
#include <esp_codec_dev_defaults.h>

View File

@ -6,7 +6,6 @@
#include "config.h"
#include "power_save_timer.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include <driver/i2c_master.h>
@ -256,11 +255,6 @@ public:
InitSpi();
InitSt7796Display();
InitializeButtons();
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto &thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
#endif
GetBacklight()->RestoreBrightness();
}

View File

@ -1,7 +1,7 @@
#ifndef _TDISPLAYS3PROMVSRLORA_AUDIO_CODEC_H
#define _TDISPLAYS3PROMVSRLORA_AUDIO_CODEC_H
#include "audio_codecs/audio_codec.h"
#include "audio_codec.h"
#include <esp_codec_dev.h>
#include <esp_codec_dev_defaults.h>

View File

@ -5,7 +5,6 @@
#include "config.h"
#include "power_save_timer.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "axp2101.h"
#include <esp_log.h>
@ -342,14 +341,6 @@ private:
camera_ = new Esp32Camera(config);
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
M5StackCoreS3Board() {
InitializePowerSaveTimer();
@ -360,7 +351,6 @@ public:
InitializeSpi();
InitializeIli9342Display();
InitializeCamera();
InitializeIot();
InitializeFt6336TouchPad();
GetBacklight()->RestoreBrightness();
}

View File

@ -7,7 +7,6 @@
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include "esp_lcd_mipi_dsi.h"
@ -278,13 +277,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
M5StackTab5Board() : boot_button_(BOOT_BUTTON_GPIO)
{
@ -294,7 +286,6 @@ public:
InitializeGt911TouchPad();
InitializeIli9881cDisplay();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "display/lcd_display.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "application.h"
#include "button.h"
#include "led/circular_strip.h"
#include "iot/thing_manager.h"
#include "config.h"
#include "font_awesome_symbols.h"
#include "assets/lang_config.h"
@ -225,13 +224,6 @@ private:
DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY);
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
magiclick_2p4() :
main_button_(MAIN_BUTTON_GPIO),
@ -244,7 +236,6 @@ public:
InitializeButtons();
InitializeSpi();
InitializeNv3023Display();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,10 +1,9 @@
#include "dual_network_board.h"
#include "display/lcd_display.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "application.h"
#include "button.h"
#include "led/circular_strip.h"
#include "iot/thing_manager.h"
#include "config.h"
#include "assets/lang_config.h"
#include "font_awesome_symbols.h"
@ -281,13 +280,6 @@ private:
DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY);
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
magiclick_2p5() : DualNetworkBoard(ML307_TX_PIN, ML307_RX_PIN, GPIO_NUM_NC, 0),
main_button_(MAIN_BUTTON_GPIO),
@ -301,7 +293,6 @@ public:
InitializeButtons();
InitializeSpi();
InitializeGc9107Display();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "display/lcd_display.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "application.h"
#include "button.h"
#include "led/single_led.h"
#include "iot/thing_manager.h"
#include "config.h"
#include "power_save_timer.h"
#include "font_awesome_symbols.h"
@ -139,6 +138,14 @@ private:
},
};
ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &codec_i2c_bus_));
// Print I2C bus info
if (i2c_master_probe(codec_i2c_bus_, 0x18, 1000) != ESP_OK) {
while (true) {
ESP_LOGE(TAG, "Failed to probe I2C bus, please check if you have installed the correct firmware");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
}
void InitializeButtons() {
@ -207,25 +214,17 @@ private:
DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY);
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
magiclick_c3_v2() : boot_button_(BOOT_BUTTON_GPIO) {
// 把 ESP32C3 的 VDD SPI 引脚作为普通 GPIO 口使用
esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO);
InitializeCodecI2c();
InitializeButtons();
InitializePowerSaveTimer();
InitializeSpi();
InitializeGc9107Display();
InitializeIot();
GetBacklight()->RestoreBrightness();
// 把 ESP32C3 的 VDD SPI 引脚作为普通 GPIO 口使用
esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO);
}
virtual Led* GetLed() override {

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "display/lcd_display.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "application.h"
#include "button.h"
#include "led/single_led.h"
#include "iot/thing_manager.h"
#include "config.h"
#include "power_save_timer.h"
#include "font_awesome_symbols.h"
@ -103,6 +102,14 @@ private:
},
};
ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &codec_i2c_bus_));
// Print I2C bus info
if (i2c_master_probe(codec_i2c_bus_, 0x18, 1000) != ESP_OK) {
while (true) {
ESP_LOGE(TAG, "Failed to probe I2C bus, please check if you have installed the correct firmware");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
}
void InitializeButtons() {
@ -165,25 +172,17 @@ private:
DISPLAY_WIDTH, DISPLAY_HEIGHT, DISPLAY_OFFSET_X, DISPLAY_OFFSET_Y, DISPLAY_MIRROR_X, DISPLAY_MIRROR_Y, DISPLAY_SWAP_XY);
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
magiclick_c3() : boot_button_(BOOT_BUTTON_GPIO) {
// 把 ESP32C3 的 VDD SPI 引脚作为普通 GPIO 口使用
esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO);
InitializeCodecI2c();
InitializeButtons();
InitializePowerSaveTimer();
InitializeSpi();
InitializeNv3023Display();
InitializeIot();
GetBacklight()->RestoreBrightness();
// 把 ESP32C3 的 VDD SPI 引脚作为普通 GPIO 口使用
esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO);
}
virtual Led* GetLed() override {

View File

@ -1,6 +1,6 @@
#include "dual_network_board.h"
//#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
@ -9,7 +9,6 @@
#include "power_save_timer.h"
#include "mcp_server.h"
#include "lamp_controller.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
#include "power_manager.h"
@ -196,16 +195,8 @@ private:
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
#if CONFIG_IOT_PROTOCOL_XIAOZHI
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Lamp"));
thing_manager.AddThing(iot::CreateThing("Battery"));
#elif CONFIG_IOT_PROTOCOL_MCP
void InitializeTools() {
static LampController lamp(LAMP_GPIO);
#endif
}
@ -219,7 +210,7 @@ public:
InitializeSpi();
InitializeLcdDisplay();
InitializeButtons();
InitializeIot();
InitializeTools();
if (DISPLAY_BACKLIGHT_PIN != GPIO_NUM_NC) {
GetBacklight()->RestoreBrightness();
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/es8374_audio_codec.h"
#include "codecs/es8374_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include "led/circular_strip.h"
#include "assets/lang_config.h"
@ -135,12 +134,6 @@ private:
});
}
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
MIXGO_NOVA() :
boot_button_(BOOT_BUTTON_GPIO),
@ -150,7 +143,6 @@ public:
InitializeSpi();
InitializeSt7789Display();
InitializeButtons();
InitializeIot();
if (DISPLAY_BACKLIGHT_PIN != GPIO_NUM_NC) {
GetBacklight()->RestoreBrightness();
}

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include <wifi_station.h>
@ -98,20 +97,12 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
MovecallCuicanESP32S3() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeCodecI2c();
InitializeSpi();
InitializeGc9a01Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include <wifi_station.h>
@ -124,20 +123,12 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
MovecallMojiESP32S3() : boot_button_(BOOT_BUTTON_GPIO) {
InitializeCodecI2c();
InitializeSpi();
InitializeGc9a01Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -7,11 +7,10 @@
#include <wifi_station.h>
#include "application.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "button.h"
#include "config.h"
#include "display/lcd_display.h"
#include "iot/thing_manager.h"
#include "lamp_controller.h"
#include "led/single_led.h"
#include "mcp_server.h"

View File

@ -8,7 +8,6 @@
#include "knob.h"
#include "config.h"
#include "led/single_led.h"
#include "iot/thing_manager.h"
#include "power_save_timer.h"
#include "sscma_camera.h"
@ -367,14 +366,6 @@ private:
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
uint16_t BatterygetVoltage(void) {
static bool initialized = false;
static adc_oneshot_unit_handle_t adc_handle;
@ -550,7 +541,6 @@ public:
Initializespd2010Display();
GetBacklight()->RestoreBrightness(); // 对于不带摄像头的版本InitializeCamera需要3s, 所以先恢复背光亮度
InitializeCamera();
InitializeIot();
}
virtual AudioCodec* GetAudioCodec() override {

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
#include <wifi_station.h>
@ -271,13 +270,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
Spotpear_ESP32_S3_1_28_BOX() : boot_button_(BOOT_BUTTON_GPIO) {
@ -292,7 +284,6 @@ public:
InitializeSpi();
InitializeGc9a01Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
#include <wifi_station.h>
@ -275,14 +274,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
Spotpear_esp32_s3_lcd_1_54() :boot_button_(BOOT_BUTTON_GPIO){
@ -298,7 +289,6 @@ public:
InitializePowerManager();
InitializeSt7789Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "i2c_device.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include <esp_efuse_table.h>
@ -50,6 +49,14 @@ private:
},
};
ESP_ERROR_CHECK(i2c_new_master_bus(&i2c_bus_cfg, &codec_i2c_bus_));
// Print I2C bus info
if (i2c_master_probe(codec_i2c_bus_, 0x18, 1000) != ESP_OK) {
while (true) {
ESP_LOGE(TAG, "Failed to probe I2C bus, please check if you have installed the correct firmware");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
}
void InitializePowerManager() {
@ -149,19 +156,8 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
SurferC3114TFT() : boot_button_(BOOT_BUTTON_GPIO) {
// 把 ESP32C3 的 VDD SPI 引脚作为普通 GPIO 口使用
esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO);
InitializePowerManager();
InitializePowerSaveTimer();
@ -169,9 +165,11 @@ public:
InitializeSpi();
InitializeSt7789Display();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
// 把 ESP32C3 的 VDD SPI 引脚作为普通 GPIO 口使用
esp_efuse_write_field_bit(ESP_EFUSE_VDD_SPI_AS_GPIO);
}
virtual AudioCodec* GetAudioCodec() override {

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "application.h"
#include "i2c_device.h"
#include "config.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include <driver/i2c_master.h>
@ -604,12 +603,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
void InitializeMute() {
gpio_reset_pin(AUDIO_MUTE_PIN);
/* Set the GPIO as a push/pull output */
@ -623,7 +616,6 @@ public:
InitializeCst816sTouchPad();
InitializeSpi();
Initializest77916Display();
InitializeIot();
InitializeMute();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,10 +1,9 @@
#include "ml307_board.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "display/oled_display.h"
#include "application.h"
#include "button.h"
#include "led/single_led.h"
#include "iot/thing_manager.h"
#include "config.h"
#include "power_save_timer.h"
#include "axp2101.h"
@ -224,13 +223,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
KevinBoxBoard() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN),
boot_button_(BOOT_BUTTON_GPIO),
@ -245,7 +237,6 @@ public:
InitializeButtons();
InitializePowerSaveTimer();
InitializeIot();
}
virtual Led* GetLed() override {

View File

@ -1,12 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include "i2c_device.h"
@ -150,15 +148,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
// thing_manager.AddThing(iot::CreateThing("Battery"));
// thing_manager.AddThing(iot::CreateThing("BoardControl"));
}
public:
CustomBoard() :
boot_button_(BOOT_BUTTON_GPIO) {
@ -166,7 +155,6 @@ public:
InitializeSpi();
InitializeLcdDisplay();
InitializeButtons();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -2,8 +2,7 @@
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include <esp_log.h>
#include <esp_lcd_panel_vendor.h>
@ -194,13 +193,6 @@ private:
});
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
void InitializeTouch() {
i2c_device_config_t dev_cfg =
{
@ -273,8 +265,6 @@ public:
InitializeLcdDisplay();
InitializeButtons();
InitializeTools();
//InitializeTouch();
//InitializeIot();
}
virtual AudioCodec* GetAudioCodec() override {

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "application.h"
#include "display/lcd_display.h"
// #include "display/no_display.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "esp_lcd_panel_ops.h"
#include "esp_lcd_mipi_dsi.h"
@ -210,18 +209,10 @@ private:
app.ToggleChatState(); });
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto &thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
WaveshareEsp32p4nano() :
boot_button_(BOOT_BUTTON_GPIO) {
InitializeCodecI2c();
InitializeIot();
InitializeLCD();
InitializeTouch();
InitializeButtons();

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "application.h"
#include "display/lcd_display.h"
// #include "display/no_display.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "esp_lcd_panel_ops.h"
#include "esp_lcd_mipi_dsi.h"
@ -163,18 +162,10 @@ private:
app.ToggleChatState(); });
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto &thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
WaveshareEsp32p44b() :
boot_button_(BOOT_BUTTON_GPIO) {
InitializeCodecI2c();
InitializeIot();
InitializeLCD();
InitializeTouch();
InitializeButtons();

View File

@ -1,10 +1,9 @@
#include "wifi_board.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "application.h"
#include "display/lcd_display.h"
// #include "display/no_display.h"
#include "button.h"
#include "iot/thing_manager.h"
#include "esp_lcd_panel_ops.h"
#include "esp_lcd_mipi_dsi.h"
@ -165,18 +164,10 @@ private:
app.ToggleChatState(); });
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto &thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
}
public:
WaveshareEsp32p4xc() :
boot_button_(BOOT_BUTTON_GPIO) {
InitializeCodecI2c();
InitializeIot();
InitializeLCD();
InitializeTouch();
InitializeButtons();

View File

@ -3,7 +3,7 @@
#include "esp_lcd_sh8601.h"
#include "font_awesome_symbols.h"
#include "audio_codecs/box_audio_codec.h"
#include "codecs/box_audio_codec.h"
#include "application.h"
#include "button.h"
#include "led/single_led.h"

View File

@ -1,12 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include <esp_log.h>
#include "i2c_device.h"
@ -332,18 +330,6 @@ private:
}
// 物联网初始化,添加对 AI 可见设备
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("BoardControl"));
#if PMIC_ENABLE
thing_manager.AddThing(iot::CreateThing("Battery"));
#endif
}
public:
CustomBoard() :
boot_button_(BOOT_BUTTON_GPIO) {
@ -362,7 +348,6 @@ public:
#endif
InitializeButtons();
InitializeCamera();
InitializeIot();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,12 +1,11 @@
#include "ml307_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "power_save_timer.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
#include "../xingzhi-cube-1.54tft-wifi/power_manager.h"
@ -186,13 +185,6 @@ private:
});
}
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
void Initializegpio21_45() {
rtc_gpio_init(GPIO_NUM_21);
rtc_gpio_set_direction(GPIO_NUM_21, RTC_GPIO_MODE_OUTPUT_ONLY);
@ -219,8 +211,7 @@ public:
InitializePowerSaveTimer();
InitializeSpi();
InitializeButtons();
InitializeNv3023Display();
InitializeIot();
InitializeNv3023Display();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,12 +1,11 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "power_save_timer.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
#include "../xingzhi-cube-1.54tft-wifi/power_manager.h"
@ -190,13 +189,6 @@ private:
});
}
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
void Initializegpio21_45() {
rtc_gpio_init(GPIO_NUM_21);
rtc_gpio_set_direction(GPIO_NUM_21, RTC_GPIO_MODE_OUTPUT_ONLY);
@ -223,8 +215,7 @@ public:
InitializePowerSaveTimer();
InitializeSpi();
InitializeButtons();
InitializeNv3023Display();
InitializeIot();
InitializeNv3023Display();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,12 +1,11 @@
#include "dual_network_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/oled_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "power_save_timer.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
#include "../xingzhi-cube-1.54tft-wifi/power_manager.h"
@ -195,12 +194,6 @@ private:
});
}
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
XINGZHI_CUBE_0_96OLED_ML307() : DualNetworkBoard(ML307_TX_PIN, ML307_RX_PIN),
boot_button_(BOOT_BUTTON_GPIO),
@ -211,7 +204,6 @@ public:
InitializeDisplayI2c();
InitializeSsd1306Display();
InitializeButtons();
InitializeIot();
}
virtual Led* GetLed() override {

View File

@ -1,11 +1,10 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/oled_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
#include "power_save_timer.h"
@ -186,12 +185,6 @@ private:
});
}
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
XINGZHI_CUBE_0_96OLED_WIFI() :
boot_button_(BOOT_BUTTON_GPIO),
@ -202,7 +195,6 @@ public:
InitializeDisplayI2c();
InitializeSsd1306Display();
InitializeButtons();
InitializeIot();
}
virtual Led* GetLed() override {

View File

@ -1,12 +1,11 @@
#include "dual_network_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "power_save_timer.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
#include "../xingzhi-cube-1.54tft-wifi/power_manager.h"
@ -177,13 +176,6 @@ private:
});
}
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
XINGZHI_CUBE_1_54TFT_ML307() :
DualNetworkBoard(ML307_TX_PIN, ML307_RX_PIN),
@ -194,8 +186,7 @@ public:
InitializePowerSaveTimer();
InitializeSpi();
InitializeButtons();
InitializeSt7789Display();
InitializeIot();
InitializeSt7789Display();
GetBacklight()->RestoreBrightness();
}

View File

@ -1,12 +1,11 @@
#include "wifi_board.h"
#include "audio_codecs/no_audio_codec.h"
#include "codecs/no_audio_codec.h"
#include "display/lcd_display.h"
#include "system_reset.h"
#include "application.h"
#include "button.h"
#include "config.h"
#include "power_save_timer.h"
#include "iot/thing_manager.h"
#include "led/single_led.h"
#include "assets/lang_config.h"
#include "power_manager.h"
@ -167,13 +166,6 @@ private:
});
}
void InitializeIot() {
auto& thing_manager = iot::ThingManager::GetInstance();
thing_manager.AddThing(iot::CreateThing("Speaker"));
thing_manager.AddThing(iot::CreateThing("Screen"));
thing_manager.AddThing(iot::CreateThing("Battery"));
}
public:
XINGZHI_CUBE_1_54TFT_WIFI() :
boot_button_(BOOT_BUTTON_GPIO),
@ -183,8 +175,7 @@ public:
InitializePowerSaveTimer();
InitializeSpi();
InitializeButtons();
InitializeSt7789Display();
InitializeIot();
InitializeSt7789Display();
GetBacklight()->RestoreBrightness();
}

View File

@ -0,0 +1,4 @@
# 开源地址
https://oshwhub.com/tenclass01/xmini_c3_4g

View File

@ -1,200 +0,0 @@
#pragma once
#include <vector>
#include <functional>
#include <esp_timer.h>
#include <driver/gpio.h>
#include <esp_adc/adc_oneshot.h>
#include <esp_adc/adc_cali.h>
#include <esp_adc/adc_cali_scheme.h>
class PowerManager {
private:
esp_timer_handle_t timer_handle_;
std::function<void(bool)> on_charging_status_changed_;
std::function<void(bool)> on_low_battery_status_changed_;
gpio_num_t charging_pin_ = GPIO_NUM_NC;
std::vector<uint16_t> voltages_;
uint32_t battery_level_ = 0;
bool is_charging_ = false;
bool is_low_battery_ = false;
int ticks_ = 0;
const int kBatteryAdcInterval = 1;
const int kBatteryAdcDataCount = 3;
const int kLowBatteryLevel = 20;
adc_oneshot_unit_handle_t adc_handle_;
adc_cali_handle_t adc_cali_handle_;
void CheckBatteryStatus() {
// Get charging status
bool new_charging_status = gpio_get_level(charging_pin_) == 1;
if (new_charging_status != is_charging_) {
is_charging_ = new_charging_status;
if (on_charging_status_changed_) {
on_charging_status_changed_(is_charging_);
}
ReadBatteryAdcData();
return;
}
// 如果电池电量数据不足,则读取电池电量数据
if (voltages_.size() < kBatteryAdcDataCount) {
ReadBatteryAdcData();
return;
}
// 如果电池电量数据充足,则每 kBatteryAdcInterval 个 tick 读取一次电池电量数据
ticks_++;
if (ticks_ % kBatteryAdcInterval == 0) {
ReadBatteryAdcData();
}
}
void ReadBatteryAdcData() {
int adc_value, voltage;
ESP_ERROR_CHECK(adc_oneshot_read(adc_handle_, ADC_CHANNEL_4, &adc_value));
if (adc_value == 0) {
return;
}
ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc_cali_handle_, adc_value, &voltage));
// 将 ADC 值添加到队列中
voltages_.push_back(voltage);
if (voltages_.size() > kBatteryAdcDataCount) {
voltages_.erase(voltages_.begin());
}
uint32_t average_voltage = 0;
for (auto value : voltages_) {
average_voltage += value;
}
average_voltage /= voltages_.size();
// 定义电池电量区间
const struct {
uint16_t adc;
uint8_t level;
} levels[] = {
{1600, 0},
{1700, 20},
{1800, 40},
{1900, 60},
{2000, 80},
{2100, 100}
};
// 低于最低值时
if (average_voltage < levels[0].adc) {
battery_level_ = 0;
}
// 高于最高值时
else if (average_voltage >= levels[5].adc) {
battery_level_ = 100;
} else {
// 线性插值计算中间值
for (int i = 0; i < 5; i++) {
if (average_voltage >= levels[i].adc && average_voltage < levels[i+1].adc) {
float ratio = static_cast<float>(average_voltage - levels[i].adc) / (levels[i+1].adc - levels[i].adc);
battery_level_ = levels[i].level + ratio * (levels[i+1].level - levels[i].level);
break;
}
}
}
// Check low battery status
if (voltages_.size() >= kBatteryAdcDataCount) {
bool new_low_battery_status = battery_level_ <= kLowBatteryLevel;
if (new_low_battery_status != is_low_battery_) {
is_low_battery_ = new_low_battery_status;
if (on_low_battery_status_changed_) {
on_low_battery_status_changed_(is_low_battery_);
}
}
}
}
public:
PowerManager(gpio_num_t pin) : charging_pin_(pin) {
// 初始化充电引脚
gpio_config_t io_conf = {};
io_conf.intr_type = GPIO_INTR_DISABLE;
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pin_bit_mask = (1ULL << charging_pin_);
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
gpio_config(&io_conf);
// 创建电池电量检查定时器
esp_timer_create_args_t timer_args = {
.callback = [](void* arg) {
PowerManager* self = static_cast<PowerManager*>(arg);
self->CheckBatteryStatus();
},
.arg = this,
.dispatch_method = ESP_TIMER_TASK,
.name = "battery_check_timer",
.skip_unhandled_events = true,
};
ESP_ERROR_CHECK(esp_timer_create(&timer_args, &timer_handle_));
ESP_ERROR_CHECK(esp_timer_start_periodic(timer_handle_, 1000000));
// 初始化 ADC
adc_oneshot_unit_init_cfg_t init_config = {
.unit_id = ADC_UNIT_1,
.ulp_mode = ADC_ULP_MODE_DISABLE,
};
ESP_ERROR_CHECK(adc_oneshot_new_unit(&init_config, &adc_handle_));
adc_oneshot_chan_cfg_t chan_config = {
.atten = ADC_ATTEN_DB_12,
.bitwidth = ADC_BITWIDTH_12,
};
ESP_ERROR_CHECK(adc_oneshot_config_channel(adc_handle_, ADC_CHANNEL_4, &chan_config));
adc_cali_curve_fitting_config_t cali_config = {
.unit_id = ADC_UNIT_1,
.atten = ADC_ATTEN_DB_12,
.bitwidth = ADC_BITWIDTH_12,
};
ESP_ERROR_CHECK(adc_cali_create_scheme_curve_fitting(&cali_config, &adc_cali_handle_));
}
~PowerManager() {
if (timer_handle_) {
esp_timer_stop(timer_handle_);
esp_timer_delete(timer_handle_);
}
if (adc_handle_) {
adc_oneshot_del_unit(adc_handle_);
}
}
bool IsCharging() {
// 如果电量已经满了,则不再显示充电中
if (battery_level_ == 100) {
return false;
}
return is_charging_;
}
bool IsDischarging() {
// 没有区分充电和放电,所以直接返回相反状态
return !is_charging_;
}
uint8_t GetBatteryLevel() {
return battery_level_;
}
void OnLowBatteryStatusChanged(std::function<void(bool)> callback) {
on_low_battery_status_changed_ = callback;
}
void OnChargingStatusChanged(std::function<void(bool)> callback) {
on_charging_status_changed_ = callback;
}
};

View File

@ -1,5 +1,5 @@
#include "ml307_board.h"
#include "audio_codecs/es8311_audio_codec.h"
#include "codecs/es8311_audio_codec.h"
#include "display/oled_display.h"
#include "application.h"
#include "button.h"
@ -7,9 +7,9 @@
#include "mcp_server.h"
#include "settings.h"
#include "config.h"
#include "power_save_timer.h"
#include "sleep_timer.h"
#include "font_awesome_symbols.h"
#include "power_manager.h"
#include "adc_battery_monitor.h"
#include <wifi_station.h>
#include <esp_log.h>
@ -32,44 +32,42 @@ private:
Display* display_ = nullptr;
Button boot_button_;
bool press_to_talk_enabled_ = false;
PowerSaveTimer* power_save_timer_ = nullptr;
PowerManager* power_manager_ = nullptr;
SleepTimer* sleep_timer_ = nullptr;
AdcBatteryMonitor* adc_battery_monitor_ = nullptr;
void InitializePowerManager() {
power_manager_ = new PowerManager(GPIO_NUM_12);
power_manager_->OnChargingStatusChanged([this](bool is_charging) {
void InitializeBatteryMonitor() {
adc_battery_monitor_ = new AdcBatteryMonitor(ADC_UNIT_1, ADC_CHANNEL_4, 100000, 100000, GPIO_NUM_12);
adc_battery_monitor_->OnChargingStatusChanged([this](bool is_charging) {
if (is_charging) {
power_save_timer_->SetEnabled(false);
sleep_timer_->SetEnabled(false);
} else {
power_save_timer_->SetEnabled(true);
sleep_timer_->SetEnabled(true);
}
});
}
void InitializePowerSaveTimer() {
#if CONFIG_USE_ESP_WAKE_WORD
power_save_timer_ = new PowerSaveTimer(160, 600);
sleep_timer_ = new SleepTimer(600);
#else
power_save_timer_ = new PowerSaveTimer(160, 60);
sleep_timer_ = new SleepTimer(30);
#endif
power_save_timer_->OnEnterSleepMode([this]() {
sleep_timer_->OnEnterLightSleepMode([this]() {
ESP_LOGI(TAG, "Enabling sleep mode");
auto display = GetDisplay();
display->SetChatMessage("system", "");
display->SetEmotion("sleepy");
auto codec = GetAudioCodec();
codec->EnableInput(false);
// Show the standby screen
GetDisplay()->ShowStandbyScreen(true);
// Enable sleep mode, and sleep in 1 second after DTR is set to high
modem_->SetSleepMode(true, 1);
// Set the DTR pin to high to make the modem enter sleep mode
modem_->GetAtUart()->SetDtrPin(true);
});
power_save_timer_->OnExitSleepMode([this]() {
auto codec = GetAudioCodec();
codec->EnableInput(true);
auto display = GetDisplay();
display->SetChatMessage("system", "");
display->SetEmotion("neutral");
sleep_timer_->OnExitLightSleepMode([this]() {
// Set the DTR pin to low to make the modem wake up
modem_->GetAtUart()->SetDtrPin(false);
// Hide the standby screen
GetDisplay()->ShowStandbyScreen(false);
});
power_save_timer_->SetEnabled(true);
sleep_timer_->SetEnabled(true);
}
void InitializeCodecI2c() {
@ -152,9 +150,6 @@ private:
}
});
boot_button_.OnPressDown([this]() {
if (power_save_timer_) {
power_save_timer_->WakeUp();
}
if (press_to_talk_enabled_) {
Application::GetInstance().StartListening();
}
@ -170,9 +165,6 @@ private:
Settings settings("vendor");
press_to_talk_enabled_ = settings.GetInt("press_to_talk", 0) != 0;
#if CONFIG_IOT_PROTOCOL_XIAOZHI
#error "XiaoZhi 协议不支持"
#elif CONFIG_IOT_PROTOCOL_MCP
auto& mcp_server = McpServer::GetInstance();
mcp_server.AddTool("self.set_press_to_talk",
"Switch between press to talk mode (长按说话) and click to talk mode (单击说话).\n"
@ -191,14 +183,13 @@ private:
}
throw std::runtime_error("Invalid mode: " + mode);
});
#endif
}
public:
XminiC3Board() : Ml307Board(ML307_TX_PIN, ML307_RX_PIN, ML307_DTR_PIN),
boot_button_(BOOT_BUTTON_GPIO) {
boot_button_(BOOT_BUTTON_GPIO, false, 0, 0, true) {
InitializePowerManager();
InitializeBatteryMonitor();
InitializePowerSaveTimer();
InitializeCodecI2c();
InitializeSsd1306Display();
@ -223,14 +214,9 @@ public:
}
virtual bool GetBatteryLevel(int& level, bool& charging, bool& discharging) override {
static bool last_discharging = false;
charging = power_manager_->IsCharging();
discharging = power_manager_->IsDischarging();
if (discharging != last_discharging) {
power_save_timer_->SetEnabled(discharging);
last_discharging = discharging;
}
level = power_manager_->GetBatteryLevel();
charging = adc_battery_monitor_->IsCharging();
discharging = adc_battery_monitor_->IsDischarging();
level = adc_battery_monitor_->GetBatteryLevel();
return true;
}
@ -248,7 +234,7 @@ public:
virtual void SetPowerSaveMode(bool enabled) override {
if (!enabled) {
power_save_timer_->WakeUp();
sleep_timer_->WakeUp();
}
Ml307Board::SetPowerSaveMode(enabled);
}

Some files were not shown because too many files have changed in this diff Show More