⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmicamera.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/*

	摄像头模块与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 + -