#ifndef _ARITH_COMMONDEF_
#define _ARITH_COMMONDEF_


#include <stdbool.h>
/*********版权所有（C）2020，武汉高德红外股份有限公司***************************************
* 文件名称： Arith_CommonDef.h
* 文件标识：通用数据结构定义
* 内容摘要： 
* 其它说明： 
* 当前版本：
* 创建作者：
* 创建日期：2020/12/05
* 包含关系：
*****************************************************************************************/

typedef void* ArithHandle;	// 算法句柄类型


// 跟踪器输入规模定义，注意栈空间
#define INPUT_OBJ_NUM (100) //外部最大输入目标个数

// 跟踪器输出规模定义
#define ST_OBJ_NUM (100) //短时目标个数
#define LT_OBJ_NUM (10)	//长时跟踪目标个数


//外部系统状态（总体下发）         
typedef enum tagGLB_SYS_MODE
{
    GLB_SYS_WAIT =  0x01,   // 空闲
    GLB_SYS_STARE = 0x02,   // 凝视
    GLB_SYS_FSCAN =	0x03,   // 扇扫
    GLB_SYS_AUTO =  0x04,   // 自主搜跟（无人值守）
    GLB_SYS_SCAN = 0x05     // 周扫
}GLB_SYS_MODE;

// 场景模式
typedef enum tagGLB_SCEN_MODE
{
    GLB_SCEN_SKY   =         0x01,	  // 对空模式
    GLB_SCEN_GROUND  =       0x02,	  // 对地模式
    GLB_SCEN_SEA =           0x03,    // 对海模式
    GLB_SCEN_NONE =          0x00,    // 未设置
    GLB_SCEN_LAB    =        0x04,    // 实验室靶标
    GLB_SCEN_CUSTOM =        0x05     // 自定义模式：用于算法开发验证，不稳定版本 add @ 20241010
}GLB_SCEN_MODE;

// 外引导来源
typedef enum tagGLB_GUIDE_SOURCE
{
    GLB_GUIDE_RADAR = 0x01,            //载机雷达
    GLB_GUIDE_WARNINGPLANE = 0x02      //预警机
}GLB_GUIDE_SOURCE;


// 视频源
typedef enum tagGLB_VIDEO_TYPE
{
    GLB_VIDEO_IR_SW = 0x01,//红外短波
    GLB_VIDEO_IR_MW = 0x02,//红外中波
    GLB_VIDEO_IR_LW = 0x03,//红外长波
    GLB_VIDEO_VL    = 0x04 //电视
}GLB_VIDEO_TYPE;


// 红外截波段类型，用于多光谱目标识别，根据需要添加
typedef enum tagGLB_IR_BAND_TYPE
{
    GLB_BAND_MW_0 = 0x020,//中波全色
    GLB_BAND_MW_1 = 0x021,//中波1
    GLB_BAND_MW_2 = 0x022//中波2
}GLB_IR_BAND_TYPE;




// 捕控导引阶段定义（算法内部状态）
typedef enum tagGLB_STATUS
{
    GLB_STATUS_UNKOWN = 0,      //捕控导引阶段 - 未知
    GLB_STATUS_WAIT = 1,        //捕控导引阶段 - 待命状态
    GLB_STATUS_SEARCH = 2,      //捕控导引阶段 - 搜索状态
    GLB_STATUS_TRACK = 3,       //捕控导引阶段 - 跟踪
    GLB_STATUS_SCAN = 4,        //捕控导引阶段 - 周扫
    GLB_STATUS_LOST = 5,        //捕控导引阶段 - 跟踪丢失
    GLB_STATUS_FSCAN = 6,       //捕控导引阶段 - 扇扫
    GLB_STATUS_MOTRACK = 9,     //多目标跟踪状态
    GLB_STATUS_AIM = 10         //内校轴阶段
}GLB_STATUS;

