1
0

ant.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #include "ant.h"
  5. int ant::index()const
  6. {
  7. return m_algo+(m_num_dims<<1);
  8. }
  9. ant_list*ant_list::instance()
  10. {
  11. static ant_list _impl;
  12. _impl.load_from_db();
  13. return &_impl;
  14. }
  15. const algo_config&ant::config()const
  16. {
  17. return g_config[m_algo+(m_num_dims<<1)];
  18. }
  19. loc_message::loc_message()
  20. :m_ant(nullptr)
  21. ,m_num_ticks(0)
  22. {
  23. }
  24. int loc_message::tool_index()const
  25. {
  26. return m_ant->index();
  27. }
  28. std::vector<point> loc_tool_tdoa_3_base::calc_location(const std::vector<loc_message>&locm)
  29. {
  30. return std::vector<point>();
  31. }
  32. int loc_tool_tdoa_3_base::index()
  33. {
  34. return 5;
  35. }
  36. std::vector<point> loc_tool_tdoa_2_base::calc_location(const std::vector<loc_message>&locm)
  37. {
  38. return std::vector<point>();
  39. }
  40. int loc_tool_tdoa_2_base::index()
  41. {
  42. return 3;
  43. }
  44. std::vector<point> loc_tool_tdoa_1_base::calc_location(const std::vector<loc_message>&locm)
  45. {
  46. return std::vector<point>();
  47. }
  48. int loc_tool_tdoa_1_base::index()
  49. {
  50. return 1;
  51. }
  52. std::vector<point> loc_tool_tof_3_base::calc_location(const std::vector<loc_message>&locm)
  53. {
  54. return std::vector<point>();
  55. }
  56. int loc_tool_tof_3_base::index()
  57. {
  58. return 4;
  59. }
  60. std::vector<point> loc_tool_tof_2_base::calc_location(const std::vector<loc_message>&locm)
  61. {
  62. return std::vector<point>();
  63. }
  64. int loc_tool_tof_2_base::index()
  65. {
  66. return 2;
  67. }
  68. std::vector<point> loc_tool_tof_1_base::calc_location(const std::vector<loc_message>&locm)
  69. {
  70. return std::vector<point>();
  71. }
  72. int loc_tool_tof_1_base::index()
  73. {
  74. return 0;
  75. }
  76. loc_tool_main::loc_tool_main()
  77. {
  78. set_tool(new loc_tool_tof_1_base());
  79. set_tool(new loc_tool_tof_2_base());
  80. set_tool(new loc_tool_tof_3_base());
  81. set_tool(new loc_tool_tdoa_1_base());
  82. set_tool(new loc_tool_tdoa_2_base());
  83. set_tool(new loc_tool_tdoa_3_base());
  84. }
  85. loc_tool_main::~loc_tool_main()
  86. {
  87. for(auto&tool:g_tool)
  88. delete tool;
  89. }
  90. void loc_tool_main::set_tool(loc_tool*tool)
  91. {
  92. int index=tool->index();
  93. if(g_tool[index])
  94. {
  95. delete g_tool[index];
  96. g_tool[index]=0;
  97. }
  98. g_tool[index]=tool;
  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(locm1[1].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. }
  136. loc_tool* loc_tool_main::g_tool[6]={0,0,0,0,0,0};
  137. algo_config ant::g_config[]=
  138. {
  139. { "tof-1", 1, 2, 100, 1000 },
  140. { "tdoa-1", 2, 2, 100, 1000 },
  141. { "tof-2", 2, 3, 100, 1000 },
  142. { "tdoa-2", 3, 3, 100, 1000 },
  143. { "tof-3", 3, 4, 100, 1000 },
  144. { "tdoa-3", 4, 4, 100, 1000 }
  145. };