KT24-1110_65E-HA-651B/apps/soundbox/smartbox/file_transfer/file_delete.c

337 lines
10 KiB
C
Raw Normal View History

2024-11-10 10:44:17 +00:00
#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