123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- // 秒寻科技
- // 主站ID二次检查
- // zt
- // 2023-03-23
- #include "../../includes/includes.h"
- // 导入全局变量
- extern PUB_SYS_STATUS_T gg_stSysStatus;
- extern PUB_LOCATION_DATA_T gg_astLocationDataList[PUB_SYS_CARRIER_NUM];
- // 对判决主站ID进行二次校验,输出一组定位基站
- // pstJudgementMainBtsList:判决主站队列
- // pstLctBtsList:一组定位基站(返回参数)
- void bts_idcheck_main(BTS_ID_JUDGEMENT_MAIN_BTS_T *pstJudgementMainBtsList, PUB_LCT_BTS_LIST_T *pstLctBtsList)
- {
- BTS_ID_MAIN_BTS_T stJudgementBtsData = {0}; // 判决基站
- BTS_INSTALL_BTS_LIST_T *pstInstallBtsList = NULL; // 安装基站队列
- BTS_INSTALL_BTS_T stMainBtsData = {0}; // 主基站
- uint8 byCheckFlag = 0;
- // 判决主站数量不合法
- if (pstJudgementMainBtsList->byBtsNum < 1)
- {
- return;
- }
- // 获得安装基站队列
- pstInstallBtsList = (BTS_INSTALL_BTS_LIST_T *)bts_main_get_install_bts_list();
- // 校验判决基站(将判决站转换成安装站)
- for (uint8 i = 0; i < pstJudgementMainBtsList->byBtsNum; i++)
- {
- stJudgementBtsData = pstJudgementMainBtsList->astBtsList[i]; // 获得判决站
- // 遍历安装基站列表,找出与“判决站ID”相同的安装基站,并检验该基站周边的基站是否包含在判决站队列中
- for (uint16 j = 0; j < pstInstallBtsList->dwBtsNum; j++)
- {
- stMainBtsData = pstInstallBtsList->astLocalBtsList[j]; // 主基站
- // 判决基站ID与安装基站ID相同
- if (stJudgementBtsData.dwBtsId == stMainBtsData.dwBtsId && stJudgementBtsData.byFreqIndex == (uint8)stMainBtsData.dwFreqIndex)
- {
- // 校验“主基站”的周边基站是否有包含在判决基站列表中的,有则校验成功,无则校验失败
- byCheckFlag = bts_idcheck_check_nearby_bts(stMainBtsData, pstInstallBtsList, pstJudgementMainBtsList);
- if (byCheckFlag) // 校验成功
- {
- break;
- }
- }
- }
- // 校验成功
- if (byCheckFlag)
- {
- break;
- }
- }
- // 组织定位基站组(查询主站周边的基站)
- if (byCheckFlag)
- {
- bts_idcheck_gen_location_bts(stJudgementBtsData.byShiftTimes, stMainBtsData, pstInstallBtsList, pstLctBtsList);
- if (pstLctBtsList->byBtsNum > 1) // 有2个基站
- {
- gg_stSysStatus.byShiftTimes = stJudgementBtsData.byShiftTimes; // 保存右移次数
- // 切换系统至跟踪阶段
- if (!gg_stSysStatus.byBtsCaptureFlag)
- {
- gg_stSysStatus.byBtsCaptureFlag = 1;
- }
- }
- }
- return;
- }
- // 校验周边基站。计算主站与从站间的距离是否满足要求,若满足则进一步判断从站是否在判决基站队列中,在则校验成功,不在则校验失败。
- // stMainBtsData:主站
- // pstInstallBtsList:安装基站列表(都为从站)
- // pstJudgementMainBtsList:判决基站列表
- // 返回值:1:校验成功,0:校验失败
- uint8 bts_idcheck_check_nearby_bts(BTS_INSTALL_BTS_T stMainBtsData, BTS_INSTALL_BTS_LIST_T *pstInstallBtsList, BTS_ID_JUDGEMENT_MAIN_BTS_T *pstJudgementMainBtsList)
- {
- BTS_INSTALL_BTS_T stSlaveBts; // 从站
- flt32 fDistance = 0.0;
- uint8 byCheckFlag = 0;
- for (uint16 i = 0; i < pstInstallBtsList->dwBtsNum; i++)
- {
- stSlaveBts = pstInstallBtsList->astLocalBtsList[i]; // 从站
- // 若两基站在同一栋楼,也在同楼层
- if ((stMainBtsData.dwBtsId != stSlaveBts.dwBtsId && stMainBtsData.dwFreqIndex != stSlaveBts.dwFreqIndex) && (stMainBtsData.dwBuildId == stSlaveBts.dwBuildId) && (stMainBtsData.dwLayerId == stSlaveBts.dwLayerId))
- {
- // 检查主站与从站间的距离
- fDistance = bts_idcheck_cal_pp_distance(stMainBtsData.dwCoordX, stMainBtsData.dwCoordY, stSlaveBts.dwCoordX, stSlaveBts.dwCoordY);
- if (fDistance <= PUB_BTS_VALID_DISTANCE) // 距离合法
- {
- // 进一步检查从站是否在判决基站列表中
- for (uint8 j = 0; j < pstJudgementMainBtsList->byBtsNum; j++)
- {
- if (stSlaveBts.dwBtsId == pstJudgementMainBtsList->astBtsList[j].dwBtsId && (uint8)stSlaveBts.dwFreqIndex == pstJudgementMainBtsList->astBtsList[j].byFreqIndex)
- {
- byCheckFlag = 1;
- break;
- }
- }
- }
- }
- if (byCheckFlag)
- {
- break;
- }
- }
- return byCheckFlag;
- }
- // 计算两点之间的距离,坐标单位:厘米
- flt32 bts_idcheck_cal_pp_distance(int32 x1, int32 y1, int32 x2, int32 y2)
- {
- flt32 fDistance = 0.0;
- fDistance = (flt32)sqrt(((flt32)x1 / 100 - (flt32)x2 / 100) * ((flt32)x1 / 100 - (flt32)x2 / 100) + ((flt32)y1 / 100 - (flt32)y2 / 100) * ((flt32)y1 / 100 - (flt32)y2 / 100));
- return fDistance;
- }
- // 组织一组定位基
- // byShiftTimes:基站ID右移次数
- // stMainBtsData:主站
- // pstInstallBtsList:安装基站队列
- // pstLocationGroup:一组定位基站
- void bts_idcheck_gen_location_bts(uint8 byShiftTimes, BTS_INSTALL_BTS_T stMainBtsData, BTS_INSTALL_BTS_LIST_T *pstInstallBtsList, PUB_LCT_BTS_LIST_T *pstLocationGroup)
- {
- BTS_INSTALL_BTS_T stSlaveBts; // 从站
- flt32 fDistance = 0.0; // 主站与从站间的距离,单位:米
- PUB_LCT_BTS_T stLocationBts = {0}; // 定位基站
- uint8 byCounter = 0; // 定位基站个数
- // // 首先保存基准站
- // stLocationBts.dwMainBtsFlag = 1; // 主站
- // stLocationBts.dwBuildId = stMainBtsData.dwBuildId;
- // stLocationBts.dwLayerId = stMainBtsData.dwLayerId;
- // stLocationBts.dwBtsId = stMainBtsData.dwBtsId;
- // stLocationBts.dwFreqIndex = stMainBtsData.dwFreqIndex;
- // stLocationBts.dwSlot = stMainBtsData.dwSlot;
- // stLocationBts.dwCoordX = stMainBtsData.dwCoordX;
- // stLocationBts.dwCoordY = stMainBtsData.dwCoordY;
- // stLocationBts.dwCoordZ = stMainBtsData.dwCoordZ;
- // pstLocationGroup->astLocationBts[byCounter] = stLocationBts;
- // byCounter++;
- // 从安装基站队列中查找主站周边的从站
- for (uint16 i = 0; i < pstInstallBtsList->dwBtsNum; i++)
- {
- stSlaveBts = pstInstallBtsList->astLocalBtsList[i]; // 从站
- if (stMainBtsData.dwBuildId == stSlaveBts.dwBuildId && stMainBtsData.dwLayerId == stSlaveBts.dwLayerId)
- {
- // 检查主站与从站间的距离是否满足要求
- fDistance = bts_idcheck_cal_pp_distance(stMainBtsData.dwCoordX, stMainBtsData.dwCoordY, stSlaveBts.dwCoordX, stSlaveBts.dwCoordY);
- if (fDistance <= PUB_BTS_VALID_DISTANCE) // 距离合法
- {
- stLocationBts.dwMainBtsFlag = 2; // 从站
- stLocationBts.dwBuildId = stSlaveBts.dwBuildId;
- stLocationBts.dwLayerId = stSlaveBts.dwLayerId;
- stLocationBts.dwBtsId = stSlaveBts.dwBtsId;
- stLocationBts.dwFreqIndex = stSlaveBts.dwFreqIndex;
- stLocationBts.dwSlot = stSlaveBts.dwSlot;
- stLocationBts.dwCoordX = stSlaveBts.dwCoordX;
- stLocationBts.dwCoordY = stSlaveBts.dwCoordY;
- stLocationBts.dwCoordZ = stSlaveBts.dwCoordZ;
- pstLocationGroup->astLocationBts[byCounter] = stLocationBts;
- byCounter++;
- if (byCounter >= PUB_LCT_BTS_MAX_NUM)
- {
- break;
- }
- }
- }
- }
- pstLocationGroup->byBtsNum = byCounter;
- return;
- }
|