// 秒寻科技
// 基站模块数据据结构
// zt
// 2023-03-29

#ifndef __STRUCT_BTS_H__
#define __STRUCT_BTS_H__

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

// 幅度模块宏定义
#define BTS_AMPL_MIRROR_SECONDS 4                            // 镜像秒数，几秒计算一次最强频点
#define BTS_AMPL_MIRROR_FRAMES (4 * BTS_AMPL_MIRROR_SECONDS) // 镜像帧数，每秒4帧
#define BTS_AMPL_MAIN_BTS_AMPL_VALID_THRESHOLD 1500          // 主站幅度有效门限（用户在某个时刻一定会更靠近某个基站，所以该基站幅度至少要大于该门限值）
#define BTS_AMPL_BTS_AMPL_VALID_THRESHOLD 350                // 基站幅度有效门限
#define BTS_AMPL_BTS_SNR_VALID_THRESHOLD 5                   // 基站SNR有效门限

// 同步模块宏定义
#define BTS_SYNC_STABLE_SYNC_FRAMES BTS_AMPL_MIRROR_FRAMES // 同步帧数，即几帧进行一次同步

// 计算基站ID
#define BTS_BTS_NUM 5000 // 基站最大规模数量

// 基站模块参数
typedef struct
{
    // 幅度模块
    int32 dwValidAmplThres;    // 有效幅度门限，默认值500
    int32 dwValidSnrThres;     // 有效snr门限，放大100倍保存，默认值500
    int32 dwAmplRatioThres;    // 当前幅度与上一次有效幅度之比门限，放大100倍保存，默认值15
    int32 dwBtsAmplValidTimes; // 幅度有效次数，默认值2，在一个周期内，只有2次及以上次有效，才能判定该基站有效

    // 同步模块
    int32 dwMainBtsValidAmplThres; // 主站有效幅度门限，默认值1500
} BTS_AMPL_PARAM_T;

// 基站幅度镜像数据结构
typedef struct
{
    uint8 byFreqIndex;                                            // 基站频率索引
    flt32 afOneSecondData[PUB_SYS_SLOT_NUM * PUB_SLOT_FRAME_LEN]; // 镜像一秒数据
    flt32 fOneSecondMaxValue;                                     // 一秒最大幅度
    uint16 wOneSecondMaxValueIndex;                               // 一秒最大幅度索引

    flt32 afMultiSecondData[PUB_SYS_SLOT_NUM * PUB_SLOT_FRAME_LEN]; // 镜像几秒数据
    uint8 byAmplValidTimes;                                         // 幅度有效次数
} BTS_AMPL_MIRROR_DATA_T;

// 基站最大幅度数据结构
typedef struct
{
    uint8 byFreqIndex;     // 载波索引
    flt32 fMaxValue;       // 最大幅度
    uint16 wMaxValueIndex; // 最大幅度索引
} BTS_MAX_AMPL_DATA_T;

// 基站ID镜像数据结构
typedef struct
{
    uint8 byBitIndex;                                // 基站ID位索引，从0到PUBLIC_BTS_ID_BITS_NUM - 1
    flt32 afBitMaxAmplitude[PUBLIC_BTS_ID_BITS_NUM]; // 基站ID每比特的表征幅度
    flt32 fAvarageValue;                             // 幅度平均值
} BTS_ID_MIRROR_DATA_T;

// 主站结构
typedef struct
{
    uint32 dwBtsId;     // 基站ID
    uint8 byFreqIndex;  // 基站频率
    uint8 bySlot;       // 基站时隙
    uint8 byShiftTimes; // 右移次数
} BTS_ID_MAIN_BTS_T;

// 判决主站结构
#define BTS_ID_CAL_MAIN_BTS_NUM 3 // 计算主站数量
typedef struct
{
    uint8 byBtsNum;                                        // 主站个数
    BTS_ID_MAIN_BTS_T astBtsList[BTS_ID_CAL_MAIN_BTS_NUM]; // 主站列表
} BTS_ID_JUDGEMENT_MAIN_BTS_T;

// 安装基站结构(项目中实际安装的基站)
typedef struct
{
    uint32 dwBuildId; // 大楼编号
    uint32 dwLayerId; // 楼层编号

    uint32 dwBtsId;     // 基站配置编号
    uint32 dwFreqIndex; // 基站配置频率
    uint32 dwSlot;      // 基站配置时隙

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

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

    uint32 adwBluetoothMac[PUB_MAC_ADDRESS_LEN]; // 蓝牙的mac地址
    uint32 adwWifiMac[PUB_MAC_ADDRESS_LEN];      // wifi的mac地址
} BTS_INSTALL_BTS_T;

// 安装基站组结构
typedef struct
{
    uint32 dwBtsNum; // 基站数量
    BTS_INSTALL_BTS_T astLocalBtsList[BTS_BTS_NUM];
} BTS_INSTALL_BTS_LIST_T;

#endif