337 lines
10 KiB
C
337 lines
10 KiB
C
#include "file_delete.h"
|
||
#include "smartbox/smartbox.h"
|
||
#include "system/includes.h"
|
||
#include "system/fs/fs.h"
|
||
#include "btstack_3th_protocol_user.h"
|
||
#include "dev_manager.h"
|
||
#include "key_event_deal.h"
|
||
#include "app_task.h"
|
||
#include "common/dev_status.h"
|
||
#include "bt/bt.h"
|
||
#include "common/dev_status.h"
|
||
#include "app_task.h"
|
||
#include "app_msg.h"
|
||
#include "clock_cfg.h"
|
||
#include "file_operate/file_manager.h"
|
||
|
||
#if (SMART_BOX_EN && TCFG_DEV_MANAGER_ENABLE)
|
||
|
||
#define FILE_DELELET_TIMEOUT (10*1000)
|
||
|
||
#define FILE_DEL_DEBUG_EN
|
||
#ifdef FILE_DEL_DEBUG_EN
|
||
#define file_del_printf printf
|
||
#else
|
||
#define file_del_printf(...)
|
||
#endif
|
||
|
||
struct __file_del {
|
||
struct __dev *dev;//当前设备节点
|
||
struct vfscan *fsn;//设备扫描句柄
|
||
u8 scandisk_break;
|
||
u8 busy;
|
||
u16 timerout;
|
||
void (*end_callback)(void);
|
||
};
|
||
|
||
struct __file_del *file_d = NULL;
|
||
#define __this file_d
|
||
|
||
///播放参数,文件扫描时用,文件后缀等
|
||
static const char scan_parm[] = "-t"
|
||
#if (TCFG_DEC_MP3_ENABLE)
|
||
"MP1MP2MP3"
|
||
#endif
|
||
#if (TCFG_DEC_WMA_ENABLE)
|
||
"WMA"
|
||
#endif
|
||
#if ( TCFG_DEC_WAV_ENABLE || TCFG_DEC_DTS_ENABLE)
|
||
"WAVDTS"
|
||
#endif
|
||
#if (TCFG_DEC_FLAC_ENABLE)
|
||
"FLA"
|
||
#endif
|
||
#if (TCFG_DEC_APE_ENABLE)
|
||
"APE"
|
||
#endif
|
||
#if (TCFG_DEC_M4A_ENABLE)
|
||
"M4AAAC"
|
||
#endif
|
||
#if (TCFG_DEC_M4A_ENABLE || TCFG_DEC_ALAC_ENABLE)
|
||
"MP4"
|
||
#endif
|
||
#if (TCFG_DEC_AMR_ENABLE)
|
||
"AMR"
|
||
#endif
|
||
#if (TCFG_DEC_DECRYPT_ENABLE)
|
||
"SMP"
|
||
#endif
|
||
#if (TCFG_DEC_MIDI_ENABLE)
|
||
"MID"
|
||
#endif
|
||
" -sn -r"
|
||
;
|
||
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 文件删除扫盘匹配文件过程系统消息获取处理接口
|
||
@param
|
||
@return 1:中断文件扫描处理, 0:继续扫盘
|
||
@note 可以在这个函数内相应所需的消息事件
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
static int file_delete_scandisk_break(void)
|
||
{
|
||
///注意:
|
||
///需要break fsn的事件, 请在这里拦截,
|
||
int msg[32] = {0};
|
||
struct sys_event *event = NULL;
|
||
char *logo = NULL;
|
||
char *evt_logo = NULL;
|
||
app_task_get_msg(msg, ARRAY_SIZE(msg), 0);
|
||
switch (msg[0]) {
|
||
case APP_MSG_SYS_EVENT:
|
||
event = (struct sys_event *)(&msg[1]);
|
||
switch (event->type) {
|
||
case SYS_DEVICE_EVENT:
|
||
switch ((u32)event->arg) {
|
||
case DRIVER_EVENT_FROM_SD0:
|
||
case DRIVER_EVENT_FROM_SD1:
|
||
case DRIVER_EVENT_FROM_SD2:
|
||
evt_logo = (char *)event->u.dev.value;
|
||
case DEVICE_EVENT_FROM_OTG:
|
||
if ((u32)event->arg == DEVICE_EVENT_FROM_OTG) {
|
||
evt_logo = (char *)"udisk0";
|
||
}
|
||
///设备上下线底层推出的设备逻辑盘符是跟跟音乐设备一致的(音乐/录音设备, 详细看接口注释)
|
||
logo = dev_manager_get_phy_logo(__this->dev);
|
||
///响应设备插拔打断
|
||
if (event->u.dev.event == DEVICE_EVENT_OUT) {
|
||
log_i("__func__ = %s logo=%s evt_logo=%s \n", __FUNCTION__, logo, evt_logo);
|
||
if (logo && evt_logo && (0 == strcmp(logo, evt_logo))) {
|
||
///相同的设备才响应
|
||
__this->scandisk_break = 1;
|
||
}
|
||
} else {
|
||
///响应新设备上线
|
||
__this->scandisk_break = 1;
|
||
}
|
||
if (__this->scandisk_break == 0) {
|
||
log_i("__func__ = %s DEVICE_EVENT_OUT TODO\n", __FUNCTION__);
|
||
dev_status_event_filter(event);
|
||
log_i("__func__ = %s DEVICE_EVENT_OUT OK\n", __FUNCTION__);
|
||
}
|
||
break;
|
||
}
|
||
break;
|
||
case SYS_BT_EVENT:
|
||
if (bt_background_event_handler_filter(event)) {
|
||
__this->scandisk_break = 1;
|
||
}
|
||
break;
|
||
case SYS_KEY_EVENT:
|
||
switch (event->u.key.event) {
|
||
case KEY_CHANGE_MODE:
|
||
///响应切换模式事件
|
||
__this->scandisk_break = 1;
|
||
break;
|
||
}
|
||
if (__this->scandisk_break) {
|
||
app_task_put_key_msg(event->u.key.event, (int)event->u.key.value);
|
||
return -1;
|
||
}
|
||
break;
|
||
}
|
||
break;
|
||
}
|
||
if (__this->scandisk_break) {
|
||
///查询到需要打断的事件, 返回1, 并且重新推送一次该事件,跑主循环处理流程
|
||
file_del_printf("\n--func=%s, line=%d\n", __FUNCTION__, __LINE__);
|
||
sys_event_notify(event);
|
||
file_del_printf("scandisk_break!!!!!!\n");
|
||
return 1;
|
||
} else {
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
static void scan_enter(struct __dev *dev)
|
||
{
|
||
__this->busy = 1;
|
||
clock_add_set(SCAN_DISK_CLK);
|
||
}
|
||
|
||
static void scan_exit(struct __dev *dev)
|
||
{
|
||
clock_remove_set(SCAN_DISK_CLK);
|
||
__this->busy = 0;
|
||
}
|
||
|
||
static const struct __scan_callback scan_cb = {
|
||
.enter = scan_enter,
|
||
.exit = scan_exit,
|
||
.scan_break = file_delete_scandisk_break,
|
||
};
|
||
|
||
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 文件删除超时处理
|
||
@param
|
||
@return
|
||
@note 这里是等待手机删除命令超时(即没有等到删除命令)
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
static void file_delete_timeout(void *p)
|
||
{
|
||
//批量删除超时, 退出删除流程
|
||
if (__this && __this->timerout) {
|
||
file_del_printf("file_delete_timeout !!\n");
|
||
file_delete_end();
|
||
}
|
||
}
|
||
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 文件删除结束处理
|
||
@param
|
||
@return
|
||
@note 释放资源
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
void file_delete_end(void)
|
||
{
|
||
if (__this) {
|
||
dev_manager_scan_disk_release(__this->fsn);
|
||
if (__this->timerout) {
|
||
sys_timeout_del(__this->timerout);
|
||
__this->timerout = 0;
|
||
}
|
||
if (__this->end_callback) {
|
||
__this->end_callback();
|
||
}
|
||
free(__this);
|
||
__this = NULL;
|
||
file_del_printf("file_delete_end\n");
|
||
}
|
||
}
|
||
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 文件删除开始处理
|
||
@param OpCode_SN:命名包的sn码, 命名回复时用到
|
||
@return
|
||
@note
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
void file_delete_start(u8 OpCode_SN, u8 *data, u16 len)
|
||
{
|
||
FILE *file = NULL;
|
||
u8 reason = 0;
|
||
u8 last = data[0];
|
||
u32 dev_handle = READ_BIG_U32(data + 1);
|
||
u8 type = data[5];
|
||
u32 sclust = READ_BIG_U32(data + 6);
|
||
file_del_printf("last = %d,dev_handle = %d,sclust = %d,type = %d,\n", last, dev_handle, sclust, type);
|
||
|
||
char *logo = smartbox_browser_dev_remap(dev_handle);
|
||
if (logo == NULL) {
|
||
goto __err;
|
||
}
|
||
|
||
if (__this == NULL) {
|
||
__this = zalloc(sizeof(struct __file_del));
|
||
if (__this == NULL) {
|
||
goto __err;
|
||
}
|
||
}
|
||
|
||
if (__this->timerout) {
|
||
sys_timeout_del(__this->timerout);
|
||
__this->timerout = 0;
|
||
}
|
||
|
||
if (__this->fsn == NULL) {
|
||
__this->dev = dev_manager_find_spec(logo, 0);
|
||
if (__this->dev) {
|
||
__this->fsn = dev_manager_scan_disk(__this->dev, NULL, scan_parm, 0, &scan_cb);
|
||
if (__this->fsn == NULL) {
|
||
free(__this);
|
||
__this = NULL;
|
||
goto __err;
|
||
}
|
||
file_del_printf("%s, fscan ok\n", __FUNCTION__);
|
||
}
|
||
} else {
|
||
file_del_printf("%s, fscan aready\n", __FUNCTION__);
|
||
if (__this->busy) {
|
||
//正在执行删除, 回复APP繁忙
|
||
printf("file delete busy\n");
|
||
JL_CMD_response_send(JL_OPCODE_FILE_DELETE, JL_PRO_STATUS_BUSY, OpCode_SN, NULL, 0);
|
||
return ;
|
||
}
|
||
}
|
||
|
||
file = file_manager_select(__this->dev, __this->fsn, FSEL_BY_SCLUST, sclust, &scan_cb);//根据文件簇号查找断点文件
|
||
if (file) {
|
||
fdelete(file);
|
||
file_del_printf("delete file ok!!\n");
|
||
JL_CMD_response_send(JL_OPCODE_FILE_DELETE, JL_PRO_STATUS_SUCCESS, OpCode_SN, NULL, 0);
|
||
if (last == 0) {
|
||
if (__this->timerout == 0) {
|
||
__this->timerout = sys_timeout_add(NULL, file_delete_timeout, FILE_DELELET_TIMEOUT);
|
||
} else {
|
||
sys_timer_modify(__this->timerout, FILE_DELELET_TIMEOUT);
|
||
}
|
||
//批量删除, 还没有删除完毕, 等待继续删除
|
||
file_del_printf("wait delete file more\n");
|
||
return;
|
||
}
|
||
} else {
|
||
file_del_printf("file delete, no this file\n");
|
||
JL_CMD_response_send(JL_OPCODE_FILE_DELETE, JL_PRO_STATUS_PARAM_ERR, OpCode_SN, NULL, 0);
|
||
}
|
||
file_delete_end();
|
||
return ;
|
||
|
||
__err:
|
||
JL_CMD_response_send(JL_OPCODE_FILE_DELETE, JL_PRO_STATUS_FAIL, OpCode_SN, NULL, 0);
|
||
file_delete_end();
|
||
}
|
||
|
||
|
||
//*----------------------------------------------------------------------------*/
|
||
/**@brief 文件删除初始化
|
||
@param end_callback:文件删除结束回调处理
|
||
@return
|
||
@note
|
||
*/
|
||
/*----------------------------------------------------------------------------*/
|
||
void file_delete_init(void (*end_callback)(void))
|
||
{
|
||
if (__this) {
|
||
printf("file_delete_init aready err!!\n");
|
||
return ;
|
||
}
|
||
__this = zalloc(sizeof(struct __file_del));
|
||
if (__this == NULL) {
|
||
printf("file_delete_init fail\n");
|
||
if (end_callback) {
|
||
end_callback();
|
||
}
|
||
return ;
|
||
}
|
||
__this->end_callback = end_callback;
|
||
//启动定时器, 防止APP后续没有发执行删除的命令过来, 可以超时退出
|
||
__this->timerout = sys_timeout_add(NULL, file_delete_timeout, 2000);
|
||
}
|
||
#else
|
||
void file_delete_init(void (*end_callback)(void))
|
||
{
|
||
}
|
||
void file_delete_start(u8 OpCode_SN, u8 *data, u16 len)
|
||
{
|
||
}
|
||
void file_delete_end(void)
|
||
{
|
||
}
|
||
#endif
|
||
|
||
|