Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added app/asset/cdian2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added app/asset/no_power2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion app/project/proj.conf
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
CONFIG_BSP_PWM3_CC1_USING_DMA=y
CONFIG_BSP_PWM3_UPDATE_USING_DMA=y
CONFIG_BSP_USING_ADC1=y
CONFIG_PSRAM_CACHE_WB=y
CONFIG_RGB_SK6812MINI_HS_ENABLE=y
Expand Down
1 change: 1 addition & 0 deletions app/src/board/sf32lb52-lchspi-ulp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ void set_pinmux()
BSP_GPIO_Set(30, 0, 1);
HAL_PIN_Set(PAD_PA39, GPIO_A39, PIN_PULLDOWN, 1);
HAL_PIN_Set(PAD_PA40, GPIO_A40, PIN_PULLDOWN, 1);
HAL_PIN_Set(PAD_PA34, GPIO_A34, PIN_NOPULL, 1);
}

HAL_RAM_RET_CODE_SECT(PowerDownCustom, void PowerDownCustom(void))
Expand Down
103 changes: 97 additions & 6 deletions app/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#include "bt_connection_manager.h"
#include "bt_env.h"
#include "ulog.h"

#include "drv_gpio.h"
/* Common functions for RT-Thread based platform
* -----------------------------------------------*/
/**
Expand Down Expand Up @@ -58,6 +58,7 @@
#define MAX_RECONNECT_ATTEMPTS 30 // 30次尝试,每次1秒,共30秒
#define XIAOZHI_UI_THREAD_STACK_SIZE (6144)
#define BATTERY_THREAD_STACK_SIZE (2048)
#define LOW_BATTERY_THRESHOLD 5

extern rt_tick_t last_listen_tick;
extern xiaozhi_ws_t g_xz_ws;
Expand All @@ -66,7 +67,7 @@ extern lv_obj_t *standby_screen;
extern lv_timer_t *ui_sleep_timer;
extern lv_obj_t *shutdown_screen;
extern lv_obj_t *sleep_screen;

extern rt_mailbox_t g_ui_task_mb;

bt_app_t g_bt_app_env;
rt_mailbox_t g_bt_app_mb;
Expand All @@ -75,6 +76,8 @@ BOOL first_pan_connected = FALSE;
int first_reconnect_attempts = 0;
uint8_t Initiate_disconnection_flag = 0;//蓝牙主动断开标志
rt_mailbox_t g_battery_mb;
bool g_skip_startup = true;
bool low_battery_shutdown_triggered = true;

static rt_timer_t s_reconnect_timer = NULL;
static rt_timer_t s_sleep_timer = NULL;
Expand All @@ -83,6 +86,8 @@ static uint8_t g_sleep_enter_flag = 0; // 进入睡眠标志位
// UI线程和battery线程控制块
static struct rt_thread xiaozhi_ui_thread;
static struct rt_thread battery_thread;


//ui线程
#if defined(__CC_ARM) || defined(__CLANG_ARM)
L2_RET_BSS_SECT_BEGIN(xiaozhi_ui_thread_stack) //6000地址
Expand Down Expand Up @@ -182,14 +187,15 @@ void HAL_MspInit(void)
BSP_IO_Init();
set_pinmux();
}

static void battery_level_task(void *parameter)
{
g_battery_mb = rt_mb_create("battery_level", 1, RT_IPC_FLAG_FIFO);
if (g_battery_mb == NULL)
{
rt_kprintf("Failed to create mailbox g_battery_mb\n");
return;
}
rt_uint8_t current_status;
while (1)
{
rt_device_t battery_device = rt_device_find("bat1");
Expand Down Expand Up @@ -224,7 +230,29 @@ static void battery_level_task(void *parameter)
}

rt_mb_send(g_battery_mb, battery_percentage);
rt_thread_mdelay(10000);
current_status = rt_pin_read(CHARGE_DETECT_PIN);
rt_kprintf("battery_percentage: %d, current_status: %d \n", battery_percentage, current_status);
//当电量低于阈值并且当前没有处于充电中并的时候
if (battery_percentage < LOW_BATTERY_THRESHOLD && low_battery_shutdown_triggered && !current_status)
{
lv_obj_t *now_screen = lv_screen_active();
rt_kprintf("now_screen address: %p, sleep_screen address: %p, standby_screen address: %p\n",
now_screen, sleep_screen, standby_screen);
low_battery_shutdown_triggered = false;
rt_kprintf("Low battery ,shutdown\n");
// 发送消息到UI线程显示低电量关机页面
if (g_ui_task_mb != RT_NULL)
{
if(now_screen == sleep_screen && now_screen != NULL)
{
gui_pm_fsm(GUI_PM_ACTION_WAKEUP); // 唤醒设备
}

rt_thread_mdelay(100);
rt_mb_send(g_ui_task_mb, UI_EVENT_LOW_BATTERY_SHUTDOWN);
}
}
rt_thread_mdelay(5000);
}
}

Expand Down Expand Up @@ -490,6 +518,7 @@ static int bt_app_interface_event_handle(uint16_t type, uint16_t event_id,
}
rt_mb_send(g_bt_app_mb, BT_APP_CONNECT_PAN_SUCCESS);
g_pan_connected = TRUE; // 更新PAN连接状态

}
break;
case BT_NOTIFY_PAN_PROFILE_DISCONNECTED:
Expand Down Expand Up @@ -585,6 +614,64 @@ static int32_t Write_MAC(int argc, char **argv)
}
MSH_CMD_EXPORT(Write_MAC, write mac);

void check_low_power(void)
{
rt_device_t battery_device = rt_device_find("bat1");
if (battery_device) {
rt_adc_cmd_read_arg_t read_arg;
read_arg.channel = 7;
rt_adc_enable((rt_adc_device_t)battery_device, read_arg.channel);
rt_uint32_t battery_level = rt_adc_read((rt_adc_device_t)battery_device, read_arg.channel);
rt_adc_disable((rt_adc_device_t)battery_device, read_arg.channel);

uint32_t battery_percentage = 0;
if (battery_level < 36000) {
battery_percentage = 0;
} else if (battery_level > 42000) {
battery_percentage = 100;
} else {
battery_percentage = ((battery_level - 36000) * 100) / (42000 - 36000);
}

// 检查充电状态
rt_pin_mode(44, PIN_MODE_INPUT);
uint8_t charge_status = rt_pin_read(44);

rt_kprintf("Boot battery check: %d%%, charging: %d\n", battery_percentage, charge_status);

// 如果低电量且未充电,进入低电量关机流程
if (battery_percentage < LOW_BATTERY_THRESHOLD && !charge_status)
{
g_skip_startup = false;
rt_kprintf("电量不足,进入低电量关机流程,当前电量为%d%%\n", battery_percentage);
xz_set_lcd_brightness(LCD_BRIGHTNESS_DEFAULT);
rt_err_t result = rt_thread_init(&xiaozhi_ui_thread,
"xz_ui",
xiaozhi_ui_task,
NULL,
&xiaozhi_ui_thread_stack[0],
XIAOZHI_UI_THREAD_STACK_SIZE,
30,
10);
if (result == RT_EOK) {
rt_thread_startup(&xiaozhi_ui_thread);
}

g_ui_task_mb = rt_mb_create("ui_mb", 8, RT_IPC_FLAG_FIFO);
rt_thread_mdelay(2000);
if (g_ui_task_mb != RT_NULL) {
rt_mb_send(g_ui_task_mb, UI_EVENT_LOW_BATTERY_WARNING);
}

while (1) {
rt_thread_mdelay(1000);

}
}
rt_kprintf("电量充足,正常开机\n");
}
}

int main(void)
{
check_poweron_reason();
Expand All @@ -595,6 +682,10 @@ int main(void)
rt_kprintf("Failed to create mailbox g_button_event_mb\n");
return 0;
}
//初始化电池邮箱
g_battery_mb = rt_mb_create("battery_level", 1, RT_IPC_FLAG_FIFO);
check_low_power();

rt_kprintf("Xiaozhi start!!!\n");
audio_server_set_private_volume(AUDIO_TYPE_LOCAL_MUSIC, VOL_DEFAULE_LEVEL); // 设置音量
xz_set_lcd_brightness(LCD_BRIGHTNESS_DEFAULT);
Expand Down Expand Up @@ -624,8 +715,8 @@ int main(void)
{
rt_kprintf("Failed to init xiaozhi UI thread\n");
}

// Connect BT PAN

g_bt_app_mb = rt_mb_create("bt_app", 8, RT_IPC_FLAG_FIFO);
#ifdef BSP_BT_CONNECTION_MANAGER
bt_cm_set_profile_target(BT_CM_HID, BT_LINK_PHONE, 1);
Expand All @@ -652,7 +743,6 @@ int main(void)
{
rt_kprintf("Failed to init battery thread\n");
}

#ifdef BSP_USING_BOARD_SF32LB52_XTY_AI
if (pulse_encoder_init() != RT_EOK)
{
Expand Down Expand Up @@ -721,6 +811,7 @@ int main(void)
xiaozhi_time_weather();
//xiaozhi_ui_chat_output("连接小智中...");
xiaozhi_ui_standby_chat_output("请按键连接小智...");
lv_display_trigger_activity(NULL);

#ifdef XIAOZHI_USING_MQTT
xiaozhi(0,NULL);
Expand Down
3 changes: 2 additions & 1 deletion app/src/weather/weather.c
Original file line number Diff line number Diff line change
Expand Up @@ -911,7 +911,8 @@ void xiaozhi_time_weather(void)//获取最新时间和天气
{
retry_count++;
LOG_W("Initial time synchronization failed, retrying... attempt %d", retry_count);
if (retry_count < max_retries) {
if (retry_count < max_retries)
{
rt_thread_mdelay(3000); // 等待3秒后重试
}
else
Expand Down
5 changes: 3 additions & 2 deletions app/src/xiaozhi_client_public.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,12 +89,13 @@ ble_common_update_type_t ble_request_public_address(bd_addr_t *addr)
uint8_t mac[6] = {0};
int ret = 0;
int read_len = rt_flash_config_read(FACTORY_CFG_ID_MAC, mac, 6);
// OTP没有内容,用UID生成MAC
if (read_len == 0)
{
// OTP没有内容,用UID生成MAC
{
ret = bt_mac_addr_generate_via_uid_v2(addr);
if (ret != 0)
{
//uid生成失败
rt_kprintf("uid get mac fail: %d", ret);
return BLE_UPDATE_NO_UPDATE;
}
Expand Down
5 changes: 4 additions & 1 deletion app/src/xiaozhi_client_public.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,13 @@
#define VOL_MIN_LEVEL (0)
#define VOL_MAX_LEVEL (16)
#define VOL_DEFAULE_LEVEL (6)
#define UI_EVENT_SHUTDOWN 1
#define UI_EVENT_SHUTDOWN 1 //正常按键关机
#define UI_EVENT_LOW_BATTERY_SHUTDOWN 2 //低电量关机
#define UI_EVENT_LOW_BATTERY_WARNING 3 // 低电开机警告再关机
#define AUDIO_IOCTL_ENABLE_CPU_LOW_SPEED 4 /* parameter type is uint32_t
1 low speed
0 high speed */
#define CHARGE_DETECT_PIN 44

#ifdef BSP_KEY1_ACTIVE_HIGH
#define KEY1_ACTIVE_LEVEL 1
Expand Down
Loading