
/************************************************* 
 * Copyright (C), Xiongmai Information Technologies Co., Ltd. 2018-2019. All rights reserved. 
 * 文件名: maque_camera.h
 * 作者@编号: XM R&D @02479
 * 版本: V1.00
 * 创建日期: 2019.02.18
 * 功能描述: 定义设置摄像头相关参数结构体，声明相关对外接口。
 *
 * 修改历史:  
 ** 1.日期: 2019.02.18
 ** 修改者: XM R&D @02479
 ** 修改内容: 首次创建 。
 ** 2.日期: 2019.02.18
 ** 修改者: XM R&D @02479
 ** 修改内容: 完成了基础版。
 *************************************************/
 

#ifndef MAQUE_CAMERA_H
#define MAQUE_CAMERA_H


#ifdef __cplusplus
extern "C" {
#endif


typedef XM_S32(*MaQueIrCutCallbackFuncPtr) (XM_VOID *pUserArg, XM_S32 bNightMode);
typedef XM_S32(*MaQueDayNightCallbackFuncPtr) (XM_VOID *pUserArg, XM_S32 bNightMode);

typedef enum
{
	MAQUE_WB_MODE_AUTO,  	/* 自动白平衡模式 */
	MAQUE_WB_MODE_INDOOR,  	/* 室内。手动白平衡，暂不支持。 */
	MAQUE_WB_MODE_OUTDOOR   /* 室外。手动白平衡，暂不支持。  */
} MaQueWhiteBalanceMode_e;

typedef enum
{
	MAQUE_DNC_MODE_AUTO,			// 自动切换
	MAQUE_DNC_MODE_MULTICOLOR,		// 强制为彩色
	MAQUE_DNC_MODE_BLACKWHITE,		// 强制为黑白模式
	MAQUE_DNC_MODE_BUTT
} MaQueDncMode_e;  				// 白天黑夜颜色切换模式。

typedef enum 
{
	MAQUE_DNC_THRESHOLD_LEVEL_1 = 1,	/* 白天黑夜颜色切换阈值等级1，等级越小切换越灵敏。*/
	MAQUE_DNC_THRESHOLD_LEVEL_2,    	/* 白天黑夜颜色切换阈值等级2。*/
	MAQUE_DNC_THRESHOLD_LEVEL_3,    	/* 白天黑夜颜色切换阈值等级3。*/
	MAQUE_DNC_THRESHOLD_LEVEL_4,    	/* 白天黑夜颜色切换阈值等级4。*/
	MAQUE_DNC_THRESHOLD_LEVEL_5,    	/* 白天黑夜颜色切换阈值等级5。*/
} MaQueDncThresholdLevel_e;

typedef enum
{
    MAQUE_OP_TYPE_AUTO,     /* 自动。*/
    MAQUE_OP_TYPE_MANUAL,   /* 手动。*/
    MAQUE_OP_TYPE_BUTT
} MaQueOperationType_e;

typedef enum 
{
	MAQUE_IRCUT_SWITCH_SYN_INFRARED,	/* 与红外灯同步。*/
	MAQUE_IRCUT_SWITCH_AUTO,			/* 根据环境自动。*/
} MaQueIrCutMode_e;

typedef enum 
{
	MAQUE_MANUAL_EXP_LEVEL_1 = 1,		/* 1/50 秒 */
	MAQUE_MANUAL_EXP_LEVEL_2,    		/* 1/120 秒 */
	MAQUE_MANUAL_EXP_LEVEL_3,    		/* 1/250 秒 */
	MAQUE_MANUAL_EXP_LEVEL_4,    		/* 1/500 秒 */
	MAQUE_MANUAL_EXP_LEVEL_5,    		/* 1/1000 秒 */
	MAQUE_MANUAL_EXP_LEVEL_6,    		/* 1/2000 秒 */
	MAQUE_MANUAL_EXP_LEVEL_7,    		/* 1/4000 秒 */
	MAQUE_MANUAL_EXP_LEVEL_8,    		/* 1/10000 秒 */
} MaQueManualExpLevel_e;

typedef enum 
{
	MAQUE_ES_SHUTTER_LEVEL_NONE,	/* 电子慢快门不开启。*/	
	MAQUE_ES_SHUTTER_LEVEL_1,		/* 电子慢快门等级1。帧率设置为Sensor输出帧率的4/5。 */
	MAQUE_ES_SHUTTER_LEVEL_2,    	/* 电子慢快门等级2。帧率设置为Sensor输出帧率的1/2，最大曝光时间和等级1相同。 */
	MAQUE_ES_SHUTTER_LEVEL_3,    	/* 电子慢快门等级3。帧率设置为Sensor输出帧率的1/2，最大曝光时间比等级2大。 */
	MAQUE_ES_SHUTTER_LEVEL_4,    	/* 电子慢快门等级4。帧率设置为Sensor输出帧率的1/3，最大曝光时间比上一等级大。 */
	MAQUE_ES_SHUTTER_LEVEL_5,    	/* 电子慢快门等级5。帧率设置为Sensor输出帧率的1/4，最大曝光时间比上一等级大。 */
	MAQUE_ES_SHUTTER_LEVEL_BUTT, 
} MaQueEsShutterLevel_e;

typedef enum 
{
	MAQUE_NOISE_FILTER_LEVEL_NONE,	/* 噪声滤波不开启。*/	
	MAQUE_NOISE_FILTER_LEVEL_1,		/* 噪声滤波等级1。等级越大，降噪越明显。*/
	MAQUE_NOISE_FILTER_LEVEL_2,    	/* 噪声滤波等级2。等级越大，降噪越明显。*/
	MAQUE_NOISE_FILTER_LEVEL_3,    	/* 噪声滤波等级3。等级越大，降噪越明显。*/
	MAQUE_NOISE_FILTER_LEVEL_4,    	/* 噪声滤波等级4。等级越大，降噪越明显。*/
	MAQUE_NOISE_FILTER_LEVEL_5,    	/* 噪声滤波等级5。等级越大，降噪越明显。*/
	MAQUE_NOISE_FILTER_LEVEL_BUTT, 
} MaQueNoiseFilterLevel_e;

typedef enum 
{
	MAQUE_INFRARED_DAY,
	MAQUE_INFRARED_NIGHT,
	MAQUE_INFRARED_BUTT,
} MaQueInfraredState_e;

typedef enum
{
	MAQUE_LED_TYPE_IR,  /* 红外灯。*/
	MAQUE_LED_TYPE_WL,  /* 白光灯。*/
	MAQUE_LED_TYPE_BUTT,
} MaQueLedType_e;


typedef enum
{
	MAQUE_LED_MODE_AUTO,
	MAQUE_LED_MODE_MANUAL,
	MAQUE_LED_MODE_INTELL,
	MAQUE_LED_MODE_BUTT,
} MaQueLedMode_e;

typedef struct
{
	MaQueDncMode_e eDncMode;        	 			// 日夜颜色模式，取值有彩色、自动切换和黑白
	MaQueDncThresholdLevel_e eDncThresholdLevel;	// 日夜转换阈值等级。每个等级对应不同的曝光量，实际参考该曝光量，决定是否切换日夜模式。
													// 阈值等级越小切换越灵敏。只有当eDncWorkMode为MaQue_DNC_AUTO时，才有效。
} MaQueDayNightCfg_s;

typedef struct
{
	XM_S32 nCompensationLevel;     	// 自动曝光亮度补偿等级，[0，100]，用于调节曝光的目标亮度，值越大则图像亮度越高。
	XM_U32 minTime;					// 自动曝光时间下限，[0，maxTime]，单位微秒
	XM_U32 maxTime; 				// 自动曝光时间上限，[0，0xFFFFFFFF]，单位微秒
	XM_U32 maxSysGainLevel;			// 自动曝光最大系统增益等级，[0, 100]。用于设置当前最大系统增益。100对应的系统最大
									// 增益跟sensor有关。
} MaQueAutoExpParam_s;

typedef struct
{
	MaQueManualExpLevel_e eExpLevel;	/* 手动曝光等级。设置曝光时间。*/
} MaQueManualExpParam_s;

typedef struct
{
	MaQueOperationType_e eOpType;   	/* 曝光操作类型，分: 自动和手动两种。*/
	MaQueAutoExpParam_s stAutoExp;  	/* eOpType为MAQUE_OP_TYPE_AUTO时有效。*/
	MaQueManualExpParam_s stManualExp;	/* eOpType为MAQUE_OP_TYPE_MANUAL时有效。*/
} MaQueExposureCfg_s;

typedef struct
{
	XM_U8	brightness;		///< 亮度，取值0-100。
	XM_U8	contrast;		///< 对比度，取值0-100。
	XM_U8 	saturation;		///< 饱和度，取值0-100。
	XM_U8 	hue;			///< 色调，取值0-100。
	XM_U8 	gain;			///< 增益，取值0-100。bit7置位表示自动增益，其他位被忽略。
	XM_U8	whiteBalance;	///< 自动白电平控制，bit7置位表示开启自动控制.0x0,0x1,0x2分别代表低,中,高等级
	XM_U16	acutance;       	///< 锐度，取值0-15, 第8位表示水平锐度，高8为表示垂直锐度。
} MaQueColorCfg_s;


typedef struct 
{
	XM_U32 bOpen;				/* 灯状态: 0: Close, 1: Open */
	MaQueLedType_e eLedType;	/* 灯类型: 0x0: IR; 0x1: WL */
	MaQueLedMode_e eLedMode;	/* 灯模式: 0: Auto, 1: Manual */
} MaQueLedCfg_s;

/*
【功能描述】
	通过调试串口打印输出设置给Camera的参数。主要用于调试。
【参数】
	  参数名称			描述
	pOwner	[in]	调用者标识名，用于调试。
【返回值】
	无。
【注意】
	本API主要用于开发阶段调试。
*/
XM_VOID LibXmMaQue_Camera_printParam(XM_CHAR *pOwner);


/*
【功能描述】
	注册获取IrCut切换模式的回调函数。
【参数】
	  参数名称					描述
	channel	[in]			对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	pCallbackFuncPtr [in]	获取当前IrCut切换模式的回调函数。
	pCallbackArg [in]		传入的注册者私有结构体。将会在调用回调函数时，传给第一个参数。只有注册者使用，
							底层不关心具体内容，因此可为NULL。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	IrCut有白天和黑夜两种滤光片，切换时会通过本API注册的回调返回是否切换到了黑夜滤光片。
*/
XM_S32 LibXmMaQue_Camera_registerIrCutCallback(XM_S32 channel, MaQueIrCutCallbackFuncPtr pCallbackFuncPtr, XM_VOID *pCallbackArg);	

/*
【功能描述】
	注册白天黑夜模式切换回调。
【参数】
	  参数名称					描述
	channel	[in]			对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	pCallbackFuncPtr [in]	获取白天和黑夜切换模式的回调函数。
	pCallbackArg [in]		传入的注册者私有结构体。将会在调用回调函数时，传给第一个参数。只有注册者使用，
							底层不关心具体内容，因此可为NULL。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	摄像头在白天和黑夜会采用不同的IrCut滤光片，也会关闭或开启红外灯或白光灯，切换时会通过本API注册的
	回调返回是否切换到黑夜模式。
*/
XM_S32 LibXmMaQue_Camera_registerDayNightCallback(XM_S32 channel, MaQueDayNightCallbackFuncPtr pCallbackFuncPtr, XM_VOID *pCallbackArg);

/*
【功能描述】
	设置白平衡模式。
【参数】
	  参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	eWBMode	[in]	白平衡模式：自动或手动白平衡。目前暂时只支持自动。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_setWhiteBalanceMode(XM_S32 channel, MaQueWhiteBalanceMode_e eWBMode);

/*
【功能描述】
	获取当前白平衡模式。
【参数】
	  参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
【返回值】
	MaQueWhiteBalanceMode_e	白平衡模式，有：自动，室内，室外等。
*/
MaQueWhiteBalanceMode_e LibXmMaQue_Camera_getWhiteBalanceMode(XM_S32 channel);

/*
【功能描述】
	设置白天黑夜模式切换配置。
【参数】
	  参数名称			描述
	channel [in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	pstDncCfg [in]	白天和黑夜切换配置参数。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_setDayNightCfg(XM_S32 channel, MaQueDayNightCfg_s *pstDncCfg);

/*
【功能描述】
	获取白天黑夜模式切换配置。
【参数】
	  参数名称				描述
	channel	[in]		对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	pstDncCfg [out]		保存所得的白天和黑夜切换配置参数。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_getDayNightCfg(XM_S32 channel, MaQueDayNightCfg_s *pstDncCfg);

/*
【功能描述】
	设置曝光配置参数。
【参数】
	  参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	pstExpCfg [in]	曝光配置参数。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_setExposureCfg(XM_S32 channel, MaQueExposureCfg_s *pstExpCfg);

/*
【功能描述】
	获取曝光配置参数。
【参数】
	  参数名称				描述
	channel	[in]		对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	pstExpCfg [out]		保存获取的曝光配置参数。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_getExposureCfg(XM_S32 channel, MaQueExposureCfg_s *pstExpCfg);

/*
【功能描述】
	设置是否开启抗闪功能。
【参数】
	  参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	bEnabled [in]	是否开启抗闪功能。1：使能；0：关闭。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_setAntiFlicker(XM_S32 channel, XM_S32 bEnabled);

/*
【功能描述】
	查询是否开启抗闪功能。
【参数】
	  参数名称			描述
	channel [in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
【返回值】
	1	抗闪使能。
	0	抗闪关闭。
*/
XM_S32 LibXmMaQue_Camera_getAntiFlicker(XM_S32 channel);

/*
【功能描述】
	设置电子慢快门等级。
【参数】
	  参数名称				描述
	channel	[in]		对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	eEsShutterLevel		电子慢快门等级。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_setEsShutterLevel(XM_S32 channel, MaQueEsShutterLevel_e eEsShutterLevel);

/*
【功能描述】
	获取电子慢快门等级。
【参数】
	  参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
【返回值】
	MaQueEsShutterLevel_e	电子慢快门等级。
*/
MaQueEsShutterLevel_e LibXmMaQue_Camera_getEsShutterLevel(XM_S32 channel);

/*
【功能描述】
	使能或关闭背光补偿（BLC）。
【参数】
	  参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	bEnabled [in]	是否使能背光补偿功能。1：使能；0：关闭。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	开启背光补偿，会使暗区变亮，清晰度提高。在宽动态模式下，背光补偿设置无效。
*/
XM_S32 LibXmMaQue_Camera_enableBLC(XM_S32 channel, XM_S32 bEnabled);

/*
【功能描述】
	查询背光补偿功能是否开启。
【参数】
	  参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
【返回值】
	1		背光补偿使能。
	0		背光补偿关闭。
*/
XM_S32 LibXmMaQue_Camera_isBLCEnabled(XM_S32 channel);

/*
【功能描述】
	设置图像左右镜像。
【参数】
	  参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	bMirror	[in]	是否使能左右镜像。1：使能；0：关闭。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_setMirror(XM_S32 channel, XM_S32 bMirror);

/*
【功能描述】
	查询是否左右镜像使能。
【参数】
	  参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
【返回值】
	1		左右镜像开启。
	0		左右镜像关闭。
*/
XM_S32 LibXmMaQue_Camera_getMirror(XM_S32 channel);

/*
【功能描述】
	设置图像上下翻转。
【参数】
	  参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	bFlip  [in]		是否使能上下翻转功能。1：使能；0：关闭。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_setFlip(XM_S32 channel, XM_S32 bFlip);

/*
【功能描述】
	查询是否上下翻转使能。
【参数】
	  参数名称			描述
	channel [in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
【返回值】
	1		上下翻转使能。
	0		上下翻转关闭。
*/
XM_S32 LibXmMaQue_Camera_getFlip(XM_S32 channel);

/*
【功能描述】
	设置IrCut切换工作模式。
【参数】
	  参数名称				描述
	channel	[in] 		对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	eIrCutMode [in]		IrCut切换工作模式，有：与红外灯同步或自动。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
【注意】
	IrCut切换模式，只有通过前面API：LibXmMaQue_Camera_setDayNightCfg()把eDncMode设置为
	MAQUE_DNC_MODE_AUTO（自动）时才有效。如果设置为MaQue_DNC_MODE_MULTICOLOR（彩色）和
	MaQue_DNC_MODE_BLACKWHITE（黑白）模式，IrCut将会强制切换成满足相应颜色的模式。
*/
XM_S32 LibXmMaQue_Camera_setIrCutMode(XM_S32 channel, MaQueIrCutMode_e eIrCutMode);

/*
【功能描述】
	获取IrCut切换工作模式。
【参数】
	  参数名称			描述	
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
【返回值】
	MaQueIrCutMode_e	IrCut切换工作模式，有：与红外灯同步、自动等。
*/
MaQueIrCutMode_e LibXmMaQue_Camera_getIrCutMode(XM_S32 channel);

/*
【功能描述】
	设置IrCut反序。IrCut有白天和黑夜滤光片，不同型号可能切换方式不同，又无法通过软件简单判断。
	为了兼容，特设计了本Api，可以通过软件设置IrCut反序。
【参数】
	  参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	bReversed [in]	设置IrCut是否反序。1：反序；0：正常序。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_reverseIrCut(XM_S32 channel, XM_S32 bReversed);

/*
【功能描述】
	查询IrCut是否反序。
【参数】
	参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
【返回值】
	1		IrCut反序。
	0		正常序。
*/
XM_S32 LibXmMaQue_Camera_isIrCutReversed(XM_S32 channel);

/*
【功能描述】
	获取图像的颜色参数。
【参数】
	参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	pstColorCfg	[out] 图像的颜色参数，参考MaQueColorCfg_s 。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_getColor(XM_S32 channel, MaQueColorCfg_s *pstColorCfg);

/*
【功能描述】
	设置图像的颜色参数。
【参数】
	参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	pstColorCfg	[in] 图像的颜色参数，参考MaQueColorCfg_s 。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_setColor(XM_S32 channel, MaQueColorCfg_s *pstColorCfg);

/*
【功能描述】
	获取红外灯板光敏状态。
【参数】
	参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
【返回值】
	光敏状态值，参考MaQueInfraredState_e 。
*/
MaQueInfraredState_e LibXmMaQue_Camera_getInfrared(XM_S32 channel);

/*
【功能描述】
	控制灯板红外灯和白光灯。
【参数】
	参数名称			描述
	channel	[in]	对应sensor输入通道，从0开始。如果设备只有一个sensor该值应设置为0。
	pstLedCfg	[in] 灯的控制参数，参考MaQueLedCfg_s 。
【返回值】
	XM_SUCCESS		成功。
	其它			失败，请参考错误码。
*/
XM_S32 LibXmMaQue_Camera_setLed(XM_S32 channel, MaQueLedCfg_s *pstLedCfg);

#ifdef __cplusplus
}
#endif

#endif //MAQUE_CAMERA_H


