Skip to content

Commit f25ac43

Browse files
HalfSweetjzlnb666
andauthored
release: v1.3.1 (#55)
* 修复525_lcd关机不灭屏的问题 (#102) * 修改长按关机逻辑,修改开机按键时间为1秒,修改下拉菜单文本,修改顶部lable文本 * 修复待机界面进入休眠倒计时界面会闪屏幕回到待机界面的bug;修复偶现无法从待机界面自动进入休眠的bug 修复待机界面进入休眠倒计时界面会闪屏幕回到待机界面的bug;修复偶现无法从待机界面自动进入休眠的bug * 修改逻辑:蓝牙断开后会回到对话界面。设备码未绑定时可按下关机键释放信号量。小智连接失败会在对话界面停留一秒 (#105) * 修复通过语音设置亮度和声音,下拉菜单进度条不会同步更新 (#106) * fix: 小汤圆板子PA34修改为长按30s复位 (#108) * fix: 修复电量计算错误 * 修复未初始化导致释放信号量死机的问题,修复关机/休眠倒计时动画结束后会有一瞬间的花屏问题 (#109) --------- Co-authored-by: smiling boy <[email protected]>
2 parents edcde8b + 98adbaa commit f25ac43

File tree

9 files changed

+229
-65
lines changed

9 files changed

+229
-65
lines changed

app/boards/sf32lb52-xty-ai_base/bsp_init.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@
4949
#define LXT_LP_CYCLE 200
5050
#endif
5151

52+
#ifndef PWRKEY_CNT_CLOCK_FREQ
53+
#define PWRKEY_CNT_CLOCK_FREQ (32000)
54+
#endif
55+
56+
#ifndef PWRKEY_HARD_RESET_TIME
57+
#define PWRKEY_HARD_RESET_TIME (30) /* unit:s */
58+
#endif
59+
5260
static uint16_t mpi1_div = 1;
5361
static uint16_t mpi2_div = 1;
5462

@@ -168,6 +176,7 @@ void HAL_PreInit(void)
168176
HAL_HPAON_StartGTimer();
169177
HAL_PMU_EnableRC32K(1);
170178
HAL_PMU_LpCLockSelect(PMU_LPCLK_RC32);
179+
hwp_pmuc->PWRKEY_CNT = PWRKEY_CNT_CLOCK_FREQ * PWRKEY_HARD_RESET_TIME;
171180

172181
HAL_PMU_EnableDLL(1);
173182

app/src/iot/screen.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// C 接口头文件
55
extern "C" {
66
#include <rtthread.h>
7+
extern void xiaozhi_ui_update_brightness(int brightness);
78
}
89

910
// 定义设备名
@@ -47,6 +48,7 @@ class Screen : public Thing {
4748
if (lcd_device_) {
4849
rt_device_control(lcd_device_, RTGRAPHIC_CTRL_SET_BRIGHTNESS, &brightness);
4950
rt_kprintf("Brightness set to: %d", brightness);
51+
xiaozhi_ui_update_brightness(brightness);
5052
} else {
5153
rt_kprintf("LCD device is NULL, cannot set brightness");
5254
}

app/src/iot/speaker.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// 添加 C 接口头文件
44
extern "C" {
55
#include "audio_server.h"
6+
//#include "../xiaozhi_ui.h"
7+
extern void xiaozhi_ui_update_volume(int volume);
68
}
79

810

@@ -28,6 +30,7 @@ class Speaker : public Thing {
2830
}
2931

3032
audio_server_set_private_volume(AUDIO_TYPE_LOCAL_MUSIC, volume);
33+
xiaozhi_ui_update_volume(volume);
3134
});
3235

3336
// 新增方法:GetVolume(获取音量)

app/src/main.c

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include <drivers/rt_drv_encoder.h>
2020
#include "drv_flash.h"
2121
#include "xiaozhi_weather.h"
22+
#include "lv_timer.h"
23+
#include "lv_display.h"
2224
extern void xiaozhi_ui_update_ble(char *string);
2325
extern void xiaozhi_ui_update_emoji(char *string);
2426
extern void xiaozhi_ui_chat_status(char *string);
@@ -35,7 +37,12 @@ extern void xz_ws_audio_init();
3537
extern rt_tick_t last_listen_tick;
3638
extern xiaozhi_ws_t g_xz_ws;
3739
extern rt_mailbox_t g_button_event_mb;
40+
extern void ui_sleep_callback(lv_timer_t *timer);
41+
extern lv_obj_t *standby_screen;
3842
rt_mailbox_t g_battery_mb;
43+
extern lv_timer_t *ui_sleep_timer;
44+
extern lv_obj_t *shutdown_screen;
45+
extern lv_obj_t *sleep_screen;
3946
/* Common functions for RT-Thread based platform
4047
* -----------------------------------------------*/
4148
/**
@@ -213,18 +220,18 @@ static void battery_level_task(void *parameter)
213220
// 获取到的是电池电压,单位是mV
214221
// 假设电池电压范围是3.6V到4.2V,对应的电量范围是0%到100%
215222
uint32_t battery_percentage = 0;
216-
if (battery_level < 3600)
223+
if (battery_level < 36000)
217224
{
218225
battery_percentage = 0; // 小于3.6V,电量为0
219226
}
220-
else if (battery_level > 4200)
227+
else if (battery_level > 42000)
221228
{
222229
battery_percentage = 100; // 大于4.2V,电量为100
223230
}
224231
else
225232
{
226233
// 线性插值计算电量百分比
227-
battery_percentage = ((battery_level - 3600) * 100) / (4200 - 3600);
234+
battery_percentage = ((battery_level - 36000) * 100) / (42000 - 36000);
228235
}
229236

230237
rt_mb_send(g_battery_mb, battery_percentage);
@@ -331,7 +338,7 @@ void pan_reconnect()
331338

332339
LOG_I("Attempting to reconnect PAN, attempt %d",
333340
first_reconnect_attempts + 1);
334-
xiaozhi_ui_chat_status("connecting pan...");
341+
xiaozhi_ui_chat_status("重新连接 PAN...");
335342
xiaozhi_ui_chat_output("正在重连PAN...");
336343
xiaozhi_ui_standby_chat_output("正在重连PAN...");
337344
if (first_reconnect_attempts < max_reconnect_attempts)
@@ -394,6 +401,11 @@ static int bt_app_interface_event_handle(uint16_t type, uint16_t event_id,
394401
g_bt_app_env.bt_connected = FALSE;
395402
xiaozhi_ui_chat_output("蓝牙断开连接");
396403
xiaozhi_ui_standby_chat_output("蓝牙断开连接");//待机画面
404+
lv_obj_t *now_screen = lv_screen_active();
405+
if (now_screen != standby_screen && now_screen != sleep_screen && now_screen != shutdown_screen)
406+
{
407+
ui_swith_to_standby_screen();
408+
}
397409
// memset(&g_bt_app_env.bd_addr, 0xFF,
398410
// sizeof(g_bt_app_env.bd_addr));
399411
if (info->res == BT_NOTIFY_COMMON_SCO_DISCONNECTED)
@@ -567,9 +579,13 @@ static void check_poweron_reason(void)
567579
#endif
568580
else if (PMUC_WSR_PIN_ALL & pm_get_wakeup_src())
569581
{
570-
rt_thread_mdelay(2500); // 延时2.5秒
571-
int val = rt_pin_read(43);
572-
rt_kprintf("Power key(PA43) level after 2.5s: %d\n", val);
582+
rt_thread_mdelay(1000); // 延时1秒
583+
#ifdef BSP_USING_BOARD_SF32LB52_LCD_N16R8
584+
int val = rt_pin_read(BSP_KEY1_PIN);
585+
#else
586+
int val = rt_pin_read(BSP_KEY2_PIN);
587+
#endif
588+
rt_kprintf("Power key level after 1s: %d\n", val);
573589
if (val != KEY2_ACTIVE_LEVEL)
574590
{
575591
// 按键已松开,认为是误触发,直接关机
@@ -763,7 +779,7 @@ int main(void)
763779
else if (value == BT_APP_CONNECT_PAN_SUCCESS)
764780
{
765781
rt_kputs("BT_APP_CONNECT_PAN_SUCCESS\r\n");
766-
xiaozhi_ui_chat_output("初始化 请稍等...");
782+
//xiaozhi_ui_chat_output("初始化 请稍等...");
767783
xiaozhi_ui_standby_chat_output("初始化 请稍等...");
768784
xiaozhi_ui_update_ble("open");
769785
xiaozhi_ui_chat_status("初始化...");
@@ -773,16 +789,22 @@ int main(void)
773789
rt_thread_mdelay(2000);
774790
// 执行NTP与天气同步
775791
xiaozhi_time_weather();
776-
xiaozhi_ui_chat_output("连接小智中...");
792+
//xiaozhi_ui_chat_output("连接小智中...");
777793
xiaozhi_ui_standby_chat_output("请按键连接小智...");
778794

779795
#ifdef XIAOZHI_USING_MQTT
780796
xiaozhi(0, NULL);
781797
rt_kprintf("Select MQTT Version\n");
782798
#else
783-
xz_button_init();
799+
xz_button_init();
784800
// xiaozhi2(0, NULL); // Start Xiaozhi
785801
#endif
802+
// 在蓝牙和PAN连接成功后创建睡眠定时器
803+
if (!ui_sleep_timer && g_pan_connected)
804+
{
805+
rt_kprintf("create sleep timer2\n");
806+
ui_sleep_timer = lv_timer_create(ui_sleep_callback, 40000, NULL);
807+
}
786808
}
787809
else if (value == KEEP_FIRST_PAN_RECONNECT)
788810
{

app/src/mcp/mcp_server.cc

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@
1111
#include "rgbled_mcp.h"
1212
// #include "lwip/apps/websocket_client.h" // 提供 wsock_write 和 OPCODE_TEXT 定义
1313
#include "../xiaozhi2.h" // 提供 g_xz_ws 定义
14-
1514
extern xiaozhi_ws_t g_xz_ws;
1615

17-
16+
extern "C" {
17+
extern void xiaozhi_ui_update_volume(int volume);
18+
extern void xiaozhi_ui_update_brightness(int brightness);
19+
}
1820

1921

2022

@@ -54,6 +56,7 @@ void McpServer::AddCommonTools() {
5456
speaker->Invoke(command);
5557
cJSON_Delete(command); // 使用完记得释放内存
5658
}
59+
xiaozhi_ui_update_volume(volume);
5760
return true;
5861
});
5962

@@ -86,6 +89,7 @@ void McpServer::AddCommonTools() {
8689
screen->Invoke(command);
8790
cJSON_Delete(command);
8891
}
92+
xiaozhi_ui_update_brightness(brightness);
8993
return true;
9094
});
9195

app/src/xiaozhi2.c

Lines changed: 48 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -301,11 +301,13 @@ void xiaozhi2(int argc, char **argv);
301301
extern rt_mailbox_t g_bt_app_mb;
302302
extern lv_obj_t *main_container;
303303
extern lv_obj_t *standby_screen;
304+
304305
static void xz_button_event_handler(int32_t pin, button_action_t action)
305306
{
306307
rt_kprintf("in button handle\n");
307308
lv_display_trigger_activity(NULL);
308309
gui_pm_fsm(GUI_PM_ACTION_WAKEUP); // 唤醒设备
310+
rt_kprintf("in button handle2\n");
309311
// 如果当前处于KWS模式,则退出KWS模式
310312
if (g_kws_running)
311313
{
@@ -319,13 +321,14 @@ static void xz_button_event_handler(int32_t pin, button_action_t action)
319321

320322
if (action == BUTTON_PRESSED)
321323
{
322-
323-
324+
lv_obj_t *now_screen = lv_screen_active();
324325
rt_kprintf("pressed\r\n");
325326
rt_kprintf("按键->对话");
326-
ui_swith_to_xiaozhi_screen();
327-
328-
327+
if (now_screen == standby_screen)
328+
{
329+
ui_swith_to_xiaozhi_screen();
330+
}
331+
329332
// 1. 检查是否处于睡眠状态(WebSocket未连接)
330333
if (!g_xz_ws.is_connected)
331334
{
@@ -382,31 +385,32 @@ static rt_thread_t countdown_thread = RT_NULL;
382385
extern rt_mailbox_t g_ui_task_mb;
383386
static void xz_button2_event_handler(int32_t pin, button_action_t action)
384387
{
385-
static rt_tick_t press_tick = 0;
386388
if (action == BUTTON_PRESSED)
387389
{
388-
press_tick = rt_tick_get();
389-
rt_kprintf("xz_button2_event_handler\n");
390+
lv_obj_t *now_screen = lv_screen_active();
391+
if (now_screen != standby_screen)
392+
{
393+
rt_sem_release(g_activation_context.sem);
394+
}
395+
rt_kprintf("xz_button2_event_handler - pressed\n");
396+
}
397+
else if (action == BUTTON_LONG_PRESSED)
398+
{
399+
// 按下超过3秒,触发关机
400+
rt_kprintf("xz_button2_event_handler - long pressed\n");
401+
//检查设备是否已绑定设备码
402+
// if (g_activation_context.is_activated)
403+
// {
404+
// rt_sem_release(g_activation_context.sem);
405+
// }
406+
407+
// 长按3秒,直接发送关机消息到ui_task
408+
rt_mb_send(g_ui_task_mb, UI_EVENT_SHUTDOWN);
390409
}
410+
391411
else if (action == BUTTON_RELEASED)
392412
{
393-
if (press_tick != 0)
394-
{
395-
rt_tick_t now = rt_tick_get();
396-
if ((now - press_tick) >= rt_tick_from_millisecond(3000))
397-
{
398-
if (g_activation_context.is_activated)
399-
{
400-
rt_sem_release(g_activation_context.sem);
401-
}
402-
else
403-
{
404-
// 长按3秒,直接发送关机消息到ui_task
405-
rt_mb_send(g_ui_task_mb, UI_EVENT_SHUTDOWN);
406-
}
407-
}
408-
}
409-
press_tick = 0;
413+
rt_kprintf("xz_button2_event_handler - released\n");
410414
}
411415
}
412416

@@ -609,6 +613,23 @@ void xiaozhi_ws_connect(void)
609613
xiaozhi_ui_update_emoji("embarrassed");
610614
return;
611615
}
616+
617+
if (g_activation_context.is_activated)
618+
{
619+
she_bei_ma = 0;
620+
char str_temp[256];
621+
snprintf(str_temp, sizeof(str_temp),
622+
"设备未添加,请前往 xiaozhi.me "
623+
"输入绑定码: \n %s \n ",
624+
g_activation_context.code);
625+
xiaozhi_ui_chat_output(str_temp);
626+
xiaozhi_ui_standby_chat_output(str_temp);//待机界面也显示一份
627+
rt_sem_take(g_activation_context.sem, RT_WAITING_FOREVER);
628+
g_activation_context.is_activated = false;
629+
she_bei_ma = 1;
630+
lv_display_trigger_activity(NULL);
631+
632+
}
612633
// 检查 WebSocket 的 TCP 控制块状态是否为 CLOSED
613634
if (g_xz_ws.clnt.pcb != NULL && g_xz_ws.clnt.pcb->state != CLOSED)
614635
{
@@ -659,7 +680,9 @@ void xiaozhi_ws_connect(void)
659680
else
660681
{
661682
rt_kprintf("Waiting ws_connect ready%d... \r\n", retry);
683+
xiaozhi_ui_chat_output("小智连接失败!");
662684
rt_thread_mdelay(1000);
685+
ui_swith_to_standby_screen();
663686
}
664687
}
665688
}

0 commit comments

Comments
 (0)