140 lines
3.4 KiB
C
140 lines
3.4 KiB
C
/***************************************************
|
|
该demo主要是使用AT命令拍一张照片,前提要将jpeg打开
|
|
***************************************************/
|
|
#include "basic_include.h"
|
|
#include "stream_frame.h"
|
|
#include "lib/multimedia/msi.h"
|
|
#include "lib/heap/av_heap.h"
|
|
#include "osal_file.h"
|
|
void at_save_photo_thread(void *d);
|
|
struct AT_PHOTO
|
|
{
|
|
os_task_t task;
|
|
uint32_t photo_num;
|
|
uint8_t filename_prefix[4];
|
|
uint8_t running;
|
|
|
|
};
|
|
|
|
static struct AT_PHOTO *photo_s = NULL;
|
|
int32 demo_atcmd_save_photo(const char *cmd, char *argv[], uint32 argc)
|
|
{
|
|
#if OPENDML_EN && SDH_EN && FS_EN
|
|
if(argc < 2)
|
|
{
|
|
os_printf("%s argc too small:%d,should more 2 arg\n",__FUNCTION__,argc);
|
|
return 0;
|
|
}
|
|
if(os_atoi(argv[0]) == 0)
|
|
{
|
|
if(photo_s)
|
|
{
|
|
photo_s->running = 0;
|
|
}
|
|
else
|
|
{
|
|
os_printf("%s takephoto num err:%d\n",__FUNCTION__,os_atoi(argv[0]));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
if(photo_s)
|
|
{
|
|
os_printf("%s already running\n",__FUNCTION__);
|
|
return 0;
|
|
}
|
|
photo_s = av_malloc(sizeof(struct AT_PHOTO));
|
|
if(photo_s)
|
|
{
|
|
memset(photo_s,0,sizeof(struct AT_PHOTO));
|
|
//连续拍照多少张
|
|
photo_s->photo_num = os_atoi(argv[0]);
|
|
int prefix_len = strlen(argv[1]);
|
|
if(prefix_len > 3)
|
|
{
|
|
os_memcpy(photo_s->filename_prefix,argv[1],3);
|
|
}
|
|
else
|
|
{
|
|
os_memcpy(photo_s->filename_prefix,argv[1],prefix_len);
|
|
}
|
|
|
|
//创建拍照的任务
|
|
OS_TASK_INIT("at_photo", &photo_s->task, at_save_photo_thread, (uint32)photo_s, OS_TASK_PRIORITY_NORMAL, NULL, 1024);
|
|
}
|
|
#endif
|
|
return 0;
|
|
}
|
|
|
|
|
|
void at_save_photo_thread(void *d)
|
|
{
|
|
struct framebuff *get_f = NULL;
|
|
struct AT_PHOTO *p_s = (struct AT_PHOTO *)d;
|
|
struct msi *s = NULL;
|
|
uint32_t flen = 0;
|
|
char filename[64] = {0};
|
|
s = msi_new(R_AT_SAVE_PHOTO, 8, NULL);
|
|
if(!s)
|
|
{
|
|
goto at_save_photo_thread_end;
|
|
}
|
|
s->enable = 1;
|
|
p_s->running = 1;
|
|
void *fp = NULL;
|
|
uint32_t err_count = 0;
|
|
uint32_t total_len = 0;
|
|
uint8_t *frame_buf_addr = NULL;
|
|
|
|
while(p_s->photo_num && p_s->running)
|
|
{
|
|
get_f = msi_get_fb(s, 0);
|
|
if(get_f)
|
|
{
|
|
err_count = 0;
|
|
os_sprintf(filename,"0:photo/%s_%04d.jpg",p_s->filename_prefix,(uint32_t)os_jiffies()%9999);
|
|
os_printf("filename:%s\n",filename);
|
|
fp = osal_fopen((const char *)filename,"wb+");
|
|
if(!fp)
|
|
{
|
|
goto at_save_photo_thread_end;
|
|
}
|
|
flen = get_f->len;
|
|
total_len = flen;
|
|
frame_buf_addr = get_f->data;
|
|
|
|
osal_fwrite((void*)frame_buf_addr,1,total_len,fp);
|
|
|
|
msi_delete_fb(NULL, get_f);
|
|
get_f = NULL;
|
|
osal_fclose((F_FILE*)fp);
|
|
p_s->photo_num--;
|
|
}
|
|
else
|
|
{
|
|
err_count++;
|
|
os_sleep_ms(1);
|
|
if(err_count++ > 1000)
|
|
{
|
|
goto at_save_photo_thread_end;
|
|
}
|
|
}
|
|
|
|
}
|
|
at_save_photo_thread_end:
|
|
if(get_f)
|
|
{
|
|
msi_delete_fb(NULL, get_f);
|
|
get_f = NULL;
|
|
}
|
|
|
|
if(s)
|
|
{
|
|
msi_destroy(s);
|
|
}
|
|
p_s->running = 0;
|
|
av_free((void*)p_s);
|
|
photo_s = NULL;
|
|
}
|