📄 mmicamera.c
字号:
/*
摄像头模块与mmi的接口代码
2004.7.1 WYJ 整理
2004.7.8 WYJ 加入部分驱动,基础版本
2004.7.15 WYJ 完成基本功能
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#if defined (NEW_FRAME)
#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"
#else /* NEW_FRAME */
#include "stddefs.h"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"
#endif /* NEW_FRAME */
#include "Mfw_sys.h"
#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.h"
#include "mfw_edt.h"
#include "mfw_tim.h"
#include "mfw_phb.h"
#include "mfw_sms.h"
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_lng.h"
#include "mfw_sat.h"
#include "mfw_kbd.h"
#include "mfw_nm.h"
#include "Mfw_cm.h"
#include "dspl.h"
#include "MmiMmi.h"
#include "MmiMain.h"
#include "MmiDummy.h"
#include "MmiDialogs.h"
#include "MmiLists.h"
#include "MmiCall.h"
#include "MmiMenu.h"
#include "MmiSoftKeys.h"
#include "MmiResources.h"
#include "MmiBlkLangDB.h"
#include "MmiBookUtils.h"
#include "MmiEditor.h"
#include "MmiEditor_i.h"
#include "MmiBookshared.h"
#include "mmiSmsMenu.h"
#include "Mmismssend.h"
#include "mmiutilapi.h"
#include "mmidialogs.h"
#include "mmitextinput.h"
#include "mmisounds_defs.h"
#include "GameDisplay.h" //yangx Add
#include "mmicamera.h"
#include "mmiutilapi.h"
/* camera 驱动接口函数 */
#include "cam_api.h"
/* camera 状态变量 */
CAMEXT CamExt;
//extern unsigned long jpg_buf[1024*20];
extern unsigned char jpg_buf[1024*20*4];
// trace
#define TRACE(s) MI_dbgPrintf s
//#define TRACE(s)
// 动态分配空间失败,暂时使用静态空间
//unsigned char tmpjpg[176*240*4];
extern const unsigned char bm_bkg[];
// capture窗口显示用图片 有待扩展
/***********************************************************************************
*
* 模块: 文件管理模块
*
* 描述: 对ffs进行操作,负责camera部分添加删除记录等工作
*
* 历史: 2004.7.1 WYJ 创建
*
***********************************************************************************/
/* 模块内部使用的宏 */
/* 文件接口属性 */
#define MAX_CAM_FILE 10 // 存储文件数量
#define MAX_CAM_CAPACITY (1024*200) // 最大容量暂定100k
#define MAX_CAM_NAME 15 // 最大文件名长度,实际是6个汉字
#define CAM_FATH "/cam" // 默认路径
#define CAM_CONFFILE "/cam/filecon"//图片文件控制管理文件名
#define CAM_OPTION_FILE "/cam/option" //属性文件
/* 模块内部使用的结构体 */
// 每个图片文件信息
typedef struct
{
int jpg_type; // jpg图片分辨率
int size; // 图片大小
char flag; // 记录是否为空,0 表示记录为空
char file_name[MAX_CAM_NAME]; // 用户定义的文件名
}Flash_CAMFile;
// 图片文件信息
typedef struct
{
int capacity; // 当前ffs里所有图片文件容量之和
int file_sum; // 文件数量
char index[MAX_CAM_FILE]; // cam_file的索引表, 以用户拍摄顺序为索引
Flash_CAMFile cam_file[MAX_CAM_FILE]; // 文件信息数组
}Flash_CAM;
// camera需保存的参数
typedef struct
{
CAMU16 m_nCurSize;
CAMU16 m_nJPEGQFactor;
int melody;
}Flash_CAM_OPTION;
typedef struct{
T_MMI_CONTROL mmi_control;
T_MFW_HND parent_win;
T_MFW_HND win;
T_MFW_HND kbd;
UBYTE frame_index;
}CAM_OSD;
CAM_OSD Cam_osd_data;
/* 模块函数声明 */
static int IsCamFfs_Full(int newfile);
static int Add_One_Record(char *name, unsigned char *pPic, int size/*, int jpgtype*/);
static int Delete_One_Record(int index);
static int Delete_All(void);
/* 全局变量的定义 */
Flash_CAM cam_control; //与ffs里图片文件控制管理文件同步的数组
Flash_CAM_OPTION cam_option;
/*
* 描述: camera 需要用到的文件系统的初始化,将ffs内容读到变量cam_control
* 若目录为空,就创建目录及文件
* 返回: 0:成功
*/
int Cam_Ffs_Init()
{
T_FFS_DIR dir; // no use to user
int status; // 返回值
T_FFS_STAT s; // ffs api 需要
/* 创建目录 */
status = ffs_opendir(CAM_FATH, &dir);
TRACE(("ffs_opendir: %d", status));
if(status <= EFFS_OK) // 目录不存在
{
status = ffs_mkdir(CAM_FATH);
TRACE(("ffs_mkdir: %d", status));
}
/* 读数据到cam_control */
status = ffs_stat(CAM_CONFFILE, &s);
TRACE(("ffs_stat(CAM_CONFFILE, s): %d", status));
if(status != EFFS_NOTFOUND) // 文件已存在,读数据
{
status = ffs_fread(CAM_CONFFILE, &cam_control, sizeof(Flash_CAM));
TRACE(("ffs_fread return:%d", status));
}
else // 创建一个初始化文件
{
memset(&cam_control, 0, sizeof(Flash_CAM));
status = ffs_fwrite(CAM_CONFFILE, &cam_control, sizeof(Flash_CAM));
TRACE(("ffs_fwrite return:%d", status));
}
/* 读数据到cam_option */
status = ffs_stat(CAM_OPTION_FILE, &s);
TRACE(("ffs_stat(CAM_CONFFILE, s): %d", status));
if(status != EFFS_NOTFOUND) // 文件已存在,读数据
{
status = ffs_fread(CAM_OPTION_FILE, &cam_option, sizeof(Flash_CAM_OPTION));
TRACE(("ffs_fread return:%d", status));
CamExt.m_nCurSize = cam_option.m_nCurSize;
CamExt.m_nJPEGQFactor = cam_option.m_nJPEGQFactor;
}
else // 创建一个初始化文件
{
memset(&cam_control, 0, sizeof(Flash_CAM));
status = ffs_fwrite(CAM_OPTION_FILE, &cam_option, sizeof(Flash_CAM_OPTION));
TRACE(("ffs_fwrite return:%d", status));
}
return 1;
}
/*
* 描述: 判断camera ffs空间是否已满,包括文件数量及总大小
* 返回: 1:满
*/
static int IsCamFfs_Full(int newfile)
{
if(cam_control.file_sum == MAX_CAM_FILE || cam_control.capacity+newfile > MAX_CAM_CAPACITY)
{
TRACE(("M2C: CamFfs Full"));
return 1;
}
else
{
TRACE(("M2C: CamFfs not Full"));
return 0;
}
}
/*
* 描述: 判断camera ffs是否为空,删除时用到
* 返回: 1:空
*/
static int IsCamFfs_Empty(void)
{
if(cam_control.file_sum)
return 0;
else
return 1;
}
/*
* 描述: 添加一张图片记录
* 返回: -1: 磁盘满 -2: 磁盘操作有错 0:成功
*/
static int Add_One_Record(char * name, unsigned char * pPic, int size/*, int jpgtype*/)
{
char ffsname[20]; // ffs文件名
int i, j;
int status;
// 检查
if(IsCamFfs_Full(size))
return -1;
// 找一个空位
i = find_One_Space();
if(i == -1)
return -1;
/* 添加一条图片记录 */
/* 写ffs图片文件 */
memset(ffsname, 0, sizeof(ffsname));
sprintf(ffsname, "%s/%02d.jpg", CAM_FATH, i);
status = ffs_fwrite(ffsname, pPic, size);
TRACE(("ffs_fwrite return:%d", status));
if(status != EFFS_OK)
return -2;
/* 更新 cam_control 数据 */
cam_control.index[cam_control.file_sum] = i;
cam_control.cam_file[i].size = size;
// cam_control.cam_file[i].jpg_type = jpgtype; //Marked by Cathy
memcpy(cam_control.cam_file[i].file_name, name, MAX_CAM_NAME);
cam_control.cam_file[i].flag = 1;
cam_control.file_sum++;
cam_control.capacity += size;
status = ffs_fwrite(CAM_CONFFILE, &cam_control, sizeof(Flash_CAM));
TRACE(("ffs_fwrite return:%d", status));
if(status != EFFS_OK)
return -2;
return 0;
}
/*
* 描述: 删除一张图片
* 参数: 索引index: 0 - cam_control.file_sum
* 返回: 0:成功
*/
static int Delete_One_Record(int index)
{
int i;
int file_pos; // 要删除的cam_file文件序号
char ffsname[20]; // ffs文件名
int status;
file_pos = cam_control.index[index];
/* 修改索引表 */
for(i=0; i<MAX_CAM_FILE-index-1; i++)
cam_control.index[index+i] = cam_control.index[index+i+1];
/* 删除图片文件 */
cam_control.cam_file[file_pos].flag = 0;
memset(ffsname, 0, sizeof(ffsname));
sprintf(ffsname, "%s/%02d.jpg", CAM_FATH, file_pos);
status = ffs_remove(ffsname);
TRACE(("ffs_remove return:%d", status));
/* 修改总容量及图片数量 */
cam_control.capacity -= cam_control.cam_file[file_pos].size;
cam_control.file_sum--;
/* 写ffs操作 */
status = ffs_fwrite(CAM_CONFFILE, &cam_control, sizeof(Flash_CAM));
TRACE(("ffs_fwrite return:%d", status));
return 0;
}
/*
* 描述: 删除所有图片文件
* 返回: 0:成功
*/
static int Delete_All(void)
{
int i;
int status;
char ffsname[20]; // ffs文件名
/* 删除所有图片文件 */
for(i=0; i<cam_control.file_sum; i++)
{
memset(ffsname, 0, sizeof(ffsname));
sprintf(ffsname, "%s/%02d.jpg", CAM_FATH, cam_control.index[i]);
status = ffs_remove(ffsname);
TRACE(("ffs_remove return:%d", status));
}
/* 初始化控制文件 */
memset(&cam_control, 0, sizeof(Flash_CAM));
status = ffs_fwrite(CAM_CONFFILE, &cam_control, sizeof(Flash_CAM));
TRACE(("ffs_fwrite return:%d", status));
return 0;
}
/*
* 描述: 找到一个cam_control.cam_file 里的空位
* 返回: -1:没有空间 其他:索引位置
*/
int find_One_Space()
{
int i;
for(i=0; i<MAX_CAM_FILE; i++)
{
if(cam_control.cam_file[i].flag == 0)
return i;
}
return -1;
}
/***********************************************************************************
*
* 模块: 驱动接口模块
*
* 描述: 提供给mmi驱动的接口
*
* 历史: 2004.7.1 WYJ 创建
*
***********************************************************************************/
/* 设置Camera状态 */
#define M2C_START_PREVIEW 1 // 开始预览
#define M2C_STOP_PREVIEW 2 // 停止预览
#define M2C_CAPTURE 3 // 捕获一幅图片
#define M2C_SWITCH_OFF 4 // 关camera
#define M2C_SWITCH_ON 5 // 开camera
/* 对底层进行操作 */
Boolean CaptureJpeg(void); //added by cathy
static int M2C_Set_Camera_State(int state);
static int M2C_Disp_Saved_Pic(int index);
static int M2C_Disp_Captured_Pic(void);
static int M2C_Get_Captured_Size(void);
static int M2C_Get_Captured_Pic(unsigned char *p/*, int size*/);
static void M2C_Control_Refresh(int flag);
/*
* 描述: 调用底层接口,对camera状态进行操作
* 返回: 1: 成功
*/
static int M2C_Set_Camera_State(int state)
{
PREVIEWINFO prvinfo;
char name[] = {'P','h','o','t','o','\0'};
int i;
UINT32 addr1,addr2;
switch(state)
{
case M2C_SWITCH_ON:
TRACE(("M2C: switch on"));
//Camera_OnEnterCamera(); //Marked by Cathy
return 1;
case M2C_START_PREVIEW:
TRACE(("M2C: start preview"));
//Camera_PreviewOn(); //Marked by Cathy
// Overlay_Windows_Update(0,0,0,0,0);
CamPreview_On();
//end cathy
// M2C_Control_Refresh(R2D_REFRESH_DISABLE);
return 1;
case M2C_STOP_PREVIEW:
TRACE(("M2C: stop preview"));
// Camera_OnExitCamera(); //Marked by Cathy
CamPreview_Off();
Exit_Camera_Mode();
// M2C_Control_Refresh(R2D_REFRESH_ENABLE);
return 1;
case M2C_CAPTURE:
TRACE(("M2C: start capture"));
//Camera_StillCapture(); //Marked by Cathy
Camera_OnCapture();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -