Initial commit: TXW82x FPV v2.7.0.7-42229 SDK + project sources
This commit is contained in:
127
sdk/app/file_msi/file_msi.c
Normal file
127
sdk/app/file_msi/file_msi.c
Normal file
@@ -0,0 +1,127 @@
|
||||
#include "basic_include.h"
|
||||
#include "lib/multimedia/msi.h"
|
||||
#include "lib/fs/fatfs/osal_file.h"
|
||||
#include "lib/heap/av_heap.h"
|
||||
#include "lib/heap/av_psram_heap.h"
|
||||
#include "stream_define.h"
|
||||
|
||||
// data申请空间函数
|
||||
#define STREAM_MALLOC av_psram_malloc
|
||||
#define STREAM_FREE av_psram_free
|
||||
#define STREAM_ZALLOC av_psram_zalloc
|
||||
|
||||
// 结构体申请空间函数
|
||||
#define STREAM_LIBC_MALLOC av_malloc
|
||||
#define STREAM_LIBC_FREE av_free
|
||||
#define STREAM_LIBC_ZALLOC av_zalloc
|
||||
|
||||
#define FILE_MAX_RECV 64
|
||||
struct file_msi_s
|
||||
{
|
||||
os_task_t task;
|
||||
struct msi *msi;
|
||||
};
|
||||
|
||||
// 没有实现退出功能
|
||||
static void file_thread(void *d)
|
||||
{
|
||||
struct file_msi_s *file_s = (struct file_msi_s *) d;
|
||||
struct framebuff *fb;
|
||||
struct framebuff *tmp_fb;
|
||||
void *fp;
|
||||
msi_get(file_s->msi);
|
||||
struct file_msg_s *file_msg;
|
||||
uint32_t write_max_len;
|
||||
uint32_t write_len;
|
||||
uint32_t res;
|
||||
while (1)
|
||||
{
|
||||
fb = msi_get_fb(file_s->msi, -1);
|
||||
if (fb)
|
||||
{
|
||||
file_msg = (struct file_msg_s *) fb->priv;
|
||||
os_printf(KERN_INFO "file_msg->path:%s\tlen:%d\tishid:%d\n", file_msg->path,fb->len,file_msg->ishid);
|
||||
// 暂时没有考虑不存在是否需要创建文件夹
|
||||
fp = osal_fopen_auto((const char*)file_msg->path, "w+", file_msg->ishid);
|
||||
if (fp)
|
||||
{
|
||||
tmp_fb = fb;
|
||||
write_max_len = fb->len;
|
||||
while(tmp_fb && write_max_len)
|
||||
{
|
||||
if(!tmp_fb->clone)
|
||||
{
|
||||
write_len = write_max_len>tmp_fb->len?tmp_fb->len:write_max_len;
|
||||
write_max_len -= write_len;
|
||||
res = osal_fwrite(tmp_fb->data, write_len, 1, fp);
|
||||
if(!res)
|
||||
{
|
||||
os_printf(KERN_ERR"write file err:%d\n",get_errno());
|
||||
break;
|
||||
}
|
||||
}
|
||||
tmp_fb = tmp_fb->next;
|
||||
}
|
||||
|
||||
// 这里需要轮询,找到不是clone的模块
|
||||
osal_fclose(fp);
|
||||
}
|
||||
else
|
||||
{
|
||||
os_printf(KERN_ERR"save file err:%d\n",get_errno());
|
||||
}
|
||||
msi_delete_fb(NULL, fb);
|
||||
}
|
||||
}
|
||||
msi_put(file_s->msi);
|
||||
}
|
||||
|
||||
int32_t file_msi_action(struct msi *msi, uint32_t cmd_id, uint32_t param1, uint32_t param2)
|
||||
{
|
||||
int32_t ret = RET_OK;
|
||||
struct file_msi_s *file_s = (struct file_msi_s *) msi->priv;
|
||||
(void)file_s;
|
||||
switch (cmd_id)
|
||||
{
|
||||
case MSI_CMD_POST_DESTROY:
|
||||
{
|
||||
}
|
||||
break;
|
||||
case MSI_CMD_PRE_DESTROY:
|
||||
{
|
||||
}
|
||||
break;
|
||||
|
||||
case MSI_CMD_TRANS_FB:
|
||||
{
|
||||
struct framebuff *fb = (struct framebuff *) param1;
|
||||
if (fb->mtype != F_FILE_T)
|
||||
{
|
||||
ret = RET_ERR;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct msi *file_msi_init(const char *msi_name)
|
||||
{
|
||||
uint8_t is_new;
|
||||
struct file_msi_s *file_s;
|
||||
struct msi *msi = msi_new(msi_name, FILE_MAX_RECV, &is_new);
|
||||
if (is_new)
|
||||
{
|
||||
file_s = (struct file_msi_s *) STREAM_LIBC_ZALLOC(sizeof(struct file_msi_s));
|
||||
msi->priv = (void *) file_s;
|
||||
file_s->msi = msi;
|
||||
msi->action = file_msi_action;
|
||||
msi->enable = 1;
|
||||
OS_TASK_INIT("file_s_task", &file_s->task, file_thread, file_s, OS_TASK_PRIORITY_HIGH-1, NULL, 1500);
|
||||
}
|
||||
|
||||
return msi;
|
||||
}
|
||||
Reference in New Issue
Block a user