#ifndef __VIZUM_MUL_DETECTED_LASER_HEADER__
#define __VIZUM_MUL_DETECTED_LASER_HEADER__
#include "VZNL_Export.h"
#include "VZNL_Types.h"
#include "VZNL_Common.h"
#include "VZNL_DetectLaser.h"
/// @brief
/// 开始多设备检测
/// [in]多个相机Handle
/// [in]相机个数
/// [out]错误码
/// @return 返回多设备检测工具Handle
VZNLAPI VZNLDETECTHANDLE VzNL_BeginMultiDeviceDetectLaser(VZNLHANDLE* phDevice, int nDeviceCount, int* pnErrorCode);
/// @brief
/// 是否为主相机
/// [in]多相机检测工具
/// [in]相机handle
/// @return 返回true则表示是主相机
VZNLAPI VzBool VzNL_IsMasterDev(VZNLDETECTHANDLE hDetectHandle, VZNLHANDLE hDevice);
/**
* @brief 设备状态提醒
* @param [in] hDevice 融合设备Handle
* @param [in] pNotifyCB 返回函数
* @param [in] pCBParam 回调函数返回参数
* @return 关闭成功返回0,否则为错误码
*/
VZNLAPI int VzNL_SetMulDevStatusNotify(VZNLHANDLE hDetechTool, VzNL_OnMulDevNotifyStatusCB pNotifyCB, void* pCBParam);
/// @brief
/// 设置激光标定。
/// [in]多相机检测工具
/// [in]设置标定高度
/// [in]顶部ROI数组指针
/// [in]顶部ROI的数组个数
/// [in]底部ROI数组指针
/// [in]底部ROI数组个数
/// @return 返回0为正确,失败返回错误码
VZNLAPI int VzNL_SetMulDevLaserStandard( VZNLDETECTHANDLE hDetechTool, double dStandardObjectHeight,
const SVzNLROIRect* pTopROI, const int nTopROICount,
const SVzNLROIRect* pBottomROI, const int nBottomROICount);
/// @brief
/// 清除标定信息
/// [in]多相机检测工具
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_ClearMulDevLaserStandard(VZNLDETECTHANDLE hDetechTool);
/// @brief
/// 设置激光门限值
/// [in]多相机检测工具
/// [in]激光门限值[Range:0~255]
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_SetMulDevLaserThres(VZNLDETECTHANDLE hDetechTool, int nLaserThres);
/// @brief
/// 设置过滤高度
/// [in]多相机检测工具
/// [in]过滤高度(此高度以下的数据不输出)
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_ConfigMulDevLaserLineFilterHeight(VZNLDETECTHANDLE hDetechTool, double dFilterHeight);
/// @brief
/// 设置杂点过滤阈值
/// [in]多相机检测工具
/// [in]过滤值
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_ConfigMulDevLaserLineMaxDeviation(VZNLDETECTHANDLE hDetechTool, double dMaxDeviation);
/// @brief
/// 设置偏移量
/// [in]多相机检测工具
/// [in]偏移量
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_ConfigMulDevLaserBeginOffsetValue(VZNLDETECTHANDLE hDetechTool, double dOffsetValue);
/**
* @brief 设置点云处理模式
* @param [in] hDevice 设备句柄
* @param [in] ePointCloudProcMode kePointCloudProcMode_Speed 速度计算模式, kePointCloudProcMode_Encoder 编码器模式 kePointCloudProcMode_FixedStep 固定步长模式
* @return 成功返回0,否则为其他错误码
* Old Interface int VzNL_EnableLaserRollerMode(VZNLHANDLE hDevice, VzBool bEnable);
*/
VZNLAPI int VzNL_SetMulDevPointCloudProcMode(VZNLDETECTHANDLE hDetechTool, EVzPointCloudProcMode ePointCloudProcMode);
/**
* @brief 设置固定步长
* 设置前请先设置为kePointCloudProcMode_FixedStep模式
*/
VZNLAPI int VzNL_SetMulDevFixedStep(VZNLDETECTHANDLE hDetechTool, double dStep);
/// @brief
/// 设置传送带速度值 当设置点云处理模式为 kePointCloudProcMode_Speed可用
/// [in]多相机检测工具
/// [in]运行方向
/// [in]速度
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_ConfigMulDevLaserObjRunSpeedValue(VZNLDETECTHANDLE hDetechTool, EVzObjRunDirect eDirect, double dSpeed);
/**
* @brief 配置转动轴半径 kePointCloudProcMode_Encoder可用
* @param [in] hDevice 设备句柄
* @param [in] dRadius 转动轴半径
* @return 成功返回0,否则为其他错误码
*/
VZNLAPI int VzNL_ConfigMulDevLaserRollerRadius(VZNLDETECTHANDLE hDetechTool, double dRadius);
VZNLAPI int VzNL_GetMulDevLaserRollerRadius(VZNLDETECTHANDLE hDetechTool, double* pdRadius);
/**
* @brief 设置编码器脉冲精度 kePointCloudProcMode_Encoder可用
* @param [in] hDevice 设备句柄
* @param [in] nPulsePerRound 脉冲个数
* @return 成功返回0,否则为其他错误码
*/
VZNLAPI int VzNL_SetMulDevLaserEncoderResolution(VZNLDETECTHANDLE hDetechTool, unsigned int nPulsePerRound);
VZNLAPI int VzNL_GetMulDevLaserEncoderResolution(VZNLDETECTHANDLE hDetechTool, unsigned int* pnPulsePerRound);
///@brief 获取参数设置范围
///[in]多相机检测工具
///@param name="eType"[in]参数类型
///@param name="pnMinVal"[in]最小值
///@param name="pnMaxVal"[in]最大值
/// @return 成功返回0,失败返回错误码。
VZNLAPI int VzNL_QueryMulDevParamRange(VZNLDETECTHANDLE hDetechTool, EVzDeviceParamType eType, unsigned int* pnMinVal, unsigned int* pnMaxVal);
/// @brief
/// 检测一帧数据
/// [in]多相机检测工具
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_MulDevDetectLaser(VZNLDETECTHANDLE hDetechTool);
/// @brief
/// 设置外部设备为外部触发模式
/// [in]多相机检测工具
/// [in]外部触发模式
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_SwitchMulDevExternTrigger(VZNLDETECTHANDLE hDetechTool, EVzMultiDevWorkMode eWorkMode);
/// @brief
/// 启用多相机全数据模式
/// [in]多相机检测工具
/// [in]启用/禁用
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_EnableMulDevUseAllPoint(VZNLDETECTHANDLE hDetechTool, VzBool bEnable);
/// @brief
/// 刷新多相机参数
/// [in]多相机检测工具
/// [in]启用/禁用
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_UpdateMulDevCalibration(VZNLDETECTHANDLE hDetechTool);
/// @brief
/// 启用软件计算模式
/// [in]多相机检测工具
/// [in]启用/禁用
/// @return 成功返回0,失败返回错误码
VZNLAPI int VzNL_EnableMulDevCalcMatrix(VZNLDETECTHANDLE hDetechTool, VzBool bEnable);
/// @brief
/// 获取激光线2D结果
/// [in]多相机检测工具
/// [out]2D点,内存空间由用户分配
/// [in/out]传入:用户分配的SVzNL2DPoint的结构个数;传出:用户需要分配多少个SVzNL2DPoint
/// @return 成功返回0,失败返回错误码。
VZNLAPI int VzNL_GetMulDevLaser2DResult(VZNLDETECTHANDLE hDetechTool, SVzNL2DPosition* p2DPoint, int* pnCount);
/// @brief
/// 获取激光线3D结果
/// [in]多相机检测工具
/// [out]3D点,内存空间由用户分配
/// [in/out]传入:用户分配的SVzNL3DPosition的结构个数;传出:用户需要分配多少个SVzNL3DPosition
/// @return 成功返回0,失败返回错误码。
VZNLAPI int VzNL_GetMulDevLaser3DResult(VZNLDETECTHANDLE hDetechTool, SVzNL3DPosition* p3DPoint, int* pnCount);
/// @brief
/// 启动多设备自动检测,并返回激光线
/// [in]多相机检测工具
/// [in]回调函数
/// [in]回调参数
/// @return 成功返回0,失败返回错误码。
VZNLAPI int VzNL_StartMulDeviceAutoDetect(VZNLDETECTHANDLE hDetechTool, VzNL_GetAutoDetectResultCB pCB, void* pCBParam);
/// @brief
/// 启动多设备自动检测,并返回激光线
/// [in]多相机检测工具
/// [in]回调函数
/// [in]回调参数
/// @return 成功返回0,失败返回错误码。
VZNLAPI int VzNL_StartMulDeviceAutoDetectEx(VZNLDETECTHANDLE hDetechTool, EVzResultDataType eResultType, VzNL_AutoOutputLaserLineExCB pCBEx, void* pCBParam);
/// @brief
/// 设置融合的相机类型。
/// [in]多相机检测工具
/// [in]融合的相机类型
/// @return 返回0为正确,失败返回错误码
VZNLAPI int VzNL_SetMulDevType(VZNLDETECTHANDLE hDetechTool, EVzMultiDevType eMultiDevType);
VZNLAPI int VzNL_GetMulDevType(VZNLDETECTHANDLE hDetechTool, EVzMultiDevType* peMultiDevType);
/// @brief
/// 设置静态相机融合扫描模式。
/// [in]多相机检测工具
/// [in]静态相机融合扫描模式
/// @return 返回0为正确,失败返回错误码
VZNLAPI int VzNL_SetMulStaticDevScanMode(VZNLDETECTHANDLE hDetechTool, EVzMultiStaticDevScanMode eMultiDevScanMode);
VZNLAPI int VzNL_GetMulStaticDevScanMode(VZNLDETECTHANDLE hDetechTool, EVzMultiStaticDevScanMode* peMultiDevScanMode);
/// @brief
/// 停止多设备检测
/// [in]多相机检测工具
/// @return 成功返回0,失败返回错误码。
VZNLAPI int VzNL_StopMulDeviceAutoDetect(VZNLDETECTHANDLE hDetectTool);
/// @brief
/// 结束多设备检测
/// [in]多相机检测工具
/// @return 成功返回0,失败返回错误码。
VZNLAPI int VzNL_EndMultiDeviceDetectLaser(VZNLDETECTHANDLE* pDetectTool);
/**
* @brief 是否支持高帧率下降沿模式
* @param hDevice 当前设备句柄
* @param pnErrorCode 错误信息,如果不需要可填NULL
* @return VzTrue 表示支持 VzFalse 表示不支持
*/
VZNLAPI VzBool VzNL_IsMulDevSupportHighFrequenceFallingEdge(VZNLDETECTHANDLE hDetechTool, int* pnErrorCode);
#endif