// 算法标识
typedef enum tagemObjSrc
{
    Arith_DST = 1,
    Arith_DAT = 2,
    Arith_AI = 3,
    Arith_KCF = 4,
    Arith_TLD = 5,
    Arith_Manual = 6,
    Arith_SiamRPN = 7,
	Arith_NanoTrack = 8,
	Arith_VitTrack = 9
}ObjSrc;

// 尺度模式
typedef enum tagSizeType
{
    unKnown,		//不确定目标或未识别尺寸类型
    DDimTarget,		//超级弱小目标
    DimTarget,		//弱小目标
    SmallTarget,	//小目标
    MiddleTarget,	//临界目标
    AreaTarget		//面目标
}SizeType;

// 灰度模式
typedef enum tagGrayType
{
    BrightTarget = 1,	//亮目标
    DarkTarget = 2,	    //暗目标
    AllGray = 3         //亮暗目标
}GrayType;



// 目标跟踪状态
typedef enum tagTrackingStatus
{
    NOT_TRACKING = 0,//未跟踪
    STABLE_TRACKING = 1,//稳跟
    MEM_TRACKING = 2//记忆跟踪
}TrackingStatus;


// 遮挡事件等级判断
typedef enum tagOccLev
{
    NO_OCC = 0, //无遮挡
    SIM_OCC = 1,//轻微遮挡
    MID_OCC = 2,//中等遮挡
    FULL_OCC = 3//完全遮挡
}OccLev;

// 目标形变事件
typedef enum tagShapeTransLev
{
    NO_ShapeTrans = 0,//无形变
    MID_ShapeTrans = 1,//轻微形变
    FULL_ShapeTrans = 2//显著形变
}ShapeTransLev;


// 跟踪事件(可包含所有跟踪期间需要特殊处理的事件
// 如强制记忆跟踪、遮挡、形变、变焦、变倍等)
typedef struct tagTrackEvent
{
    OccLev occ;
    ShapeTransLev shapeTrans;
}TrackEvent;

//跟踪决策事件
typedef enum tagTrackDecision
{
    NO_Deci = 0,    //无决策结果
    KCF_Deci = 1,   //KCF
    AIT_Deci = 2,    //AI
    AID_Deci = 3,  //AI识别
    Predict_Deci  =4 //长时预测
}TrackDecision;

// 定义红外目标类别编号
#define DT_TARGET_CLS_ID 99     //红外检测无目标区分能力，赋值为99


////////////////////////////////////////////////////////////////////////////////
// 系统符号定义
////////////////////////////////////////////////////////////////////////////////
typedef bool BBOOL;
typedef unsigned char UBYTE8;
typedef signed   char BYTE8;
typedef unsigned short UINT16;
typedef short SINT16;
typedef unsigned int UINT32;
typedef int SINT32;
typedef unsigned long COLORREF;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned char BYTE;
typedef float FLOAT32;
typedef double DOUBLE64;
typedef long double LDOUBLE80;

////////////////////////////////////////////////////////////////////////////////
// 系统数据结构
////////////////////////////////////////////////////////////////////////////////
// 定义坐标结构体--整型32位
typedef struct tagPoint32S // BYTES: 2*4=8
{
    SINT32 x; // 图像像素x坐标
    SINT32 y; // 图像像素y坐标
} POINT32S;

// 定义坐标结构体--整型16位
typedef struct tagPoint16S // BYTES: 2*2=4
{
    SINT16 x; // 图像像素x坐标
    SINT16 y; // 图像像素y坐标
} POINT16S;

// 定义坐标结构体--浮点型
typedef struct tagPoint32F // BYTES: 2*4=8
{
    FLOAT32 x; // 图像像素x坐标
    FLOAT32 y; // 图像像素y坐标
} POINT32F;


// RPY姿态角
typedef struct tgEulerRPY
{
    double fRoll;  // 横滚角
    double fPitch; // 俯仰角
    double fYaw;   // 方位角
} EulerRPY;        // 单位：°



// 极坐标系
typedef struct tgPointPole
{
    double alpha;    // 俯仰角
    double beta;     // 方位角
    double distance; // 极径
} Pole;              // 单位：°



