// 秒寻科技
// 定位公共模块
// zt
// 2023-03-25

#ifndef __LCT_PUBLIC_H__
#define __LCT_PUBLIC_H__

#include "../../sysdefine/sysdef.h"

// 极小值结构
typedef struct
{
    COORD_T stCoord;          // 定位参考点（极小值参考点）坐标
    flt32 fDelayDeviationSum; // 定位参考点（极小值参考点）时延误差和
    flt32 fDistance;          // 定位参考点（极小值参考点）与前一次定位点之间的距离
} LCT_MINIMUM_VALUE_T;

// 极小值组结构
typedef struct
{
    LCT_MINIMUM_VALUE_T astLinearCalMinimumList[LCT_MINIMUM_NUM]; // 一维计算径极小值列表
    uint8 byLinearCalMinimumListLen;                              // 一维计算径极小值列表长度

    LCT_MINIMUM_VALUE_T astLinearTrackMinimumList[LCT_MINIMUM_NUM]; // 一维跟踪径极小值列表
    uint8 byLinearTrackMinimumListLen;                              // 一维跟踪径极小值列表长度

    uint8 byOneDimensionInsideFlag; // 线性定位有效标识符，0：无效，1：有效

    LCT_MINIMUM_VALUE_T astCalMinimumList[LCT_MINIMUM_NUM]; // 二维计算径极小值列表
    uint8 byCalMinimumListLen;                              // 二维计算径极小值列表长度

    LCT_MINIMUM_VALUE_T astTrackMinimumList[LCT_MINIMUM_NUM]; // 二维跟踪径极小值列表
    uint8 byTrackMinimumListLen;                              // 二维跟踪径极小值列表长度

    uint8 byTwoDimensionInsideFlag; // 二维有效标识符，0：无效，1：有效

    LCT_MINIMUM_VALUE_T stPredicMinimumList; // 预测径极小值
    uint8 byPredicMinimumListLen;            // 预测径小值列表长度
} LCT_MINIMUM_VALUE_GROUP_T;

// 线性定位结果
typedef struct
{
    uint32 dwOneDimensionMainBtsId;      // 一维主站ID，主站联合从站进行一维定位
    uint32 dwOneDimensionSlaveBtsId;     // 一维从站ID
    LCT_FIRSTPATH_T astFirstPathList[2]; // 一维定位的两个基站第一径数据
    COORD_T stCoord;                     // 定位参考点（极小值参考点）坐标
    flt32 fDelayDeviationSum;            // 定位参考点（极小值参考点）时延误差和
    uint8 byValidFlag;                   // 定位坐标合法标识符，0：不合法，1：合法
} LCT_LINEAR_MINIMUM_DATA_T;

// 线性定位坐标
typedef struct
{
    COORD_T stCoord;
    flt32 fDelayDeviation;
} LCT_LINEAR_LCT_COORD_T;

// 线性定位结果列表
typedef struct
{
    LCT_LINEAR_MINIMUM_DATA_T astCalMinimumList[LCT_MINIMUM_NUM]; // 计算极小值列表
    uint8 byCalMinimumListLen;                                    // 计算极小值列表长度

    LCT_LINEAR_MINIMUM_DATA_T astTrackMinimumList[LCT_MINIMUM_NUM]; // 跟踪极小值列表
    uint8 byTrackMinimumListLen;                                    // 跟踪极小值列表长度

    uint8 byValidFlag; // 定位有效标识符，0：无效，1：有效
} LCT_LINEAR_MINIMUM_LIST_T;

// 选择坐标结构
typedef struct
{
    uint8 byTrackFlag;  // 跟踪标识符,0:不跟踪，1：跟踪
    uint8 byLctSource;  // 定位来源，1：计算径、2：跟踪径、3：预测、4：IMU
    COORD_T stLctCoord; // 定位坐标
} LCT_SEL_COORD_T;

// 最优定位坐标结构
typedef struct
{
    COORD_T stCoord;          // 定位坐标
    uint8 bySourceFlag;       // 极小值来源，1：当前坐标，2：跟踪坐标，3：预测坐标
    flt32 fDistance;          // 与预测点间的距离
    flt32 fDistanceVariance;  // 距离方差
    flt32 fDelayDeviationSum; // 时延误差累计和
    uint8 byInsideFlag;       // 内部标识符，0：不在内部，1：在内部
    uint8 byResultFlag;       // 选择结果标识符，0：失败，1：成功
} LCT_COORDSEL_OPTIMUM_COORD_T;

// 上一次定位点
typedef struct
{
    uint8 byLocationFlag; // 定位标识符，1：已输出定位点，0：未输出定位点
    COORD_T stCoord;
} LCT_MAIN_AHEAD_LCT_POINT_T;

// 测试第一径数据结构
typedef struct
{
    uint32 dwFrameNo;
    uint32 dwFreqIndex;
    uint32 dwMaxValue; // 最大值
    // uint32 dwFrameCalIndex;
    uint32 dwCalDdcIndex;
    // uint32 dwFrameTrackIndex;
    uint32 dwTrackDdcIndex;
} LCT_MAIN_TEST_FIRST_PATH_T;

#endif