/*********************************************************************************************************************
* TC264 Opensourec Library 即（TC264 开源库）是一个基于官方 SDK 接口的第三方开源库
* Copyright (c) 2022 SEEKFREE 逐飞科技
*
* 本文件是 TC264 开源库的一部分
*
* TC264 开源库 是免费软件
* 您可以根据自由软件基金会发布的 GPL（GNU General Public License，即 GNU通用公共许可证）的条款
* 即 GPL 的第3版（即 GPL3.0）或（您选择的）任何后来的版本，重新发布和/或修改它
*
* 本开源库的发布是希望它能发挥作用，但并未对其作任何的保证
* 甚至没有隐含的适销性或适合特定用途的保证
* 更多细节请参见 GPL
*
* 您应该在收到本开源库的同时收到一份 GPL 的副本
* 如果没有，请参阅<https://www.gnu.org/licenses/>
*
* 额外注明：
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明（即本声明）
*
* 文件名称          zf_device_mt9v03x_double
* 公司名称          成都逐飞科技有限公司
* 版本信息          查看 libraries/doc 文件夹内 version 文件 版本说明
* 开发环境          ADS v1.10.2
* 适用平台          TC264D
* 店铺链接          https://seekfree.taobao.com/
*
* 修改记录
* 日期              作者                备注
* 2025-07-09       pudding            first version
********************************************************************************************************************/

#ifndef _zf_device_mt9v03x_double_h_
#define _zf_device_mt9v03x_double_h_

#include "zf_common_typedef.h"
#include "zf_device_type.h"

//================================================定义 MT9V03X 双摄像头 基本配置================================================
#define MT9V03X_1_COF_IIC_DELAY   (800)                                             // 总钻风摄像头1 IIC 延时
#define MT9V03X_1_COF_IIC_SCL     (P33_13)                                          // 总钻风摄像头1 IIC-SCL 引脚
#define MT9V03X_1_COF_IIC_SDA     (P32_4)                                           // 总钻风摄像头1 IIC-SDA 引脚

#define MT9V03X_1_DMA_CH          (IfxDma_ChannelId_7)

#define MT9V03X_1_PCLK_PIN        (ERU_CH1_REQ10_P14_3)                             // 总钻风摄像头1 PCLK 触发信号 TIM_ETR 引脚禁止随意修改
#define MT9V03X_1_VSYNC_PIN       (ERU_CH4_REQ8_P33_7)                              // 总钻风摄像头1 场中断引脚

#define MT9V03X_1_DATA_PIN        (P00_0)                                           // 总钻风摄像头1 数据引脚 这里是 只能是 GPIOx0 或者 GPIOx8 开始 连续八个引脚例如 P00_0-P00_7
#define MT9V03X_1_DATA_ADD        (get_port_in_addr(MT9V03X_1_DATA_PIN))

#define MT9V03X_1_INIT_TIMEOUT    (0x0080)                                          // 总钻风摄像头1 默认的摄像头初始化超时时间 毫秒为单位


#define MT9V03X_2_COF_IIC_DELAY   (800)                                             // 总钻风摄像头2 IIC 延时
#define MT9V03X_2_COF_IIC_SCL     (P13_1)                                           // 总钻风摄像头2 IIC-SCL 引脚
#define MT9V03X_2_COF_IIC_SDA     (P13_0)                                           // 总钻风摄像头2 IIC-SDA 引脚

#define MT9V03X_2_DMA_CH          (IfxDma_ChannelId_6)

#define MT9V03X_2_PCLK_PIN        (ERU_CH2_REQ2_P10_2)                              // 总钻风摄像头2 PCLK 触发信号 TIM_ETR 引脚禁止随意修改
#define MT9V03X_2_VSYNC_PIN       (ERU_CH3_REQ3_P10_3)                              // 总钻风摄像头2 场中断引脚

#define MT9V03X_2_DATA_PIN        (P02_0)                                           // 总钻风摄像头2 数据引脚 这里是 只能是 GPIOx0 或者 GPIOx8 开始 连续八个引脚例如 P00_0-P00_7
#define MT9V03X_2_DATA_ADD        (get_port_in_addr(MT9V03X_2_DATA_PIN))

#define MT9V03X_2_INIT_TIMEOUT    (0x0080)                                          // 总钻风摄像头2 默认的摄像头初始化超时时间 毫秒为单位


#define MT9V03X_INIT_INTV_DELAY    (0)                                            //摄像头初始化间隔延时,调节这个延时可增加高帧率运行时长。范围0-3（单位MS）

//================================================定义 MT9V03X 双摄像头 基本配置================================================


//================================================定义 MT9V03X 双摄像头 参数配置================================================
#define MT9V03X_1_W               (188)                                             // 总钻风摄像头1 图像宽度     范围 [1-752]
#define MT9V03X_1_H               (120)                                             // 总钻风摄像头1 图像高度     范围 [1-480]