// 空间直角坐标系,也可以看做向量
typedef struct tgPointXYZ
{
    double X;
    double Y;
    double Z;
} PointXYZ; // 单位：米


typedef struct tgPointBLH
{
    double B; // 纬度
    double L; // 经度
    double H; // 高程
} PointBLH;   // 地理坐标系  //单位：°


// 相机内参
typedef struct tgCameraParam
{
    int ImageWidth;
    int ImageHeight;
    float f;       // 焦距 mm
    float dSize;   // 像元尺寸 um
    int dx;        // 像主点偏移x，0代表图像中心
    int dy;        // 像主点偏移y，0代表图像中心
    float fAglReso;// 角分辨率，内部计算便于使用

    bool            bImageRataSys;              //像旋系统标记，S731实物样机1，数字样机未模拟像旋 -0
} CameraParam;

// 伺服信息
typedef struct tgServoParam
{
    float fAz; // 方位
    float fPt; // 俯仰

    // S731扩展
    float fFSMAz; // 快反方位
    float fFSMPt; // 快反俯仰
} ServoParam;

typedef struct tgDeviceSetupError
{
    double g_YawBias;
    double g_PitchBias;
    double g_RollBias;
    double g_XBias;
    double g_YBias;
    double g_ZBias;
} DeviceSetupError;

// 定义目标宽高结构体--32位  //BYTES: 3*4=12
typedef struct tagSize32S
{
    SINT32 w; // 宽度
    SINT32 h; // 高度
    SINT32 s; // 面积

} SIZE32S;

// 定义目标宽高结构体--浮点型
typedef struct tagSize32F // BYTES: 3*4=12
{
    FLOAT32 w; // 宽度
    FLOAT32 h; // 高度
    FLOAT32 s; // 面积
} SIZE32F;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 定义速度结构体--整型32位  //BYTES: 2*4=8
typedef struct tagSpeed32S
{
    SINT32 vx; // x方向速度
    SINT32 vy; // y方向速度
} SPEED32S;

// 定义速度结构体--浮点型
typedef struct tagSpeed32F // BYTES: 2*4=8
{
    FLOAT32 vx; // x方向速度
    FLOAT32 vy; // y方向速度
} SPEED32F;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 定义矩形结构体--左上角坐标及宽高--整型16位
typedef struct tagRect16S // BYTES: 4*2=8
{
    SINT16 x; // 左上点x坐标
    SINT16 y; // 左上点y坐标
    SINT16 w; // 矩形宽度
    SINT16 h; // 矩形高度
} RECT16S;

// 定义矩形结构体--左上角坐标及宽高--整型32位
typedef struct tagRect32S // BYTES: 4*4=16
{
    SINT32 x; // 左上点x坐标
    SINT32 y; // 左上点y坐标
    SINT32 w; // 矩形宽度
    SINT32 h; // 矩形高度
} RECT32S;

// 定义矩形结构体--左上角坐标及宽高--浮点型
typedef struct tagRect32F // BYTES: 4*4=16
{
    FLOAT32 x; // 左上点x坐标
    FLOAT32 y; // 左上点y坐标
    FLOAT32 w; // 矩形宽度
    FLOAT32 h; // 矩形高度
} RECT32F;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 定义矩形结构体--中心点坐标及宽高、大小-整型
typedef struct tagCENTERRECT // BYTES: 5*2=10
{
    SINT16 cx; // 中心点x坐标
    SINT16 cy; // 中心点y坐标
    SINT16 w;  // 矩形宽度
    SINT16 h;  // 矩形高度
    SINT32 s;  // 目标大小
}CENTERRECT;

// 定义矩形结构体--中心点坐标及宽高、大小-整型32位
typedef struct tagCENTERRECT32S // BYTES: 4*4=16
{
    SINT32 cx; // 中心点x坐标
    SINT32 cy; // 中心点y坐标
    SINT32 w;  // 矩形宽度
    SINT32 h;  // 矩形高度
    SINT32 s;  // 目标大小
} CENTERRECT32S;

