bts_idcheck.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. // 秒寻科技
  2. // 主站ID二次检查
  3. // zt
  4. // 2023-03-23
  5. #include "../../includes/includes.h"
  6. // 导入全局变量
  7. extern PUB_SYS_STATUS_T gg_stSysStatus;
  8. extern PUB_LOCATION_DATA_T gg_astLocationDataList[PUB_SYS_CARRIER_NUM];
  9. // 对判决主站ID进行二次校验,输出一组定位基站
  10. // pstJudgementMainBtsList:判决主站队列
  11. // pstLctBtsList:一组定位基站(返回参数)
  12. void bts_idcheck_main(BTS_ID_JUDGEMENT_MAIN_BTS_T *pstJudgementMainBtsList, PUB_LCT_BTS_LIST_T *pstLctBtsList)
  13. {
  14. BTS_ID_MAIN_BTS_T stJudgementBtsData = {0}; // 判决基站
  15. BTS_INSTALL_BTS_LIST_T *pstInstallBtsList = NULL; // 安装基站队列
  16. BTS_INSTALL_BTS_T stMainBtsData = {0}; // 主基站
  17. uint8 byCheckFlag = 0;
  18. // 判决主站数量不合法
  19. if (pstJudgementMainBtsList->byBtsNum < 1)
  20. {
  21. return;
  22. }
  23. // 获得安装基站队列
  24. pstInstallBtsList = (BTS_INSTALL_BTS_LIST_T *)bts_main_get_install_bts_list();
  25. // 校验判决基站(将判决站转换成安装站)
  26. for (uint8 i = 0; i < pstJudgementMainBtsList->byBtsNum; i++)
  27. {
  28. stJudgementBtsData = pstJudgementMainBtsList->astBtsList[i]; // 获得判决站
  29. // 遍历安装基站列表,找出与“判决站ID”相同的安装基站,并检验该基站周边的基站是否包含在判决站队列中
  30. for (uint16 j = 0; j < pstInstallBtsList->dwBtsNum; j++)
  31. {
  32. stMainBtsData = pstInstallBtsList->astLocalBtsList[j]; // 主基站
  33. // 判决基站ID与安装基站ID相同
  34. if (stJudgementBtsData.dwBtsId == stMainBtsData.dwBtsId && stJudgementBtsData.byFreqIndex == (uint8)stMainBtsData.dwFreqIndex)
  35. {
  36. // 校验“主基站”的周边基站是否有包含在判决基站列表中的,有则校验成功,无则校验失败
  37. byCheckFlag = bts_idcheck_check_nearby_bts(stMainBtsData, pstInstallBtsList, pstJudgementMainBtsList);
  38. if (byCheckFlag) // 校验成功
  39. {
  40. break;
  41. }
  42. }
  43. }
  44. // 校验成功
  45. if (byCheckFlag)
  46. {
  47. break;
  48. }
  49. }
  50. // 组织定位基站组(查询主站周边的基站)
  51. if (byCheckFlag)
  52. {
  53. bts_idcheck_gen_location_bts(stJudgementBtsData.byShiftTimes, stMainBtsData, pstInstallBtsList, pstLctBtsList);
  54. if (pstLctBtsList->byBtsNum > 1) // 有2个基站
  55. {
  56. gg_stSysStatus.byShiftTimes = stJudgementBtsData.byShiftTimes; // 保存右移次数
  57. // 切换系统至跟踪阶段
  58. if (!gg_stSysStatus.byBtsCaptureFlag)
  59. {
  60. gg_stSysStatus.byBtsCaptureFlag = 1;
  61. }
  62. }
  63. }
  64. return;
  65. }
  66. // 校验周边基站。计算主站与从站间的距离是否满足要求,若满足则进一步判断从站是否在判决基站队列中,在则校验成功,不在则校验失败。
  67. // stMainBtsData:主站
  68. // pstInstallBtsList:安装基站列表(都为从站)
  69. // pstJudgementMainBtsList:判决基站列表
  70. // 返回值:1:校验成功,0:校验失败
  71. uint8 bts_idcheck_check_nearby_bts(BTS_INSTALL_BTS_T stMainBtsData, BTS_INSTALL_BTS_LIST_T *pstInstallBtsList, BTS_ID_JUDGEMENT_MAIN_BTS_T *pstJudgementMainBtsList)
  72. {
  73. BTS_INSTALL_BTS_T stSlaveBts; // 从站
  74. flt32 fDistance = 0.0;
  75. uint8 byCheckFlag = 0;
  76. for (uint16 i = 0; i < pstInstallBtsList->dwBtsNum; i++)
  77. {
  78. stSlaveBts = pstInstallBtsList->astLocalBtsList[i]; // 从站
  79. // 若两基站在同一栋楼,也在同楼层
  80. if ((stMainBtsData.dwBtsId != stSlaveBts.dwBtsId && stMainBtsData.dwFreqIndex != stSlaveBts.dwFreqIndex) && (stMainBtsData.dwBuildId == stSlaveBts.dwBuildId) && (stMainBtsData.dwLayerId == stSlaveBts.dwLayerId))
  81. {
  82. // 检查主站与从站间的距离
  83. fDistance = bts_idcheck_cal_pp_distance(stMainBtsData.dwCoordX, stMainBtsData.dwCoordY, stSlaveBts.dwCoordX, stSlaveBts.dwCoordY);
  84. if (fDistance <= PUB_BTS_VALID_DISTANCE) // 距离合法
  85. {
  86. // 进一步检查从站是否在判决基站列表中
  87. for (uint8 j = 0; j < pstJudgementMainBtsList->byBtsNum; j++)
  88. {
  89. if (stSlaveBts.dwBtsId == pstJudgementMainBtsList->astBtsList[j].dwBtsId && (uint8)stSlaveBts.dwFreqIndex == pstJudgementMainBtsList->astBtsList[j].byFreqIndex)
  90. {
  91. byCheckFlag = 1;
  92. break;
  93. }
  94. }
  95. }
  96. }
  97. if (byCheckFlag)
  98. {
  99. break;
  100. }
  101. }
  102. return byCheckFlag;
  103. }
  104. // 计算两点之间的距离,坐标单位:厘米
  105. flt32 bts_idcheck_cal_pp_distance(int32 x1, int32 y1, int32 x2, int32 y2)
  106. {
  107. flt32 fDistance = 0.0;
  108. 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));
  109. return fDistance;
  110. }
  111. // 组织一组定位基
  112. // byShiftTimes:基站ID右移次数
  113. // stMainBtsData:主站
  114. // pstInstallBtsList:安装基站队列
  115. // pstLocationGroup:一组定位基站
  116. 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)
  117. {
  118. BTS_INSTALL_BTS_T stSlaveBts; // 从站
  119. flt32 fDistance = 0.0; // 主站与从站间的距离,单位:米
  120. PUB_LCT_BTS_T stLocationBts = {0}; // 定位基站
  121. uint8 byCounter = 0; // 定位基站个数
  122. // // 首先保存基准站
  123. // stLocationBts.dwMainBtsFlag = 1; // 主站
  124. // stLocationBts.dwBuildId = stMainBtsData.dwBuildId;
  125. // stLocationBts.dwLayerId = stMainBtsData.dwLayerId;
  126. // stLocationBts.dwBtsId = stMainBtsData.dwBtsId;
  127. // stLocationBts.dwFreqIndex = stMainBtsData.dwFreqIndex;
  128. // stLocationBts.dwSlot = stMainBtsData.dwSlot;
  129. // stLocationBts.dwCoordX = stMainBtsData.dwCoordX;
  130. // stLocationBts.dwCoordY = stMainBtsData.dwCoordY;
  131. // stLocationBts.dwCoordZ = stMainBtsData.dwCoordZ;
  132. // pstLocationGroup->astLocationBts[byCounter] = stLocationBts;
  133. // byCounter++;
  134. // 从安装基站队列中查找主站周边的从站
  135. for (uint16 i = 0; i < pstInstallBtsList->dwBtsNum; i++)
  136. {
  137. stSlaveBts = pstInstallBtsList->astLocalBtsList[i]; // 从站
  138. if (stMainBtsData.dwBuildId == stSlaveBts.dwBuildId && stMainBtsData.dwLayerId == stSlaveBts.dwLayerId)
  139. {
  140. // 检查主站与从站间的距离是否满足要求
  141. fDistance = bts_idcheck_cal_pp_distance(stMainBtsData.dwCoordX, stMainBtsData.dwCoordY, stSlaveBts.dwCoordX, stSlaveBts.dwCoordY);
  142. if (fDistance <= PUB_BTS_VALID_DISTANCE) // 距离合法
  143. {
  144. stLocationBts.dwMainBtsFlag = 2; // 从站
  145. stLocationBts.dwBuildId = stSlaveBts.dwBuildId;
  146. stLocationBts.dwLayerId = stSlaveBts.dwLayerId;
  147. stLocationBts.dwBtsId = stSlaveBts.dwBtsId;
  148. stLocationBts.dwFreqIndex = stSlaveBts.dwFreqIndex;
  149. stLocationBts.dwSlot = stSlaveBts.dwSlot;
  150. stLocationBts.dwCoordX = stSlaveBts.dwCoordX;
  151. stLocationBts.dwCoordY = stSlaveBts.dwCoordY;
  152. stLocationBts.dwCoordZ = stSlaveBts.dwCoordZ;
  153. pstLocationGroup->astLocationBts[byCounter] = stLocationBts;
  154. byCounter++;
  155. if (byCounter >= PUB_LCT_BTS_MAX_NUM)
  156. {
  157. break;
  158. }
  159. }
  160. }
  161. }
  162. pstLocationGroup->byBtsNum = byCounter;
  163. return;
  164. }