#define MT9V03X_1_IMAGE_SIZE      (MT9V03X_1_W * MT9V03X_1_H)                       // 总钻风摄像头1 整体图像大小不能超过 65535

#define MT9V03X_1_AUTO_EXP_DEF    ( 0   )                                           // 总钻风摄像头1 自动曝光设置     默认不开启自动曝光设置  范围 [0-63] 0为关闭
                                                                                    //                        如果自动曝光开启  EXP_TIME命令设置自动曝光时间的上限
                                                                                    //                        一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光，增加图像稳定性
#define MT9V03X_1_EXP_TIME_DEF    ( 512 )                                           // 总钻风摄像头1 曝光时间       摄像头收到后会自动计算出最大曝光时间，如果设置过大则设置为计算出来的最大曝光值
#define MT9V03X_1_FPS_DEF         ( 50 )                                            // 总钻风摄像头1 图像帧率       摄像头收到后会自动计算出最大FPS，如果过大则设置为计算出来的最大FPS
#define MT9V03X_1_LR_OFFSET_DEF   ( 0   )                                           // 总钻风摄像头1 图像左右偏移量   正值 右偏移   负值 左偏移  列为188 376 752时无法设置偏移
                                                                                    // 总钻风摄像头1              摄像头收偏移数据后会自动计算最大偏移，如果超出则设置计算出来的最大偏移
#define MT9V03X_1_UD_OFFSET_DEF   ( 0   )                                           // 总钻风摄像头1 图像上下偏移量   正值 上偏移   负值 下偏移  行为120 240 480时无法设置偏移
                                                                                    //                        摄像头收偏移数据后会自动计算最大偏移，如果超出则设置计算出来的最大偏移
#define MT9V03X_1_GAIN_DEF        ( 32  )                                           // 总钻风摄像头1 图像增益       范围 [16-64]  增益可以在曝光时间固定的情况下改变图像亮暗程度
#define MT9V03X_1_PCLK_MODE_DEF   ( 0   )                                           // 总钻风摄像头1 像素时钟模式     范围 [0-1]    默认：0 可选参数为：[0：不输出消隐信号,1：输出消隐信号]
                                                                                    //                        通常都设置为0，如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1
                                                                                    //                        仅总钻风 MT9V034 V1.5 以及以上版本支持该命令


#define MT9V03X_2_W               (188)                                             // 总钻风摄像头2 图像宽度     范围 [1-752]
#define MT9V03X_2_H               (120)                                             // 总钻风摄像头2 图像高度     范围 [1-480]

#define MT9V03X_2_IMAGE_SIZE      (MT9V03X_2_W * MT9V03X_2_H)                       // 总钻风摄像头2 整体图像大小不能超过 65535

#define MT9V03X_2_AUTO_EXP_DEF    ( 0   )                                           // 总钻风摄像头2 自动曝光设置     默认不开启自动曝光设置  范围 [0-63] 0为关闭
                                                                                    //                        如果自动曝光开启  EXP_TIME命令设置自动曝光时间的上限
                                                                                    //                        一般情况是不需要开启自动曝光设置 如果遇到光线非常不均匀的情况可以尝试设置自动曝光，增加图像稳定性            光，增加图像稳定性
#define MT9V03X_2_EXP_TIME_DEF    ( 512 )                                           // 总钻风摄像头2 曝光时间       摄像头收到后会自动计算出最大曝光时间，如果设置过大则设置为计算出来的最大曝光值
#define MT9V03X_2_FPS_DEF         ( 50 )                                            // 总钻风摄像头2 图像帧率       摄像头收到后会自动计算出最大FPS，如果过大则设置为计算出来的最大FPS
#define MT9V03X_2_LR_OFFSET_DEF   ( 0   )                                           // 总钻风摄像头2 图像左右偏移量   正值 右偏移   负值 左偏移  列为188 376 752时无法设置偏移
                                                                                    // 总钻风摄像头2              摄像头收偏移数据后会自动计算最大偏移，如果超出则设置计算出来的最大偏移
#define MT9V03X_2_UD_OFFSET_DEF   ( 0   )                                           // 总钻风摄像头2 图像上下偏移量   正值 上偏移   负值 下偏移  行为120 240 480时无法设置偏移
                                                                                    //                        摄像头收偏移数据后会自动计算最大偏移，如果超出则设置计算出来的最大偏移
#define MT9V03X_2_GAIN_DEF        ( 32  )                                           // 总钻风摄像头2 图像增益       范围 [16-64]  增益可以在曝光时间固定的情况下改变图像亮暗程度
#define MT9V03X_2_PCLK_MODE_DEF   ( 0   )                                           // 总钻风摄像头2 像素时钟模式     范围 [0-1]    默认：0 可选参数为：[0：不输出消隐信号,1：输出消隐信号]
                                                                                    //                        通常都设置为0，如果使用CH32V307的DVP接口或STM32的DCMI接口采集需要设置为1
                                                                                    //                        仅总钻风 MT9V034 V1.5 以及以上版本支持该命令
//================================================定义 MT9V03X 双摄像头 参数配置================================================

