ant.cpp 3.9 KB

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