// 秒寻科技
// 定义全局的数据据结构
// zt
// 2023-03-05

#ifndef __DATA_STRUCT_H__
#define __DATA_STRUCT_H__

#include "./datatype.h"
#include "./sysmacro.h"

// 系统状态结构
typedef struct
{
    uint8 bySyncFlag; // 同步标识符，0：未同步，1：已同步

    // 基站捕获标识符，0：未捕获，1：已捕获
    uint8 byBtsCaptureFlag; // 若主站丢失（大楼间切换或者楼层间切换），系统立即转入“未捕获”阶段
    uint8 byShiftTimes;     // 基站ID右移次数

    uint8 byLocationTimes;  // 定位次数，定位次数超过21表示定位初始化阶段完成
    uint8 byReLocationFlag; // 重新定位标识符，0：正常定位状态，1：重新定位状态
    int32 dwBuildId;        // 基站归属大楼编号
    int32 dwLayerId;        // 基站归属楼层编号

    // 信号时隙顺序
    uint8 abySlotList[PUB_SYS_SLOT_NUM];
} PUB_SYS_STATUS_T;

// 软件名称及版本
typedef struct
{
    uint8 abySoftName[PUB_SOFTWARE_NAME_LEN];       // 软件名称
    uint8 abySoftVersion[PUB_SOFTWARE_VERSION_LEN]; // 软件版本
} PUB_SOFT_NAME_VERSION_T;

// 定位数据缓存结构
typedef struct
{
    uint32 dwFrameNo; // 当前帧号

    uint32 dwSetBtsId; // 基站配置ID
    uint32 dwCalBtsId; // 基站计算ID

    uint8 byFreqIndex; // 频率索引

    uint8 bySetSlot; // 基站配置时隙
    uint8 byCalSlot; // 基站计算时隙

    uint8 byLctBtsFlag;   // 定位基站标识符，0：不是定位基站，1：是定位基站
    uint8 byBtsValidFlag; // 基站有效标识符，0：无效，1：有效

    flt32 fCurrentMaxAmpl;        // 当前最大幅度
    uint8 byCurrentAmplValidFlag; // 当前幅度有效标识符

    uint32 dwGenerateIndex;       // 队列生产索引
    uint32 dwLocationIndex;       // 第一帧定位数据索引(队列消费索引)
    uint32 dwFourthLocationIndex; // 第四帧定位数据索引

    // 变频索引+信号同步索引+第一径帧内索引 = 第一径绝对索引
    uint32 dwDdcIndex;            // 变频索引
    int32 dwSignalSyncIndex;      // 信号同步索引，即信号在48000点中的开始索引(可正可负)
    int32 dwSignalSlotSyncOffset; // 信号时隙同步偏移（偏移到主站的量）

    uint16 wAheadFrameCalPahtIndex;   // 上一次帧内计算索引
    uint16 wAheadFrameTrackPathIndex; // 上一次帧内跟踪径

    uint32 dwDataListLen;                // 队列长度
    flt32 afData[PUB_LCT_DATA_LIST_LEN]; // 定位数据。定位数据为循环队列
} PUB_LOCATION_DATA_T;

// 定位基站结构（基于判决主站和安装基站选择一组定位基站）
typedef struct
{
    uint32 dwMainBtsFlag; // 主站标识符，1：主站，其他数字：从站

    uint32 dwBuildId; // 大楼编号
    uint32 dwLayerId; // 楼层编号

    uint32 dwBtsId;     // 基站编号
    uint32 dwFreqIndex; // 基站频率索引
    uint32 dwSlot;      // 基站时隙

    uint32 dwLctType;                          // 定位类型，1：单站定位，2：双站定位，3：三站定位，4：多站定位
    uint32 dwTwoBtsNum;                        // 本站与几个站进行双站定位
    uint32 adwTwoBtsList[PUB_TWO_BTS_MAX_NUM]; // 与本站进行双站定位的基站ID列表

    int32 dwCoordX; // x坐标
    int32 dwCoordY; // y坐标
    int32 dwCoordZ; // z坐标
} PUB_LCT_BTS_T;

// 定位基站队列结构
// 基于判决主站从安装基站队列中选择一组定位基站
typedef struct
{
    uint8 byBtsNum;                                    // 基站数量
    PUB_LCT_BTS_T astLocationBts[PUB_LCT_BTS_MAX_NUM]; // 最多9个基站参与定位
} PUB_LCT_BTS_LIST_T;

// 坐标结构
typedef struct
{
    int32 dwX; // x坐标
    int32 dwY; // y坐标
    int32 dwZ; // z坐标
} COORD_T;

// 当前定位坐标
typedef struct
{
    // 定位完成标识符，0：未完成，1：已完成
    uint32 dwCpltFlag;

    // 定位成功标识符，0：定位失败，1：定位成功，2：未移动。上层读取该数据后，该标志位清0。生成定位坐标后该标志位置1，若未移动则置2
    uint32 dwSuccessFlag;

    COORD_T stCoord; // 定位坐标

    uint32 dwBuildId; // 所在大楼编号
    uint32 dwLayerId; // 所在楼层编号

    uint32 dwLctBtsNum;                       // 定位基站数据
    uint32 adwBtsIdList[PUB_LCT_BTS_MAX_NUM]; // 定位基站ID队列
    uint32 dwImuMoveFlag;                     // imu判决移动标识符，0:imu计算失败；1：imu计算成功，但静止；50：imu计算成功，但移动
} PUB_CURRENT_LCT_RESULT_T;

// 第一径结构
typedef struct
{
    uint16 wFirstPathIndex;   // 第一径索引
    flt32 fSnr;               // 第一径性噪比
    uint8 byTrackSuccessFlag; // 跟踪成功标识，0：失败，1：成功
} FIRST_PATH_T;

// 计算跟踪径所需的第一径镜像
typedef struct
{
    uint32 dwBtsId;    // 基站ID
    uint8 byFreqIndex; // 基站频率
    uint8 bySlot;      // 基站时隙

    uint32 dwBuildId; // 基站所在大楼编号
    uint32 dwLayerId; // 基站所在楼层编号

    uint16 wAheadCalIndex; // 上一次计算索引，帧内相对索引
} MIRROR_LCT_FIRSTPATH_T;

// 计算跟踪径所需的第一径镜像组
typedef struct
{
    uint8 byBtsNum;
    MIRROR_LCT_FIRSTPATH_T astMirrorLctFitstPathList[PUB_LCT_BTS_MAX_NUM];
} MIRROR_LCT_FIRSTPATH_LIST_T;

#endif