//================================================定义 MT9V03X 双摄像头 参数结构体===============================================
typedef enum
{
    MT9V03X_DOUBLE_INIT = 0,                                                        // 摄像头初始化命令
    MT9V03X_DOUBLE_AUTO_EXP,                                                        // 自动曝光命令
    MT9V03X_DOUBLE_EXP_TIME,                                                        // 曝光时间命令
    MT9V03X_DOUBLE_FPS,                                                             // 摄像头帧率命令
    MT9V03X_DOUBLE_SET_COL,                                                         // 图像列命令
    MT9V03X_DOUBLE_SET_ROW,                                                         // 图像行命令
    MT9V03X_DOUBLE_LR_OFFSET,                                                       // 图像左右偏移命令
    MT9V03X_DOUBLE_UD_OFFSET,                                                       // 图像上下偏移命令
    MT9V03X_DOUBLE_GAIN,                                                            // 图像偏移命令
    MT9V03X_DOUBLE_PCLK_MODE,                                                       // 像素时钟模式命令(仅总钻风MT9V034 V1.5以及以上版本支持该命令)
    MT9V03X_DOUBLE_CONFIG_FINISH,                                                   // 非命令位，主要用来占位计数

    MT9V03X_DOUBLE_COLOR_GET_WHO_AM_I = 0xEF,
    MT9V03X_DOUBLE_SET_EXP_TIME = 0XF0,                                             // 单独设置曝光时间命令
    MT9V03X_DOUBLE_GET_STATUS,                                                      // 获取摄像头配置命令
    MT9V03X_DOUBLE_GET_VERSION,                                                     // 固件版本号命令

    MT9V03X_DOUBLE_SET_ADDR = 0XFE,                                                 // 寄存器地址命令
    MT9V03X_DOUBLE_SET_DATA                                                         // 寄存器数据命令
}m9v03x_double_cmd_enum;

// 摄像头接口类型枚举
typedef enum
{
    mt9v03x_1,                                                                      // 仅初始化摄像头 1  将仅采集摄像头1
    mt9v03x_2,                                                                      // 仅初始化摄像头 2  将仅采集摄像头2
    mt9v03x_double,                                                                 // 双摄同时初始化 稳定模式 DMA 严格交替 采集两个摄像头
                                                                                    // 注意： DMA只有一个 采集时 若两个摄像头同时输出 将无法保持正常帧率采集双摄数据 整体帧率将除以2
                                                                                    // 注意： 由于摄像头个体差异 双摄像头输出将逐渐重合 较长时间工作时 将导致出现上述情况
                                                                                    // 注意： 188*120分辨率情况下 若摄像头设置帧率超过135将100%重合导致实际帧率减半 可通过双摄初始化之间的延时来进行调节
}m9v03x_double_init_type_enum;

//================================================定义 MT9V03X 双摄像头 参数结构体===============================================

//================================================声明 MT9V03X 全局变量================================================
extern vuint8    mt9v03x_finish_flag_1;                                             // 总钻风摄像头1 单幅图像采集完成标志位
extern vuint8    mt9v03x_finish_flag_2;                                             // 总钻风摄像头2 单幅图像采集完成标志位
extern uint8     mt9v03x_image_1[MT9V03X_1_H][MT9V03X_1_W];                         // 总钻风摄像头1 图像数据存储数组
extern uint8     mt9v03x_image_2[MT9V03X_2_H][MT9V03X_2_W];                         // 总钻风摄像头2 图像数据存储数组
extern uint32    mt9v03x_fps[2];                                                    // 总钻风摄像头实际采集帧率
extern  int16 mt9v03x_set_confing_buffer_1[MT9V03X_DOUBLE_CONFIG_FINISH][2];
extern  int16 mt9v03x_set_confing_buffer_2[MT9V03X_DOUBLE_CONFIG_FINISH][2];

//================================================声明 MT9V03X 全局变量================================================


//================================================声明 MT9V03X 基础函数================================================
//-------------------该函数仅用于TC系列 V3.0 双摄主板 摄像头初始化----------------------
//-------------------该函数仅用于TC系列 V3.0 双摄主板 摄像头初始化----------------------
//-------------------该函数仅用于TC系列 V3.0 双摄主板 摄像头初始化----------------------
uint8            mt9v03x_double_init(m9v03x_double_init_type_enum init_mode);       // MT9V03X 摄像头初始化

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     mt9v03x单独设置曝光时间
// 参数说明     init_type       选择要设置的摄像头
// 参数说明     light           曝光时间，没有单位，数越大图像越亮
// 返回参数     unsigned char           0：配置成功 1：配置失败
// 使用示例     mt9v03x_set_exposure_time_sccb(mt9v03x_1,100);
//-------------------------------------------------------------------------------------------------------------------
uint8 mt9v03x_set_exposure_time_sccb(m9v03x_double_init_type_enum init_type,unsigned short int light);

//================================================声明 MT9V03X 基础函数================================================

#endif
