// 秒寻科技
// 计算各基站幅度
// 2023-03-12

#include "../../includes/includes.h"

// 导出全局变量定义
extern flt32 gg_afOneFrameLocationData[PUB_SLOT_FRAME_LEN];

// 将定位数据保存到镜像数据队列中，以准备时隙同步和位同步以及计算基站ID所需的数据(镜像1秒数据，镜像5秒数据)
// pstLocationDataList:定位数据队列
// pstBtsAmplMirrorDataList:镜像数据队列(输出参数)
void bts_mirror_main(PUB_LOCATION_DATA_T *pstLocationDataList, BTS_AMPL_MIRROR_DATA_T *pstBtsAmplMirrorDataList)
{
    PUB_LOCATION_DATA_T *pstLocationData = NULL;         // 一帧定位数据
    BTS_AMPL_MIRROR_DATA_T *pstBtsAmplMirrorData = NULL; // 一帧镜像数据
    uint32 dwFrameNo = 0;                                // 当前帧号
    uint8 byRemainder = 0;                               // 取模余数
    uint8 bySlotIndex = 0;                               // 时隙索引
    uint32 dwStartIndex = 0;
    flt32 *pfOneDataHead = NULL;
    flt32 *pfMultiDataHead = NULL;
    flt32 *pfDataHead = NULL;

    uint32 dwTmpIndex = 0;

    //// 遍历基站，镜像数据（包括一秒和5秒数据）
    for (uint8 i = 0; i < PUB_SYS_CARRIER_NUM; i++)
    {
        pstLocationData = &pstLocationDataList[i];           // 基站定位数据
        pstBtsAmplMirrorData = &pstBtsAmplMirrorDataList[i]; // 基站信号幅度镜像数据

        // 计算前一帧的帧号(帧号从1开始，第2帧时镜像第1帧)
        dwFrameNo = pstLocationData->dwFrameNo - 1;
        if (dwFrameNo > 0)
        {
            // 1秒缓存队列重置
            byRemainder = dwFrameNo % PUB_SYS_SLOT_NUM;
            if (byRemainder == 1)
            {
                memset(pstBtsAmplMirrorData->afOneSecondData, 0, sizeof(flt32) * PUB_SIGNAL_SAMPLE_RATIO);
            }

            // 多秒缓存队列重置
            byRemainder = dwFrameNo % BTS_AMPL_MIRROR_FRAMES;
            if (byRemainder == 1)
            {
                memset(pstBtsAmplMirrorData->afMultiSecondData, 0, sizeof(flt32) * PUB_SIGNAL_SAMPLE_RATIO);
            }

            // 获取当前帧的前一帧数据
            util_looplist_get_flt32(pstLocationData->afData, PUB_LCT_DATA_LIST_LEN, pstLocationData->dwFourthLocationIndex, gg_afOneFrameLocationData, PUB_SLOT_FRAME_LEN, &dwTmpIndex);
            pfDataHead = gg_afOneFrameLocationData;

            // 镜像数据
            bySlotIndex = (pstLocationData->dwFrameNo - 2) % PUB_SYS_SLOT_NUM; // 该帧所在时隙索引
            dwStartIndex = bySlotIndex * PUB_SLOT_FRAME_LEN;                   // 开始索引
            pfOneDataHead = &pstBtsAmplMirrorData->afOneSecondData[dwStartIndex];
            pfMultiDataHead = &pstBtsAmplMirrorData->afMultiSecondData[dwStartIndex];
            for (uint16 j = 0; j < PUB_SLOT_FRAME_LEN; j++)
            {
                *pfOneDataHead = *pfDataHead;
                *pfMultiDataHead += *pfDataHead;

                pfDataHead++;
                pfOneDataHead++;
                pfMultiDataHead++;
            }
        }
    }

    return;
}