372 lines
10 KiB
C
372 lines
10 KiB
C
#include "ui/ui.h"
|
||
#include "app_config.h"
|
||
#include "ui/ui_api.h"
|
||
#include "system/timer.h"
|
||
#include "key_event_deal.h"
|
||
#include "audio_config.h"
|
||
#include "jiffies.h"
|
||
#include "app_power_manage.h"
|
||
#include "asm/charge.h"
|
||
#include "audio_dec_file.h"
|
||
#include "music/music_player.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//必须要
|
||
|
||
extern int ui_hide_main(int id);
|
||
extern int ui_show_main(int id);
|
||
extern void key_ui_takeover(u8 on);
|
||
|
||
|
||
//文件浏览部分
|
||
|
||
#define TEXT_NAME_LEN (128)
|
||
#define TEXT_SHORT_NAME_LEN (13)//8.3+1
|
||
#define TEXT_PAGE (4)
|
||
struct text_name_t {
|
||
u16 len;
|
||
u8 unicode;
|
||
u8 fname[TEXT_NAME_LEN];
|
||
u8 fsname[TEXT_SHORT_NAME_LEN];
|
||
int index;
|
||
};
|
||
|
||
|
||
|
||
struct grid_set_info {
|
||
int flist_index; //文件列表首项所指的索引
|
||
int open_index; //所打开的文件所指的索引(未)
|
||
int cur_total;
|
||
const char *disk_name[4];
|
||
u8 in_scan;//是否在盘内
|
||
u8 disk_total;
|
||
FILE *file;
|
||
struct vfscan *fs;
|
||
struct text_name_t text_list[TEXT_PAGE];
|
||
struct vfs_attr attr[TEXT_PAGE];
|
||
#if (TCFG_LFN_EN)
|
||
u8 lfn_buf[512];
|
||
#endif//TCFG_LFN_EN
|
||
|
||
};
|
||
|
||
static struct grid_set_info *handler = NULL;
|
||
#define __this (handler)
|
||
#define sizeof_this (sizeof(struct grid_set_info))
|
||
|
||
static u32 LAYOUT_FNAME_LIST_ID[] = {
|
||
FILE_LAYOUT_0,
|
||
FILE_LAYOUT_1,
|
||
FILE_LAYOUT_2,
|
||
FILE_LAYOUT_3,
|
||
};
|
||
|
||
static u32 TEXT_FNAME_ID[] = {
|
||
FILE_BROWSE_TEXT_0,
|
||
FILE_BROWSE_TEXT_1,
|
||
FILE_BROWSE_TEXT_2,
|
||
FILE_BROWSE_TEXT_3,
|
||
};
|
||
|
||
static u32 PIC_FNAME_ID[] = {
|
||
FILE_BROWSE_PIC_0,
|
||
FILE_BROWSE_PIC_1,
|
||
FILE_BROWSE_PIC_2,
|
||
FILE_BROWSE_PIC_3,
|
||
};
|
||
|
||
|
||
|
||
|
||
static int __get_ui_max_num()
|
||
{
|
||
return sizeof(TEXT_FNAME_ID) / sizeof(TEXT_FNAME_ID[0]);
|
||
}
|
||
|
||
static const u8 MUSIC_SCAN_PARAM[] = "-t"
|
||
"MP1MP2MP3"
|
||
" -sn -d"
|
||
;
|
||
|
||
|
||
static int file_select_enter(int from_index)
|
||
{
|
||
|
||
int one_page_num = sizeof(TEXT_FNAME_ID) / sizeof(TEXT_FNAME_ID[0]);
|
||
int i = 0;
|
||
i = from_index % one_page_num;
|
||
if (__this->attr[i].attr == F_ATTR_DIR) { //判断是不是文件夹文件属性
|
||
if (!from_index) {
|
||
__this->fs = fscan_exitdir(__this->fs);
|
||
} else {
|
||
__this->fs = fscan_enterdir(__this->fs, __this->text_list[i].fsname);
|
||
}
|
||
|
||
if (!__this->fs) {
|
||
ui_hide(MUSIC_FILE_LAYOUT);
|
||
ui_hide(MUSIC_MENU_LAYOUT);
|
||
return false;
|
||
}
|
||
|
||
|
||
__this->cur_total = __this->fs->file_number + 1;
|
||
return TRUE;
|
||
} else {
|
||
/* if (!strcmp(cur->name, APP_NAME_MUSIC)) {//当前在目标app内,则只要显示出目标页面即可 */
|
||
app_task_put_key_msg(KEY_MUSIC_PLAYE_BY_DEV_SCLUST, __this->attr[i].sclust);
|
||
/* music_play_file_by_dev_sclust(__this->dev->logo, __this->attr[i].sclust);///this is a demo */
|
||
ui_hide(MUSIC_FILE_LAYOUT);
|
||
ui_hide(MUSIC_MENU_LAYOUT);
|
||
/* } */
|
||
}
|
||
return false;
|
||
}
|
||
|
||
static int file_list_flush(int from_index)
|
||
{
|
||
FILE *f = NULL;
|
||
int one_page_num = sizeof(TEXT_FNAME_ID) / sizeof(TEXT_FNAME_ID[0]);
|
||
int i = 0;
|
||
int end_index = from_index + one_page_num;
|
||
char *name_buf = NULL;
|
||
|
||
for (i = 0; i < sizeof(TEXT_FNAME_ID) / sizeof(TEXT_FNAME_ID[0]); i++) {
|
||
memset(__this->text_list[i].fname, 0, TEXT_NAME_LEN);
|
||
__this->text_list[i].len = 0;
|
||
}
|
||
|
||
__find:
|
||
i = from_index % one_page_num;
|
||
if (from_index == 0) {
|
||
sprintf(__this->text_list[i].fname, "%s", "..");
|
||
sprintf(__this->text_list[i].fsname, "%s", "..");
|
||
__this->attr[i].attr = F_ATTR_DIR;
|
||
__this->text_list[i].unicode = 0;
|
||
__this->text_list[i].len = strlen(__this->text_list[i].fname);
|
||
} else {
|
||
f = fselect(__this->fs, FSEL_BY_NUMBER, from_index);
|
||
}
|
||
|
||
if (f) {
|
||
name_buf = malloc(TEXT_NAME_LEN);
|
||
__this->text_list[i].len = fget_name(f, name_buf, TEXT_NAME_LEN);
|
||
if (name_buf[0] == '\\' && name_buf[1] == 'U') {
|
||
__this->text_list[i].len -= 2;
|
||
__this->text_list[i].unicode = 1;
|
||
memcpy(__this->text_list[i].fname, name_buf + 2, TEXT_NAME_LEN - 2);
|
||
} else {
|
||
__this->text_list[i].unicode = 0;
|
||
memcpy(__this->text_list[i].fname, name_buf, TEXT_NAME_LEN);
|
||
}
|
||
free(name_buf);
|
||
name_buf = NULL;
|
||
printf("\n--func=%s, line=%d\n", __FUNCTION__, __LINE__);
|
||
printf("flush [%d]=%s\n", i, __this->text_list[i].fname);
|
||
fget_attrs(f, &__this->attr[i]);
|
||
if (__this->attr[i].attr == F_ATTR_DIR) { //判断是不是文件夹文件属性,文件夹需要获取短文件名
|
||
fget_name(f, __this->text_list[i].fsname, TEXT_SHORT_NAME_LEN);
|
||
}
|
||
fclose(f);
|
||
f = NULL;
|
||
}
|
||
|
||
from_index++;
|
||
if (from_index < __this->cur_total && from_index < end_index) {
|
||
goto __find;
|
||
}
|
||
|
||
|
||
for (i = 0; i < sizeof(TEXT_FNAME_ID) / sizeof(TEXT_FNAME_ID[0]); i++) {
|
||
if (__this->text_list[i].len) {
|
||
if (__this->text_list[i].unicode) {
|
||
ui_text_set_textw_by_id(TEXT_FNAME_ID[i], __this->text_list[i].fname, __this->text_list[i].len, FONT_ENDIAN_SMALL, FONT_DEFAULT | FONT_HIGHLIGHT_SCROLL);
|
||
} else {
|
||
ui_text_set_text_by_id(TEXT_FNAME_ID[i], __this->text_list[i].fname, __this->text_list[i].len, FONT_DEFAULT);
|
||
}
|
||
if (__this->attr[i].attr == F_ATTR_DIR) {
|
||
ui_pic_show_image_by_id(PIC_FNAME_ID[i], 1);
|
||
} else {
|
||
ui_pic_show_image_by_id(PIC_FNAME_ID[i], 0);
|
||
}
|
||
if (ui_get_disp_status_by_id(PIC_FNAME_ID[i]) != true) {
|
||
ui_show(PIC_FNAME_ID[i]);
|
||
}
|
||
} else {
|
||
ui_text_set_text_by_id(TEXT_FNAME_ID[i], __this->text_list[i].fname, __this->text_list[i].len, FONT_DEFAULT);
|
||
if (ui_get_disp_status_by_id(PIC_FNAME_ID[i]) == true) {
|
||
ui_hide(PIC_FNAME_ID[i]);
|
||
}
|
||
}
|
||
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
|
||
static int file_browse_enter_onchane(void *ctr, enum element_change_event e, void *arg)
|
||
{
|
||
struct ui_grid *grid = (struct ui_grid *)ctr;
|
||
int fnum = 0;
|
||
|
||
switch (e) {
|
||
case ON_CHANGE_INIT:
|
||
if (!__this) {
|
||
__this = zalloc(sizeof_this);
|
||
}
|
||
|
||
if (!__this->fs) {
|
||
if (!dev_manager_get_total(1)) {
|
||
break;
|
||
}
|
||
|
||
void *dev = dev_manager_find_active(1);
|
||
if (!dev) {
|
||
break;
|
||
}
|
||
__this->fs = fscan(dev_manager_get_root_path(dev), MUSIC_SCAN_PARAM, 9);
|
||
#if (TCFG_LFN_EN)
|
||
if (__this->fs) {
|
||
fset_lfn_buf(__this->fs, __this->lfn_buf);
|
||
}
|
||
#endif
|
||
printf(">>> file number=%d \n", __this->fs->file_number);
|
||
fnum = (__this->fs->file_number + 1 > __get_ui_max_num()) ? __get_ui_max_num() : __this->fs->file_number + 1;
|
||
__this->cur_total = __this->fs->file_number + 1;
|
||
}
|
||
break;
|
||
case ON_CHANGE_RELEASE:
|
||
if (__this->fs) {
|
||
fscan_release(__this->fs);
|
||
__this->fs = NULL;
|
||
}
|
||
|
||
if (__this) {
|
||
free(__this);
|
||
__this = NULL;
|
||
}
|
||
|
||
break;
|
||
case ON_CHANGE_FIRST_SHOW:
|
||
if (__this->open_index) {
|
||
//从回放返回文件列表时
|
||
ui_set_call(file_list_flush, __this->flist_index);
|
||
} else {
|
||
ui_set_call(file_list_flush, 0);
|
||
/* file_list_flush(0); */
|
||
//刚进去文件列表时
|
||
__this->flist_index = 0;
|
||
}
|
||
break;
|
||
default:
|
||
return false;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
static int file_browse_onkey(void *ctr, struct element_key_event *e)
|
||
{
|
||
struct ui_grid *grid = (struct ui_grid *)ctr;
|
||
printf("ui key %s %d\n", __FUNCTION__, e->value);
|
||
int sel_item;
|
||
sel_item = ui_grid_cur_item(grid);
|
||
switch (e->value) {
|
||
case KEY_OK:
|
||
if (file_select_enter(__this->flist_index)) {
|
||
ui_no_highlight_element_by_id(LAYOUT_FNAME_LIST_ID[sel_item]);
|
||
__this->flist_index = 0;
|
||
file_list_flush(__this->flist_index);
|
||
ui_grid_set_item(grid, 0);
|
||
ui_highlight_element_by_id(LAYOUT_FNAME_LIST_ID[0]);
|
||
}
|
||
|
||
|
||
break;
|
||
case KEY_DOWN:
|
||
|
||
sel_item++;
|
||
|
||
__this->flist_index += 1;
|
||
|
||
if (sel_item >= __this->cur_total || __this->flist_index >= __this->cur_total) {
|
||
//大于文件数
|
||
ui_no_highlight_element_by_id(LAYOUT_FNAME_LIST_ID[sel_item - 1]);
|
||
__this->flist_index = 0;
|
||
file_list_flush(__this->flist_index);
|
||
ui_grid_set_item(grid, 0);
|
||
ui_highlight_element_by_id(LAYOUT_FNAME_LIST_ID[0]);
|
||
ui_vslider_set_persent_by_id(MUSIC_FILE_SLIDER, (__this->flist_index + 1) * 100 / __this->cur_total);
|
||
return TRUE;
|
||
}
|
||
ui_vslider_set_persent_by_id(MUSIC_FILE_SLIDER, (__this->flist_index + 1) * 100 / __this->cur_total);
|
||
if (sel_item >= TEXT_PAGE) {
|
||
ui_no_highlight_element_by_id(LAYOUT_FNAME_LIST_ID[sel_item - 1]);
|
||
file_list_flush(__this->flist_index);
|
||
ui_grid_set_item(grid, 0);
|
||
ui_highlight_element_by_id(LAYOUT_FNAME_LIST_ID[0]);
|
||
return true; //不返回到首项
|
||
}
|
||
|
||
return FALSE;
|
||
|
||
break;
|
||
case KEY_UP:
|
||
if (sel_item == 0) {
|
||
__this->flist_index = __this->flist_index ? __this->flist_index - 1 : __this->cur_total - 1;
|
||
ui_no_highlight_element_by_id(LAYOUT_FNAME_LIST_ID[sel_item]);
|
||
file_list_flush(__this->flist_index / TEXT_PAGE * TEXT_PAGE);
|
||
ui_grid_set_item(grid, __this->flist_index % TEXT_PAGE);
|
||
ui_highlight_element_by_id(LAYOUT_FNAME_LIST_ID[__this->flist_index % TEXT_PAGE]);
|
||
ui_vslider_set_persent_by_id(MUSIC_FILE_SLIDER, (__this->flist_index + 1) * 100 / __this->cur_total);
|
||
return true; //不跳转到最后一项
|
||
}
|
||
__this->flist_index--;
|
||
ui_vslider_set_persent_by_id(MUSIC_FILE_SLIDER, (__this->flist_index + 1) * 100 / __this->cur_total);
|
||
return FALSE;
|
||
break;
|
||
|
||
default:
|
||
return false;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
REGISTER_UI_EVENT_HANDLER(MUSIC_FILE_BROWSE)
|
||
.onchange = file_browse_enter_onchane,
|
||
.onkey = file_browse_onkey,
|
||
.ontouch = NULL,
|
||
};
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
#endif
|