// 定义矩形结构体--中心点坐标及宽高、大小-浮点型
typedef struct tagCENTERRECT32F // BYTES: 5*4=20
{
    FLOAT32 cx; // 中心点x坐标
    FLOAT32 cy; // 中心点y坐标
    FLOAT32 w;  // 矩形宽度
    FLOAT32 h;  // 矩形高度
    FLOAT32 s;  // 目标大小
} CENTERRECT32F;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 定义矩形结构体--左上角及右下角坐标
typedef struct tagMINMAXRECT // BYTES: 4*2=8
{
    SINT16 minX; // 左上点x坐标
    SINT16 minY; // 左上点y坐标
    SINT16 maxX; // 右下点x坐标
    SINT16 maxY; // 右下点y坐标
} MINMAXRECT;

// 定义矩形结构体--左上角及右下角坐标-整型32位
typedef struct tagMINMAXRECT32S // BYTES: 4*4=16
{
    SINT32 minX; // 左上点x坐标
    SINT32 minY; // 左上点y坐标
    SINT32 maxX; // 右下点x坐标
    SINT32 maxY; // 右下点y坐标
} MINMAXRECT32S;

// 定义矩形结构体--左上角及右下角坐标-浮点32位
typedef struct tagMINMAXRECT32F // BYTES: 4*4=16
{
    FLOAT32 minX; // 左上点x坐标
    FLOAT32 minY; // 左上点y坐标
    FLOAT32 maxX; // 右下点x坐标
    FLOAT32 maxY; // 右下点y坐标
} MINMAXRECT32F;

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 定义目标角度结构体
typedef struct tagAngle32F // BYTES: 2*4=8
{
    FLOAT32 fAz; // 方位角
    FLOAT32 fPt; // 俯仰角
    FLOAT32 Dr;  // 极坐标角度
} ANGLE32F;



// 定义目标宽高结构体--16位  //BYTES: 2*2 + 1*4=8
typedef struct tagSize16S
{
    SINT16 w; // 宽度
    SINT16 h; // 高度
    SINT32 s; // 面积
} SIZE16S;

// 定义距离结构体--整型32位
typedef struct tagDist32S // BYTES: 2*4=8
{
    SINT32 dx; // x方向距离
    SINT32 dy; // y方向距离
} DIST32S;

// 定义距离结构体--浮点型
typedef struct tagDist32F // BYTES: 2*4=8
{
    FLOAT32 dx; // x方向距离
    FLOAT32 dy; // y方向距离
} DIST32F;


// 外部引导目标列表，用于批量转锁定
typedef struct tagTargetGuide
{
    SINT32              ID;                 //目标批号，传递给锁定后目标
    UBYTE8              bIsCoLocate;        //协同定位标记，直接透传到目标
    Pole                stTargetPole;       //目标极坐标
    PointBLH            stTargetPos;        //目标GPS坐标
    FLOAT32             fGuideAzSpeed;      //实际锁定点方位角速度
    FLOAT32             fGuidePtSpeed;      //实际锁定点俯仰角速度
    SINT32              nLockX;             //锁定点当前图像坐标X
    SINT32              nLockY;             //锁定点当前图像坐标Y
    BBOOL               bInFOV;             //在视场判断
}TargetGuide; 

// 载体信息
typedef struct tagAirCraftInfo
{
    unsigned char  	nPlaneID;               //载机ID
    PointBLH        stPos;                  //位置
    EulerRPY        stAtt;                  //姿态
}AirCraftInfo;

// 相机信息
typedef struct tagCamInfo
{
    int             nFocus;                     //实时焦距值 
    float           fPixelSize;                 //像元尺寸
    GLB_VIDEO_TYPE   unVideoType;                //视频源类型
    int             dCamx;                      //像主点偏移x，0- 图像中心 ，不知道就填0
    int             dCamy;                      //像主点偏移y，0- 图像中心 ，不知道就填0
    float           fAglReso;                   //角分辨率
}CamInfo;

