loc_tool.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include <vector>
  2. #include <log.h>
  3. #include <ant.h>
  4. #include <loc_tool.h>
  5. #include <message.h>
  6. std::vector<point> loc_tool_tdoa_3_base::calc_location(const std::vector<loc_message>&locm)
  7. {
  8. return std::vector<point>();
  9. }
  10. int loc_tool_tdoa_3_base::index()
  11. {
  12. return 5;
  13. }
  14. std::vector<point> loc_tool_tdoa_2_base::calc_location(const std::vector<loc_message>&locm)
  15. {
  16. return std::vector<point>();
  17. }
  18. int loc_tool_tdoa_2_base::index()
  19. {
  20. return 3;
  21. }
  22. std::vector<point> loc_tool_tdoa_1_base::calc_location(const std::vector<loc_message>&locm)
  23. {
  24. return std::vector<point>();
  25. }
  26. int loc_tool_tdoa_1_base::index()
  27. {
  28. return 1;
  29. }
  30. std::vector<point> loc_tool_tof_3_base::calc_location(const std::vector<loc_message>&locm)
  31. {
  32. return std::vector<point>();
  33. }
  34. int loc_tool_tof_3_base::index()
  35. {
  36. return 4;
  37. }
  38. std::vector<point> loc_tool_tof_2_base::calc_location(const std::vector<loc_message>&locm)
  39. {
  40. return std::vector<point>();
  41. }
  42. int loc_tool_tof_2_base::index()
  43. {
  44. return 2;
  45. }
  46. void loc_tool_tof_1_base::on_loc_message(ant*,const message_locinfo&m)
  47. {
  48. log_info("tof1-message:site=%d,ant=%d,card=%d,ct=%d,tof=%lld,rav=%02X,acc=%02X,rssi=%d",
  49. m.m_site_id,m.m_ant_id,m.m_card_id,m.m_card_ct,m.m_tof,m.m_rav,m.m_acc,m.m_rssi);
  50. }
  51. std::vector<point> loc_tool_tof_1_base::calc_location(const std::vector<loc_message>&locm)
  52. {
  53. return std::vector<point>();
  54. }
  55. int loc_tool_tof_1_base::index()
  56. {
  57. return 0;
  58. }
  59. loc_tool_main::loc_tool_main()
  60. {
  61. set_tool(new loc_tool_tof_1_base());
  62. set_tool(new loc_tool_tof_2_base());
  63. set_tool(new loc_tool_tof_3_base());
  64. set_tool(new loc_tool_tdoa_1_base());
  65. set_tool(new loc_tool_tdoa_2_base());
  66. set_tool(new loc_tool_tdoa_3_base());
  67. }
  68. loc_tool_main::~loc_tool_main()
  69. {
  70. for(auto&tool:g_tool)
  71. delete tool;
  72. }
  73. loc_tool* loc_tool_main::get_tool(int index)
  74. {
  75. if((uint32_t)index >= sizeof(g_tool)/sizeof(loc_tool*))
  76. return nullptr;
  77. return g_tool[index];
  78. }
  79. void loc_tool_main::set_tool(loc_tool*tool)
  80. {
  81. int index=tool->index();
  82. if(g_tool[index])
  83. {
  84. delete g_tool[index];
  85. g_tool[index]=0;
  86. }
  87. g_tool[index]=tool;
  88. }
  89. void loc_tool_main::on_loc_message(ant*a, const message_locinfo&m)
  90. {
  91. loc_tool*lt=get_tool(a->index());
  92. if(lt==nullptr)
  93. {
  94. log_warn("无法找到对应的loctool-message:site=%d,ant=%d,card=%d,ct=%d,tof=%lld,rav=%02X,acc=%02X,rssi=%d",
  95. m.m_site_id,m.m_ant_id,m.m_card_id,m.m_card_ct,m.m_tof,m.m_rav,m.m_acc,m.m_rssi);
  96. return;
  97. }
  98. lt->on_loc_message(a, m);
  99. }
  100. std::vector<point> loc_tool_main::calc_location(const std::vector<loc_message>&locm)
  101. {
  102. if(locm.empty()) return {};
  103. int tool_index=locm[0].tool_index(),i=1,len=locm.size();
  104. for(;i<len;i++)
  105. {
  106. if(tool_index!=locm[i].tool_index())
  107. break;
  108. }
  109. if(i==len)
  110. {
  111. return std::move(g_tool[tool_index]->calc_location(locm));
  112. }
  113. //包含至少两种定位方式的基站,目前只考虑两种
  114. std::vector<loc_message> locm1,locm2;
  115. locm1.assign(locm.begin(),locm.begin()+i);
  116. for(;i<len;i++)
  117. {
  118. if(tool_index!=locm[i].tool_index())
  119. locm2.push_back(locm[i]);
  120. else
  121. locm1.push_back(locm[i]);
  122. }
  123. std::vector<point> rc;
  124. if(locm1[0].m_ant->config().best_msg_cnt<=(int)locm1.size())
  125. {
  126. rc=std::move(g_tool[tool_index]->calc_location(locm1));
  127. }
  128. if(locm2[0].m_ant->config().best_msg_cnt<=(int)locm2.size())
  129. {
  130. int index=locm2[0].tool_index();
  131. auto v=std::move(g_tool[index]->calc_location(locm2));
  132. rc.insert(rc.begin(),v.begin(),v.end());
  133. }
  134. return std::move(rc);
  135. }