536 lines
13 KiB
C
536 lines
13 KiB
C
#include "ui/ui.h"
|
|
#include "app_config.h"
|
|
#include "ui/ui_api.h"
|
|
#include "app_task.h"
|
|
#include "system/timer.h"
|
|
#include "key_event_deal.h"
|
|
#include "audio_config.h"
|
|
#include "jiffies.h"
|
|
#include "btstack/avctp_user.h"
|
|
#include "app_power_manage.h"
|
|
#include "asm/charge.h"
|
|
#ifndef CONFIG_MEDIA_NEW_ENABLE
|
|
#include "application/audio_eq_drc_apply.h"
|
|
#else
|
|
#include "audio_eq.h"
|
|
#endif
|
|
|
|
|
|
#if (TCFG_UI_ENABLE&&(CONFIG_UI_STYLE == STYLE_JL_SOUNDBOX))
|
|
|
|
#define STYLE_NAME JL
|
|
|
|
REGISTER_UI_STYLE(STYLE_NAME)
|
|
|
|
extern void key_ui_takeover(u8 on);
|
|
extern u8 bt_sco_state(void);
|
|
extern void power_off_deal(struct sys_event *event, u8 step);
|
|
static int music_vol_handler(const char *type, u32 arg);
|
|
|
|
static int bt_status_handler(const char *type, u32 arg)
|
|
{
|
|
if (ui_get_disp_status_by_id(BT_MENU_LAYOUT) == true) {
|
|
return -1;
|
|
}
|
|
|
|
if (ui_get_disp_status_by_id(BT_VOL_LAYOUT) == true) {
|
|
return -1;
|
|
}
|
|
|
|
|
|
if (type && (!strcmp(type, "event"))) {
|
|
switch (arg) {
|
|
case BT_STATUS_SECOND_CONNECTED:
|
|
case BT_STATUS_FIRST_CONNECTED:
|
|
printf("%s %d\n", __func__, __LINE__);
|
|
ui_pic_show_image_by_id(BT_STATUS_PIC, 1);
|
|
ui_text_show_index_by_id(BT_STATUS_TEXT, 1);
|
|
break;
|
|
case BT_STATUS_FIRST_DISCONNECT:
|
|
case BT_STATUS_SECOND_DISCONNECT:
|
|
printf("%s %d\n", __func__, __LINE__);
|
|
ui_pic_show_image_by_id(BT_STATUS_PIC, 0);
|
|
ui_text_show_index_by_id(BT_STATUS_TEXT, 0);
|
|
break;
|
|
case BT_STATUS_A2DP_MEDIA_START:
|
|
printf("%s %d\n", __func__, __LINE__);
|
|
ui_pic_show_image_by_id(BT_STATUS_PIC, 1);
|
|
ui_text_show_index_by_id(BT_STATUS_TEXT, 2);
|
|
break;
|
|
case BT_STATUS_A2DP_MEDIA_STOP:
|
|
printf("%s %d\n", __func__, __LINE__);
|
|
ui_pic_show_image_by_id(BT_STATUS_PIC, 1);
|
|
ui_text_show_index_by_id(BT_STATUS_TEXT, 3);
|
|
break;
|
|
case BT_STATUS_TAKEING_PHONE:
|
|
printf("%s %d\n", __func__, __LINE__);
|
|
ui_pic_show_image_by_id(BT_STATUS_PIC, 1);
|
|
ui_text_show_index_by_id(BT_STATUS_TEXT, 4);
|
|
break;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
|
窗口app与ui的消息交互注册 app可以发生消息到ui进行显示
|
|
************************************************************/
|
|
|
|
static const struct uimsg_handl ui_msg_handler[] = {
|
|
{ "bt_status", bt_status_handler }, /* 设置音量 */
|
|
{ "music_vol", music_vol_handler }, /* 显示音量 */
|
|
{ NULL, NULL}, /* 必须以此结尾! */
|
|
};
|
|
|
|
|
|
|
|
|
|
/************************************************************
|
|
蓝牙主页窗口控件
|
|
可以在这个窗口注册各个布局需要用的资源
|
|
************************************************************/
|
|
|
|
|
|
static int bt_mode_onchange(void *ctr, enum element_change_event e, void *arg)
|
|
{
|
|
struct window *window = (struct window *)ctr;
|
|
static int bt_status_timer = 0;
|
|
switch (e) {
|
|
case ON_CHANGE_INIT:
|
|
puts("\n***!!!!!!!!!!!! >>>>>>>>>>>>>>>>>>bt_mode_onchange***\n");
|
|
ui_register_msg_handler(ID_WINDOW_BT, ui_msg_handler);//注册消息交互的回调
|
|
/*
|
|
* 注册APP消息响应
|
|
*/
|
|
break;
|
|
case ON_CHANGE_RELEASE:
|
|
|
|
if (bt_status_timer) {
|
|
sys_timeout_del(bt_status_timer);
|
|
bt_status_timer = 0;
|
|
}
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
REGISTER_UI_EVENT_HANDLER(ID_WINDOW_BT)
|
|
.onchange = bt_mode_onchange,
|
|
.onkey = NULL,
|
|
.ontouch = NULL,
|
|
};
|
|
|
|
|
|
|
|
static void bt_status_check(void *p)
|
|
{
|
|
u8 status = get_bt_connect_status();
|
|
u8 eq_mode = 0;
|
|
if (status == BT_STATUS_WAITINT_CONN) {
|
|
ui_pic_show_image_by_id(BT_STATUS_PIC, 0);
|
|
ui_text_show_index_by_id(BT_STATUS_TEXT, 0);
|
|
} else if (status == BT_STATUS_PLAYING_MUSIC) {
|
|
ui_pic_show_image_by_id(BT_STATUS_PIC, 1);
|
|
ui_text_show_index_by_id(BT_STATUS_TEXT, 2);
|
|
} else if (status == BT_STATUS_TAKEING_PHONE) {
|
|
ui_pic_show_image_by_id(BT_STATUS_PIC, 1);
|
|
ui_text_show_index_by_id(BT_STATUS_TEXT, 4);
|
|
} else {
|
|
ui_pic_show_image_by_id(BT_STATUS_PIC, 1);
|
|
ui_text_show_index_by_id(BT_STATUS_TEXT, 1);
|
|
}
|
|
#if TCFG_EQ_ENABLE
|
|
eq_mode = eq_mode_get_cur();
|
|
ui_pic_show_image_by_id(BT_EQ, eq_mode);
|
|
#endif
|
|
}
|
|
|
|
static int bt_layout_onchange(void *ctr, enum element_change_event e, void *arg)
|
|
{
|
|
struct layout *layout = (struct layout *)ctr;
|
|
switch (e) {
|
|
case ON_CHANGE_INIT:
|
|
break;
|
|
|
|
case ON_CHANGE_FIRST_SHOW:
|
|
ui_set_call(bt_status_check, 0);
|
|
break;
|
|
|
|
case ON_CHANGE_SHOW_POST:
|
|
//有显示动作
|
|
break;
|
|
|
|
case ON_CHANGE_RELEASE:
|
|
break;
|
|
default:
|
|
return FALSE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
static int bt_layout_onkey(void *ctr, struct element_key_event *e)
|
|
{
|
|
printf("bt_layout_onkey %d\n", e->value);
|
|
switch (e->value) {
|
|
case KEY_MENU:
|
|
if (ui_get_disp_status_by_id(BT_MENU_LAYOUT) <= 0) {
|
|
printf("BT_MENU_LAYOUT\n");
|
|
ui_show(BT_MENU_LAYOUT);
|
|
}
|
|
break;
|
|
case KEY_UP:
|
|
r_printf("BT_MUSIC_PREV\n");
|
|
app_task_put_key_msg(KEY_MUSIC_PREV, 0);
|
|
break;
|
|
case KEY_DOWN:
|
|
r_printf("BT_MUSIC_NEXT\n");
|
|
app_task_put_key_msg(KEY_MUSIC_NEXT, 0);
|
|
break;
|
|
case KEY_VOLUME_INC:
|
|
case KEY_VOLUME_DEC:
|
|
if (ui_get_disp_status_by_id(BT_VOL_LAYOUT) <= 0) {
|
|
ui_show(BT_VOL_LAYOUT);
|
|
}
|
|
break;
|
|
case KEY_OK:
|
|
r_printf("BT_MUSIC_PP\n");
|
|
app_task_put_key_msg(KEY_MUSIC_PP, 0);
|
|
break;
|
|
case KEY_MODE:
|
|
ui_hide_main(ID_WINDOW_BT);
|
|
ui_show_main(ID_WINDOW_SYS);
|
|
break;
|
|
case KEY_POWER_START:
|
|
case KEY_POWER:
|
|
power_off_deal(NULL, e->value - KEY_POWER_START);
|
|
break;
|
|
default:
|
|
return false;
|
|
break;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
REGISTER_UI_EVENT_HANDLER(BT_LAYOUT)
|
|
.onchange = bt_layout_onchange,
|
|
.onkey = bt_layout_onkey,
|
|
.ontouch = NULL,
|
|
};
|
|
|
|
|
|
static u16 bt_timer = 0;
|
|
static void bt_vol_timeout(void *p)
|
|
{
|
|
int id = (int)(p);
|
|
if (ui_get_disp_status_by_id(id) == TRUE) {
|
|
ui_hide(id);
|
|
}
|
|
bt_timer = 0;
|
|
}
|
|
|
|
static int music_vol_handler(const char *type, u32 arg)
|
|
{
|
|
struct unumber num;
|
|
if (type && (!strcmp(type, "vol"))) {
|
|
if (ui_get_disp_status_by_id(BT_VOL_LAYOUT) == TRUE) {
|
|
num.type = TYPE_NUM;
|
|
num.numbs = 1;
|
|
num.number[0] = arg;
|
|
ui_number_update_by_id(BT_VOL_NUM, &num);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
static void vol_init(int id)
|
|
{
|
|
struct unumber num;
|
|
num.type = TYPE_NUM;
|
|
num.numbs = 1;
|
|
num.number[0] = app_audio_get_volume(APP_AUDIO_CURRENT_STATE);
|
|
ui_number_update_by_id(BT_VOL_NUM, &num);
|
|
}
|
|
|
|
static int bt_vol_layout_onchange(void *ctr, enum element_change_event e, void *arg)
|
|
{
|
|
struct layout *layout = (struct layout *)ctr;
|
|
switch (e) {
|
|
case ON_CHANGE_INIT:
|
|
if (!bt_timer) {
|
|
bt_timer = sys_timeout_add((void *)layout->elm.id, bt_vol_timeout, 3000);
|
|
}
|
|
layout_on_focus(layout);//设置焦点在本布局(如果布局下还有列表,焦点会最后显示出的列表这里,防止焦点不在,可以把焦点控制在本布局)
|
|
break;
|
|
|
|
case ON_CHANGE_FIRST_SHOW:
|
|
ui_set_call(vol_init, 0);
|
|
break;
|
|
|
|
case ON_CHANGE_SHOW_POST:
|
|
//有显示动作
|
|
break;
|
|
|
|
case ON_CHANGE_RELEASE:
|
|
if (bt_timer) {
|
|
sys_timeout_del(bt_timer);
|
|
bt_timer = 0;
|
|
}
|
|
layout_lose_focus(layout);//失去本焦点
|
|
break;
|
|
default:
|
|
return FALSE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
|
|
static int bt_vol_layout_onkey(void *ctr, struct element_key_event *e)
|
|
{
|
|
printf("bt_vol_layout_onkey %d\n", e->value);
|
|
|
|
if (bt_timer) {
|
|
sys_timer_modify(bt_timer, 3000);
|
|
}
|
|
|
|
switch (e->value) {
|
|
case KEY_MENU:
|
|
break;
|
|
case KEY_UP:
|
|
case KEY_VOLUME_INC:
|
|
app_task_put_key_msg(KEY_VOL_UP, 0);
|
|
break;
|
|
case KEY_DOWN:
|
|
case KEY_VOLUME_DEC:
|
|
app_task_put_key_msg(KEY_VOL_DOWN, 0);
|
|
break;
|
|
default:
|
|
return false;
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
REGISTER_UI_EVENT_HANDLER(BT_VOL_LAYOUT)
|
|
.onchange = bt_vol_layout_onchange,
|
|
.onkey = bt_vol_layout_onkey,
|
|
.ontouch = NULL,
|
|
};
|
|
|
|
|
|
|
|
static int bt_menu_list_onkey(void *ctr, struct element_key_event *e)
|
|
{
|
|
struct ui_grid *grid = (struct ui_grid *)ctr;
|
|
int sel_item = 0;
|
|
printf("ui key %s %d\n", __FUNCTION__, e->value);
|
|
switch (e->value) {
|
|
case KEY_OK:
|
|
sel_item = ui_grid_cur_item(grid);
|
|
switch (sel_item) {
|
|
case 0:
|
|
ui_show(BT_MENU_EQ_LAYOUT);
|
|
break;
|
|
case 1:
|
|
ui_hide(BT_MENU_LAYOUT);
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
REGISTER_UI_EVENT_HANDLER(BT_MENU_LIST)
|
|
.onchange = NULL,
|
|
.onkey = bt_menu_list_onkey,
|
|
.ontouch = NULL,
|
|
};
|
|
|
|
|
|
|
|
static int bt_eq_menu_list_onkey(void *ctr, struct element_key_event *e)
|
|
{
|
|
struct ui_grid *grid = (struct ui_grid *)ctr;
|
|
int sel_item = 0;
|
|
printf("ui key %s %d\n", __FUNCTION__, e->value);
|
|
switch (e->value) {
|
|
case KEY_OK:
|
|
sel_item = ui_grid_cur_item(grid);
|
|
switch (sel_item) {
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
#if TCFG_EQ_ENABLE
|
|
eq_mode_set(sel_item);
|
|
ui_pic_show_image_by_id(BT_EQ, sel_item);
|
|
#endif
|
|
case 6:
|
|
ui_hide(BT_MENU_EQ_LAYOUT);
|
|
break;
|
|
}
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
static const int eq_mode_pic[] = {
|
|
BT_EQ_NORMAL_PIC,
|
|
BT_EQ_ROCK_PIC,
|
|
BT_EQ_POP_PIC,
|
|
BT_EQ_CLASSIC_PIC,
|
|
BT_EQ_JAZZ_PIC,
|
|
BT_EQ_COUNTRY_PIC,
|
|
};
|
|
|
|
|
|
#if TCFG_EQ_ENABLE
|
|
static int eq_pic_common_onchange(void *_ctrl, enum element_change_event event, void *arg)
|
|
{
|
|
struct ui_pic *pic = (struct ui_pic *)_ctrl;
|
|
switch (event) {
|
|
case ON_CHANGE_INIT:
|
|
if (pic->elm.id == eq_mode_pic[eq_mode_get_cur() % 6]) {
|
|
ui_pic_set_image_index(pic, 1);
|
|
}
|
|
break;
|
|
case ON_CHANGE_SHOW_POST:
|
|
break;
|
|
default:
|
|
return FALSE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
REGISTER_UI_EVENT_HANDLER(BT_EQ_NORMAL_PIC)
|
|
.onchange = eq_pic_common_onchange,
|
|
};
|
|
REGISTER_UI_EVENT_HANDLER(BT_EQ_ROCK_PIC)
|
|
.onchange = eq_pic_common_onchange,
|
|
};
|
|
REGISTER_UI_EVENT_HANDLER(BT_EQ_POP_PIC)
|
|
.onchange = eq_pic_common_onchange,
|
|
};
|
|
REGISTER_UI_EVENT_HANDLER(BT_EQ_CLASSIC_PIC)
|
|
.onchange = eq_pic_common_onchange,
|
|
};
|
|
REGISTER_UI_EVENT_HANDLER(BT_EQ_JAZZ_PIC)
|
|
.onchange = eq_pic_common_onchange,
|
|
};
|
|
REGISTER_UI_EVENT_HANDLER(BT_EQ_COUNTRY_PIC)
|
|
.onchange = eq_pic_common_onchange,
|
|
};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static int bt_eq_menu_list_onchange(void *ctr, enum element_change_event e, void *arg)
|
|
{
|
|
struct ui_grid *grid = (struct ui_grid *)ctr;
|
|
int list = 0;
|
|
switch (e) {
|
|
case ON_CHANGE_INIT:
|
|
printf("ON_CHANGE_INIT %d \n", grid->avail_item_num);
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
|
|
REGISTER_UI_EVENT_HANDLER(BT_EQ_MENU_LIST)
|
|
.onchange = bt_eq_menu_list_onchange,
|
|
.onkey = bt_eq_menu_list_onkey,
|
|
.ontouch = NULL,
|
|
};
|
|
|
|
/************************************************************
|
|
电池控件事件
|
|
************************************************************/
|
|
|
|
static void battery_timer(void *priv)
|
|
{
|
|
int incharge = 0;//充电标志
|
|
int id = (int)(priv);
|
|
static u8 percent = 0;
|
|
static u8 percent_last = 0;
|
|
if (1 || get_charge_online_flag()) { //充电时候图标动态效果
|
|
if (percent > get_vbat_percent()) {
|
|
percent = 0;
|
|
}
|
|
ui_battery_set_level_by_id(id, percent, incharge); //充电标志,ui可以显示不一样的图标
|
|
percent += 20;
|
|
} else {
|
|
|
|
percent = get_vbat_percent();
|
|
if (percent != percent_last) {
|
|
ui_battery_set_level_by_id(id, percent, incharge); //充电标志,ui可以显示不一样的图标,需要工具设置
|
|
percent_last = percent;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
static int battery_onchange(void *ctr, enum element_change_event e, void *arg)
|
|
{
|
|
struct ui_battery *battery = (struct ui_battery *)ctr;
|
|
static u32 timer = 0;
|
|
int incharge = 0;//充电标志
|
|
|
|
switch (e) {
|
|
case ON_CHANGE_INIT:
|
|
ui_battery_set_level(battery, get_vbat_percent(), incharge);
|
|
if (!timer) {
|
|
timer = sys_timer_add((void *)battery->elm.id, battery_timer, 1 * 1000); //传入的id就是BT_BAT
|
|
}
|
|
break;
|
|
case ON_CHANGE_FIRST_SHOW:
|
|
break;
|
|
case ON_CHANGE_RELEASE:
|
|
if (timer) {
|
|
sys_timer_del(timer);
|
|
timer = 0;
|
|
}
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|
|
REGISTER_UI_EVENT_HANDLER(BT_BAT)
|
|
.onchange = battery_onchange,
|
|
.ontouch = NULL,
|
|
};
|
|
|
|
|
|
|
|
#endif
|