// 伺服状态
typedef struct tagServoInfo
{
    float           fServoAz;                   //当前帧伺服方位角
    float           fServoPt;                   //当前帧伺服俯仰角
    float           fServoAzSpeed;              //当前帧伺服方位角速度
    float           fServoPtSpeed;              //当前帧伺服俯仰角速度
}ServoInfo;

// 引导信息
typedef struct tagGuideInfo
{
    BBOOL           bGuideUpdate;               //引导当前帧更新标志（有效标志）
    FLOAT32         fGuideYaw;
    BBOOL           fGuidePitch;
    BBOOL           fGuideDistance;
    GLB_GUIDE_SOURCE nGuideInfSource;           // 引导信息来源，本机雷达
}GuideInfo;


//*****************************************************************************
#define AIT_DETECTION_MAX_NUM     50

typedef struct tagAITPATH
{
    //DasimaRPN
    const char *siam_model;
    const char *siam_cls;
    const char *siam_reg;
}AIT_PATH;


typedef struct tagAITTARGET
{
    CENTERRECT32F  tTarget;
    float  fScore;
}AIT_TARGET;

// AI跟踪器类型
typedef enum tagAITrackerType
{
    DaSaimRPN = 0,
    NanoTrack = 1,
    VitTrack = 2
}AITrackerType;



// nanotrack输出结构
typedef struct tagTrack_Res_Nano 
{
    RECT32S rect;                    // 跟踪器自带评估分值
    float score;                      // 跟踪器自带评估分值
    int peak_num;                     // 超过阈值的波峰数量
    float peak_ratio;                 // 超过阈值的波峰投影占比
    int peak_status;                  // 通过波峰图分析的干扰判断结果  1:有干扰 0：无干扰
    int disturb_status;               // 通过CLS特征图二分类网络模型的干扰判断结果  1:有干扰 0：无干扰
}Track_Res_Nano;


//定义ai跟踪器的输出

typedef struct tagAITInfo
{
    //*******工作状态*******
    int  nStatus;                  //空闲/跟踪/定位/重捕状态信息等
    int  nErrorCode;               //错误码编号
    int  nFrameId;
    //*****跟踪目标信息*****
    int            nX;             //目标中心点图像坐标x
    int            nY;             //目标中心点图像坐标y
    int            nObjW;          //目标宽度
    int            nObjH;          //目标高度
    unsigned char  ubIDType;       //目标识别类别标签
    float          fProb;          //目标识别置信度

    //******调试信息*********
    unsigned char bInited;
    int           nTotalCnt;       //跟踪帧数
    int           nContiLostCnt;   //丢失
    //int           nDetectNum; 
    int           nContiDetectNum;


    RECT32F    rfBox;            //x,y 这里表示中心点
    RECT32F    rfBoxPre;         //x,y 这里表示中心点

    float fX;                           //表示中心点
    float fY;
    float fObjW;
    float fObjH; 


    int           nSearchX;         //搜索区域中心X
    int           nSearchY;         //搜索区域中心Y
    int           nSearchW;         //搜索区域宽度W
    int           nSearchH;         //搜索区域高度H


    //******AI跟踪高得分检测结果*******
    int                       nDetectNum;
    AIT_TARGET   nDetectArray[AIT_DETECTION_MAX_NUM];
    int                       nClusterNum;
    CENTERRECT32F    nSimilarArray[AIT_DETECTION_MAX_NUM];

    //******AI nanotrack输出*******
    Track_Res_Nano stNanoTrack_out;

    AITrackerType   type;//AI跟踪算法类型标记

}AIT_OUTPUT;


//定义ai跟踪器的控制指令
typedef struct tagAITCommand
{
    bool    bTrack;     //持续跟踪指令，清空0表明解锁
    bool    bControlAIT;   //AITrack可自循环跟踪，也可由决策结果指导跟踪
    unsigned char nInitMode; //1-AITrack自初始化跟踪 2-采用决策box初始化
    CENTERRECT32F InitBox;       //初始化跟踪指令
    CENTERRECT32F TargetBox;  //指示目标框，用于确认下一帧的搜索范围，范围在AI跟踪内部根据提示目标框自行计算
}AIT_Command;


#endif