sysmain.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. // 秒寻科技
  2. // 系统主控
  3. // zt
  4. // 2023-03-04
  5. #include "../includes/includes.h"
  6. #include "./globaldata.h"
  7. // 定义本模块使用的全局变量
  8. int32 *gSysmain_pdwCurrentLctCoord = NULL; // 当前定位坐标
  9. uint8 *gSysmain_pbySoftNameVsersion = NULL; // 软件名称与版本
  10. // 导入全局变量
  11. extern PUB_SYS_STATUS_T gg_stSysStatus; // 系统状态
  12. extern PUB_LOCATION_DATA_T gg_astLocationDataList[PUB_SYS_CARRIER_NUM]; // 定位数据队列
  13. extern ROUTE_NEARBY_BTS_LIST gg_stNearbyBtsList; // 周边基站队列
  14. extern PUB_LCT_BTS_LIST_T gg_stLctBtsList; // 定位基站队列
  15. extern PUB_CURRENT_LCT_RESULT_T gg_stCurrentLctCoord; // 当前定位坐标
  16. // 模块初始化
  17. void sysmain_init()
  18. {
  19. // fft模块初始化
  20. util_fft_init();
  21. // 申请一片内存
  22. gSysmain_pdwCurrentLctCoord = malloc(sizeof(PUB_CURRENT_LCT_RESULT_T));
  23. gSysmain_pbySoftNameVsersion = malloc(sizeof(PUB_SOFT_NAME_VERSION_T));
  24. // 组织软件名称与版本
  25. sysmain_organize_soft_name_and_version(gSysmain_pbySoftNameVsersion);
  26. // 初始化全局数据
  27. globaldata_init();
  28. // 路由模块初始化
  29. route_main_init();
  30. // 初始化解调模块
  31. dmdl_main_init();
  32. // 初始化基站模块
  33. bts_main_init();
  34. // 初始化定位模块
  35. sysmain_init_lct();
  36. return;
  37. }
  38. // 初始化定位模块
  39. void sysmain_init_lct()
  40. {
  41. // 第一径参数
  42. LCT_FIRSTPATH_PARAM_T stFirstPathParam = {0};
  43. stFirstPathParam.byMinValueFactor = 11; // 最大值的10%作为选峰门限
  44. stFirstPathParam.byAnchorFactor = 21;
  45. stFirstPathParam.byAnchorThreshold = 30; // 35;
  46. stFirstPathParam.byPeakPeakDistance = 50; // 峰间距
  47. stFirstPathParam.byNoiseSignalFactor = 7;
  48. stFirstPathParam.byNoiseLowScale = 25; // 底噪放大低倍数,放大10倍保存
  49. stFirstPathParam.byNoiseHightScale = 50; // 底噪放大高倍数,放大10倍保存
  50. stFirstPathParam.byCfarLeftFactor = 120; // CFAR左侧门限
  51. stFirstPathParam.bySincFactor = 94; // 95;
  52. stFirstPathParam.byFirstPathContactFactor = 75;
  53. stFirstPathParam.wFirstPathContactDistance = 1200; // 8米
  54. // 跟踪径
  55. stFirstPathParam.wFirstPathTrackWindowWidth = 320; // 280; // 跟踪径搜索范围
  56. stFirstPathParam.wFirstPathTrackPeakGuardWidth = 80; // 160; // 跟踪保护贷款
  57. stFirstPathParam.byFirstPathTrackPeakGainFactor = 120; // 跟踪补偿因子
  58. stFirstPathParam.wFirstPathTrackNoiseFindWidth = 1000; // 跟踪径噪声搜索范围
  59. // 计算坐标点集参数
  60. LCT_COORDCAL_PARAM_T stLctCoordcalParam = {0};
  61. stLctCoordcalParam.dwAudioSpeed = PUB_AUDIO_SPEED; // 声速
  62. stLctCoordcalParam.dwPhoneCoordZ = 120;
  63. // 初始化阶段搜索框参数
  64. stLctCoordcalParam.dwCoordExpendLen = 300; // 初始搜索框向外扩大5米
  65. stLctCoordcalParam.dwIntervalDistance = 50; // 初始搜索格子间隔50厘米
  66. // 跟踪阶段搜索框参数
  67. stLctCoordcalParam.dwTrackCoordExpendLen = 300; // 跟踪阶段搜索框向外扩大3米
  68. stLctCoordcalParam.dwTrackIntervalDistance = 50; // 跟踪阶段搜索格子间隔厘米
  69. stLctCoordcalParam.dwMinimumValueNum = 5;
  70. // 判断二维基站第一径是否有效参数
  71. stLctCoordcalParam.dwFirstPahtValueThres = 150; // 二维第一径幅度有效门限
  72. stLctCoordcalParam.dwFirstPahtSnrThres = 35; // 二维第一径信噪有效门限(放大10倍)
  73. stLctCoordcalParam.dwFirstPathIndexJumpThres = 720; // 二维第一径跳变门限
  74. // 判断一维基站第一径是否有效参数,相比于二维门限要求有所提高
  75. stLctCoordcalParam.dwOneFirstPahtValueThres = 350; // 一维第一径幅度有效门限
  76. stLctCoordcalParam.dwOneFirstPahtSnrThres = 50; // 一维第一径信噪有效门限(放大10倍)
  77. stLctCoordcalParam.dwOneFirstPathIndexJumpThres = 500; // 一维第一径跳变门限
  78. stLctCoordcalParam.dwBtsEdgeExpendLen = 150; // 基站围成的矩形框向外扩展长度,默认值150
  79. stLctCoordcalParam.dwOneDimensionExpendLen = 200; // 一维定位时向外扩展长度,默认值200
  80. stLctCoordcalParam.dwOneDimensionSquareExpendLen = 500; // 一维定位时向外扩展长度,默认值500
  81. // 选择最优定位坐标模块参数
  82. LCT_COORDSEL_PARAM_T stLctCoordselParam = {0};
  83. stLctCoordselParam.dwValidDistanceThres = 400; // 极小值点到前一个点的有效距离门限
  84. stLctCoordselParam.dwPredictionRadius = 250; // 预测半径(极小值点必须在以预测点为圆心的圆内)
  85. //// 定位模块初始化
  86. lct_main_init(stFirstPathParam, stLctCoordcalParam, stLctCoordselParam);
  87. return;
  88. }
  89. // 音频信号处理入口
  90. // 返回值:1:成功,0:失败
  91. uint8 sysmain_audio_signal_process()
  92. {
  93. ////信号解调,输出定位数据
  94. dmdl_main(gg_astLocationDataList); // 新变频方案
  95. // dmdl_main_old(gg_astLocationDataList);//老变频方案
  96. ////查找用户周边的基站,并生成周边基站列表
  97. route_main(&gg_stNearbyBtsList);
  98. //// 更新定位数据队列中的基站ID和时隙
  99. lctdata_update_lct_data_btsid_and_slot(gg_astLocationDataList, &gg_stNearbyBtsList, &gg_stCurrentLctCoord);
  100. //// 计算主站ID,输出定位基站队列
  101. bts_main(gg_astLocationDataList, &gg_stNearbyBtsList, &gg_stLctBtsList);
  102. ////定位计算,输出当前定位点
  103. lct_main(&gg_stLctBtsList, gg_astLocationDataList, &gg_stCurrentLctCoord);
  104. ////保存当前定位坐标
  105. sysmain_save_current_location_coord(&gg_stCurrentLctCoord);
  106. // 消费定位数据
  107. sysmain_consume_location_data(gg_astLocationDataList);
  108. return 1;
  109. }
  110. // 消费定位数据
  111. void sysmain_consume_location_data(PUB_LOCATION_DATA_T *pstLocationDataList)
  112. {
  113. PUB_LOCATION_DATA_T *pstLocationData = NULL;
  114. int32 dwIndex = 0;
  115. for (uint8 i = 0; i < PUB_SYS_CARRIER_NUM; i++)
  116. {
  117. pstLocationData = (PUB_LOCATION_DATA_T *)&pstLocationDataList[i];
  118. // 生产第2帧后,开始维护当前帧的前一帧数据索引
  119. if (pstLocationData->dwDataListLen >= (2 * PUB_SLOT_FRAME_LEN))
  120. {
  121. // 前一帧定位数据索引
  122. dwIndex = pstLocationData->dwFourthLocationIndex + PUB_SLOT_FRAME_LEN;
  123. if (dwIndex >= PUB_LCT_DATA_LIST_LEN)
  124. {
  125. dwIndex -= PUB_LCT_DATA_LIST_LEN;
  126. }
  127. pstLocationData->dwFourthLocationIndex = dwIndex;
  128. }
  129. // 生产第5帧后,开始维护定位数据索引和变频索引
  130. if (pstLocationData->dwDataListLen >= (5 * PUB_SLOT_FRAME_LEN))
  131. {
  132. // 定位数据索引
  133. dwIndex = pstLocationData->dwLocationIndex + PUB_SLOT_FRAME_LEN;
  134. if (dwIndex >= PUB_LCT_DATA_LIST_LEN)
  135. {
  136. dwIndex -= PUB_LCT_DATA_LIST_LEN;
  137. }
  138. pstLocationData->dwLocationIndex = dwIndex;
  139. // 变频索引
  140. pstLocationData->dwDdcIndex += PUB_SLOT_FRAME_LEN;
  141. // 队列长度
  142. pstLocationData->dwDataListLen -= PUB_SLOT_FRAME_LEN;
  143. }
  144. }
  145. return;
  146. }
  147. // 保存当前定位坐标
  148. // pstLctResult:定位结果
  149. void sysmain_save_current_location_coord(PUB_CURRENT_LCT_RESULT_T *pstLctResult)
  150. {
  151. int32 *pdwData = gSysmain_pdwCurrentLctCoord;
  152. // 本次定位已完成
  153. if (pstLctResult->dwCpltFlag)
  154. {
  155. memcpy(pdwData, pstLctResult, sizeof(PUB_CURRENT_LCT_RESULT_T));
  156. pstLctResult->dwCpltFlag = 0; // 定位完成标识符置0,定位尚未完成
  157. pstLctResult->dwSuccessFlag = 0; // 定位成功标识符置0,定位失败
  158. }
  159. return;
  160. }
  161. // 查询当前定位坐标
  162. // 返回值是存储当前定位点的内存地址,若为NULL则标识暂未输出定位坐标
  163. int32 *sysmain_get_current_location_coord()
  164. {
  165. return (int32 *)gSysmain_pdwCurrentLctCoord;
  166. }
  167. // 组织软件名称与版本
  168. void sysmain_organize_soft_name_and_version(uint8 *pbyData)
  169. {
  170. PUB_SOFT_NAME_VERSION_T *pstData = (PUB_SOFT_NAME_VERSION_T *)pbyData;
  171. memcpy(pstData->abySoftName, PUB_SOFTWARE_NAME, PUB_SOFTWARE_NAME_LEN);
  172. memcpy(pstData->abySoftVersion, PUB_SOFTWARE_VERSION, PUB_SOFTWARE_VERSION_LEN);
  173. return;
  174. }
  175. // 查询软件名称与版本的存储地址
  176. uint8 *sysmain_get_soft_name_and_version_data_address()
  177. {
  178. return gSysmain_pbySoftNameVsersion;
  179. }
  180. // 释放模块内存
  181. void sysmain_free_memory()
  182. {
  183. free(gSysmain_pdwCurrentLctCoord);
  184. free(gSysmain_pbySoftNameVsersion);
  185. }