482 lines
11 KiB
C
482 lines
11 KiB
C
|
#include "ui/ui.h"
|
|||
|
#include "app_config.h"
|
|||
|
#include "ui/ui_style.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 "fm/fm_api.h"
|
|||
|
#include "fm/fm_rw.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))
|
|||
|
#if (TCFG_APP_FM_EN)
|
|||
|
|
|||
|
#define STYLE_NAME JL
|
|||
|
|
|||
|
extern int ui_hide_main(int id);
|
|||
|
extern int ui_show_main(int id);
|
|||
|
extern void key_ui_takeover(u8 on);
|
|||
|
extern int fm_server_msg_post(int msg);
|
|||
|
extern void fm_volume_up();
|
|||
|
extern void fm_volume_down();
|
|||
|
extern void power_off_deal(struct sys_event *event, u8 step);
|
|||
|
|
|||
|
extern u8 fm_get_cur_channel(void);
|
|||
|
|
|||
|
static int fm_fre_handler(const char *type, u32 arg)
|
|||
|
{
|
|||
|
printf(">>%s\n", __FUNCTION__);
|
|||
|
u16 fre = fm_manage_get_fre();//8750
|
|||
|
|
|||
|
struct unumber num;
|
|||
|
num.type = TYPE_NUM;
|
|||
|
num.numbs = 2;
|
|||
|
num.number[0] = fm_get_cur_channel();
|
|||
|
num.number[1] = get_total_mem_channel();
|
|||
|
ui_number_update_by_id(FM_CH, &num);
|
|||
|
|
|||
|
num.numbs = 2;
|
|||
|
num.number[0] = fre / 100 % 1000;
|
|||
|
num.number[1] = fre / 10 % 10;
|
|||
|
ui_number_update_by_id(FM_FREQ, &num);
|
|||
|
//显示进度图标是从87开始
|
|||
|
ui_slider_set_persent_by_id(FM_SLIDER, (fre - 8700) * 100 / (REAL_FREQ_MAX - 8700));
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
static const struct uimsg_handl ui_msg_handler[] = {
|
|||
|
{ "fm_fre", fm_fre_handler }, /* 设置fm频率显示*/
|
|||
|
{ NULL, NULL}, /* 必须以此结尾! */
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
static int fm_mode_onchange(void *ctr, enum element_change_event e, void *arg)
|
|||
|
{
|
|||
|
struct window *window = (struct window *)ctr;
|
|||
|
switch (e) {
|
|||
|
case ON_CHANGE_INIT:
|
|||
|
puts("\n***fm_mode_onchange***\n");
|
|||
|
/* key_ui_takeover(1); */
|
|||
|
ui_register_msg_handler(ID_WINDOW_FM, ui_msg_handler);
|
|||
|
/*
|
|||
|
* 注册APP消息响应
|
|||
|
*/
|
|||
|
break;
|
|||
|
case ON_CHANGE_RELEASE:
|
|||
|
/*
|
|||
|
* 要隐藏一下系统菜单页面,防止在系统菜单插入USB进入USB页面
|
|||
|
*/
|
|||
|
break;
|
|||
|
default:
|
|||
|
return false;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
REGISTER_UI_EVENT_HANDLER(ID_WINDOW_FM)
|
|||
|
.onchange = fm_mode_onchange,
|
|||
|
.onkey = NULL,
|
|||
|
.ontouch = NULL,
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
static void fm_layout_init(int id)
|
|||
|
{
|
|||
|
u16 fre = fm_manage_get_fre();//8750
|
|||
|
|
|||
|
struct unumber num;
|
|||
|
num.type = TYPE_NUM;
|
|||
|
num.numbs = 2;
|
|||
|
num.number[0] = fm_get_cur_channel();
|
|||
|
num.number[1] = get_total_mem_channel();
|
|||
|
ui_number_update_by_id(FM_CH, &num);
|
|||
|
|
|||
|
num.numbs = 2;
|
|||
|
num.number[0] = fre / 100 % 1000;
|
|||
|
num.number[1] = fre / 10 % 10;
|
|||
|
ui_number_update_by_id(FM_FREQ, &num);
|
|||
|
//显示进度图标是从87开始
|
|||
|
ui_slider_set_persent_by_id(FM_SLIDER, (fre - 8700) * 100 / (REAL_FREQ_MAX - 8700));
|
|||
|
}
|
|||
|
|
|||
|
static int fm_layout_onchange(void *ctr, enum element_change_event e, void *arg)
|
|||
|
{
|
|||
|
struct layout *layout = (struct layout *)ctr;
|
|||
|
switch (e) {
|
|||
|
case ON_CHANGE_INIT:
|
|||
|
layout_on_focus(layout);
|
|||
|
ui_set_call(fm_layout_init, 0);
|
|||
|
break;
|
|||
|
case ON_CHANGE_RELEASE:
|
|||
|
layout_lose_focus(layout);
|
|||
|
break;
|
|||
|
case ON_CHANGE_FIRST_SHOW:
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
static void fm_vol_timeout(void *p);
|
|||
|
static int fm_layout_onkey(void *ctr, struct element_key_event *e)
|
|||
|
{
|
|||
|
printf("fm_layout_onkey %d\n", e->value);
|
|||
|
switch (e->value) {
|
|||
|
case KEY_OK:
|
|||
|
app_task_put_key_msg(KEY_MUSIC_PP, 0);
|
|||
|
break;
|
|||
|
case KEY_MENU:
|
|||
|
if (ui_get_disp_status_by_id(FM_MENU_LAYOUT) <= 0) {
|
|||
|
printf("FM_MENU_LAYOUT\n");
|
|||
|
ui_show(FM_MENU_LAYOUT);
|
|||
|
}
|
|||
|
break;
|
|||
|
case KEY_UP:
|
|||
|
app_task_put_key_msg(KEY_FM_PREV_STATION, 0);
|
|||
|
break;
|
|||
|
case KEY_DOWN:
|
|||
|
app_task_put_key_msg(KEY_FM_NEXT_STATION, 0);
|
|||
|
break;
|
|||
|
case KEY_VOLUME_INC:
|
|||
|
case KEY_VOLUME_DEC:
|
|||
|
if (ui_get_disp_status_by_id(FM_VOL_LAYOUT) <= 0) {
|
|||
|
ui_show(FM_VOL_LAYOUT);
|
|||
|
}
|
|||
|
break;
|
|||
|
case KEY_MODE:
|
|||
|
ui_hide_curr_main();
|
|||
|
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(FM_LAYOUT)
|
|||
|
.onchange = fm_layout_onchange,
|
|||
|
.onkey = fm_layout_onkey,
|
|||
|
.ontouch = NULL,
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
static int fm_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:
|
|||
|
app_task_put_key_msg(KEY_FM_SCAN_ALL, 0);
|
|||
|
ui_hide(FM_MENU_LAYOUT);
|
|||
|
break;
|
|||
|
case 1:
|
|||
|
app_task_put_key_msg(KEY_FM_DEL_STATION, 0);
|
|||
|
ui_hide(FM_MENU_LAYOUT);
|
|||
|
break;
|
|||
|
case 2:
|
|||
|
ui_hide(FM_MENU_LAYOUT);
|
|||
|
break;
|
|||
|
}
|
|||
|
break;
|
|||
|
default:
|
|||
|
return false;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
REGISTER_UI_EVENT_HANDLER(FM_MENU_LIST)
|
|||
|
.onchange = NULL,
|
|||
|
.onkey = fm_menu_list_onkey,
|
|||
|
.ontouch = NULL,
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
static u16 fm_timer = 0;
|
|||
|
static void fm_vol_timeout(void *p)
|
|||
|
{
|
|||
|
int id = (int)(p);
|
|||
|
if (ui_get_disp_status_by_id(id) == TRUE) {
|
|||
|
ui_hide(id);
|
|||
|
}
|
|||
|
fm_timer = 0;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
static int fm_vol_layout_onkey(void *ctr, struct element_key_event *e)
|
|||
|
{
|
|||
|
printf("bt_vol_layout_onkey %d\n", e->value);
|
|||
|
struct unumber num;
|
|||
|
u8 vol;
|
|||
|
|
|||
|
if (fm_timer) {
|
|||
|
sys_timer_modify(fm_timer, 3000);
|
|||
|
}
|
|||
|
|
|||
|
switch (e->value) {
|
|||
|
case KEY_MENU:
|
|||
|
break;
|
|||
|
case KEY_UP:
|
|||
|
case KEY_VOLUME_INC:
|
|||
|
fm_volume_up();
|
|||
|
vol = app_audio_get_volume(APP_AUDIO_CURRENT_STATE);
|
|||
|
num.type = TYPE_NUM;
|
|||
|
num.numbs = 1;
|
|||
|
num.number[0] = vol;
|
|||
|
ui_number_update_by_id(FM_VOL_NUM, &num);
|
|||
|
break;
|
|||
|
case KEY_DOWN:
|
|||
|
case KEY_VOLUME_DEC:
|
|||
|
fm_volume_down();
|
|||
|
vol = app_audio_get_volume(APP_AUDIO_CURRENT_STATE);
|
|||
|
num.type = TYPE_NUM;
|
|||
|
num.numbs = 1;
|
|||
|
num.number[0] = vol;
|
|||
|
ui_number_update_by_id(FM_VOL_NUM, &num);
|
|||
|
break;
|
|||
|
default:
|
|||
|
return false;
|
|||
|
break;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
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(FM_VOL_NUM, &num);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
static int fm_vol_layout_onchange(void *ctr, enum element_change_event e, void *arg)
|
|||
|
{
|
|||
|
struct layout *layout = (struct layout *)ctr;
|
|||
|
struct unumber num;
|
|||
|
u8 vol;
|
|||
|
switch (e) {
|
|||
|
case ON_CHANGE_INIT:
|
|||
|
layout_on_focus(layout);
|
|||
|
if (!fm_timer) {
|
|||
|
fm_timer = sys_timeout_add((void *)FM_VOL_LAYOUT, fm_vol_timeout, 3000);
|
|||
|
}
|
|||
|
|
|||
|
break;
|
|||
|
case ON_CHANGE_RELEASE:
|
|||
|
layout_lose_focus(layout);
|
|||
|
if (fm_timer) {
|
|||
|
sys_timeout_del(fm_timer);
|
|||
|
fm_timer = 0;
|
|||
|
}
|
|||
|
break;
|
|||
|
case ON_CHANGE_FIRST_SHOW:
|
|||
|
ui_set_call(vol_init, 0);
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
REGISTER_UI_EVENT_HANDLER(FM_VOL_LAYOUT)
|
|||
|
.onchange = fm_vol_layout_onchange,
|
|||
|
.onkey = fm_vol_layout_onkey,
|
|||
|
.ontouch = NULL,
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
/************************************************************
|
|||
|
fm模式控件初始化
|
|||
|
************************************************************/
|
|||
|
|
|||
|
|
|||
|
static int fm_slider_onchange(void *ctr, enum element_change_event e, void *arg)
|
|||
|
{
|
|||
|
struct ui_slider *slider = (struct ui_slider *)ctr;
|
|||
|
u16 fre = 0;
|
|||
|
switch (e) {
|
|||
|
case ON_CHANGE_INIT:
|
|||
|
fre = fm_manage_get_fre();//8750
|
|||
|
slider->persent = VIRTUAL_FREQ(fre) * 100 / MAX_CHANNEL;
|
|||
|
break;
|
|||
|
default:
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
REGISTER_UI_EVENT_HANDLER(FM_SLIDER)
|
|||
|
.onchange = fm_slider_onchange,
|
|||
|
.onkey = NULL,
|
|||
|
.ontouch = NULL,
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
static int fm_vol_num_onchange(void *ctr, enum element_change_event e, void *arg)
|
|||
|
{
|
|||
|
struct ui_number *num = (struct ui_number *)ctr;
|
|||
|
switch (e) {
|
|||
|
case ON_CHANGE_INIT:
|
|||
|
num->nums = 1;
|
|||
|
num->number[0] = app_audio_get_volume(APP_AUDIO_CURRENT_STATE);
|
|||
|
break;
|
|||
|
default:
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
REGISTER_UI_EVENT_HANDLER(FM_VOL_NUM)
|
|||
|
.onchange = fm_vol_num_onchange,
|
|||
|
.onkey = NULL,
|
|||
|
.ontouch = NULL,
|
|||
|
};
|
|||
|
|
|||
|
static int fm_ch_num_onchange(void *ctr, enum element_change_event e, void *arg)
|
|||
|
{
|
|||
|
struct ui_number *num = (struct ui_number *)ctr;
|
|||
|
switch (e) {
|
|||
|
case ON_CHANGE_INIT:
|
|||
|
num->nums = 2;
|
|||
|
num->number[0] = fm_get_cur_channel();
|
|||
|
num->number[1] = get_total_mem_channel();
|
|||
|
break;
|
|||
|
default:
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
REGISTER_UI_EVENT_HANDLER(FM_CH)
|
|||
|
.onchange = fm_ch_num_onchange,
|
|||
|
.onkey = NULL,
|
|||
|
.ontouch = NULL,
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
static int fm_freq_onchange(void *ctr, enum element_change_event e, void *arg)
|
|||
|
{
|
|||
|
struct ui_number *num = (struct ui_number *)ctr;
|
|||
|
u16 fre = 0;
|
|||
|
switch (e) {
|
|||
|
case ON_CHANGE_INIT:
|
|||
|
fre = fm_manage_get_fre();//8750
|
|||
|
num->nums = 2;
|
|||
|
num->number[0] = fre / 100 % 1000;
|
|||
|
num->number[1] = fre / 10 % 10;
|
|||
|
break;
|
|||
|
default:
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
REGISTER_UI_EVENT_HANDLER(FM_FREQ)
|
|||
|
.onchange = fm_freq_onchange,
|
|||
|
.onkey = NULL,
|
|||
|
.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 (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(FM_BAT)
|
|||
|
.onchange = battery_onchange,
|
|||
|
.ontouch = NULL,
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#endif //#if (TCFG_APP_FM_EN)
|
|||
|
#endif
|