KT24-1110_65E-HA-651B/apps/soundbox/ui/lcd/STYLE_02/file_brower.c
2024-11-10 18:44:17 +08:00

372 lines
10 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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