ant.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #include "ant.h"
  5. template<> std::shared_ptr<sit_list>
  6. single_base<sit_list, int, std::shared_ptr<site>>::m_instance=std::make_shared<sit_list>();
  7. int site::index()const
  8. {
  9. return m_algo+(m_num_dims<<1);
  10. }
  11. site::site(int id)
  12. :m_algo(0)
  13. ,m_num_dims(0)
  14. ,m_id(id)
  15. ,m_path_empty(true)
  16. {
  17. }
  18. void site::set_client(std::shared_ptr<client>& clt)
  19. {
  20. m_clt=clt;
  21. }
  22. const algo_config&site::config()const
  23. {
  24. return g_config[index()];
  25. }
  26. static int str_split(char*s,char**rc)
  27. {
  28. char**o=rc;
  29. for(;*s;)
  30. {
  31. *o=strtok_r(s,",",&s);
  32. o++;
  33. }
  34. return o-rc;
  35. }
  36. //1, 101, 1, '101-1', 4727, 75, 0, 0, '2017-08-29 10:21:14'
  37. void sit_list::read_sit_list(const char*fname)
  38. {
  39. FILE*fp=fopen(fname,"r");
  40. char buf[512];
  41. int t,id;
  42. char* s[20];
  43. while(fgets(buf,sizeof(buf),fp))
  44. {
  45. t=str_split(buf,&s[0]);
  46. if(t<8)
  47. continue;
  48. id=atoi(s[1]);
  49. int antid=atoi(s[2])-1;
  50. if(antid>=2)
  51. continue;
  52. auto tmp = m_instance->get(id);
  53. if(tmp==nullptr)
  54. tmp = std::make_shared<site>(id);
  55. tmp->m_ant[antid].set(atof(s[4]),-atof(s[5]));
  56. sit_list::instance()->add(id,tmp);
  57. //std_info("211111 id=%dsize = %d",id,instance()->m_map.size());
  58. //m_list[id].m_id=id;
  59. //m_list[id].m_ant[antid].set(atof(s[4]),-atof(s[5]));
  60. }
  61. for(auto&sit_:sit_list::instance()->m_map)
  62. {
  63. auto & sit = *(sit_.second);
  64. if(sit.m_id==-1)
  65. continue;
  66. if(sit.m_ant[0]==sit.m_ant[1])
  67. {
  68. log_warn("%d分站天线坐标相等.",sit.m_id);
  69. }
  70. sit.set( (sit.m_ant[0].x+sit.m_ant[1].x)/2,(sit.m_ant[0].y+sit.m_ant[1].y)/2);
  71. }
  72. fclose(fp);
  73. }
  74. void sit_list::read_ant_path(const char*fname)
  75. {
  76. FILE*fp=fopen(fname,"r");
  77. char buf[512],*p;
  78. int t,id,pid;
  79. char* s[20];
  80. while((p=fgets(buf,sizeof(buf),fp)))
  81. {
  82. t=str_split(buf,&s[0]);
  83. if(t<9)
  84. continue;
  85. id=atoi(s[0]);
  86. auto s_ = sit_list::instance()->get(id);
  87. if(s_==nullptr)
  88. continue;
  89. pid=atoi(s[1]);
  90. if(pid>2)
  91. continue;
  92. point p1(atof(s[2]),-atof(s[3]));
  93. point p2(atof(s[5]),-atof(s[6]));
  94. auto &sit_ = *s_;
  95. if(pid == 0)
  96. {
  97. line_v l(p1,p2);
  98. {
  99. point px = l.line::projection(sit_);
  100. sit_.set(px);
  101. for(int i=0;i<2;i++)
  102. {
  103. path p;
  104. p.m_slope[0] = atof(s[8]);
  105. p.m_line[0] = line_v(px,l[i]);
  106. sit_.m_ant[i].m_path.push_back(p);
  107. }
  108. }
  109. }
  110. else
  111. {
  112. ant &a = pid<0?sit_.m_ant[0]:sit_.m_ant[1];
  113. if(a.m_path.size()!=0)
  114. {
  115. path &p = a.m_path[0];
  116. p.m_line[abs(pid)-1] = line_v(p1,p2);
  117. p.m_slope[abs(pid)-1] = atof(s[8]);
  118. }
  119. else
  120. {
  121. path p;
  122. p.m_line[abs(pid)-1] = line_v(p1,p2);
  123. p.m_slope[abs(pid)-1] = atof(s[8]);
  124. a.m_path.push_back(p);
  125. }
  126. if(abs(pid)==1)
  127. sit_.set(p1);
  128. }
  129. }
  130. fclose(fp);
  131. for(auto&_s:sit_list::instance()->m_map)
  132. {
  133. auto & s = *(_s.second);
  134. if(s.m_id==-1)
  135. continue;
  136. s.swap();
  137. if((s.path(0).empty() && s.path(1).empty()))
  138. continue;
  139. s.m_path_empty=false;
  140. for(auto &a:s.m_ant)
  141. for(auto &p:a.m_path)
  142. {
  143. if(!p.m_line[0].empty())
  144. {
  145. point px = p.m_line[0].line::projection(a);
  146. p.m_line[0]=line_v(px,p.m_line[0][1]);
  147. }
  148. }
  149. //std_info("%s",s.to_string().c_str());
  150. log_info("%s",s.to_string().c_str());
  151. //std_info("%f----%f",s.x,s.y);
  152. }
  153. }
  154. loc_message::loc_message()
  155. :m_num_ticks(0)
  156. {
  157. }
  158. int loc_message::tool_index()const
  159. {
  160. return m_sit.index();
  161. }
  162. algo_config site::g_config[]=
  163. {
  164. { "tof-1", 1, 2, 0.1, 1 },
  165. { "tdoa-1", 2, 2, 0.1, 1 },
  166. { "tof-2", 2, 3, 0.1, 1 },
  167. { "tdoa-2", 3, 3, 0.1, 1 },
  168. { "tof-3", 3, 4, 0.1, 1 },
  169. { "tdoa-3", 4, 4, 0.1, 1 }
  170. };
  171. #ifdef _TEST
  172. int main()
  173. {
  174. log_init("./log.ini");
  175. //sit_list *sl = sit_list::instance();
  176. sit_list::instance()->load("data_reader_antenna.txt","path_tof.txt");
  177. sit_list::instance()->get(209)->solving(0,100);
  178. sit_list::instance()->get(209)->solving(1,100.5);
  179. //std_info("---%d",(*sl)[209].m_ant[0].m_path.size());
  180. //std_info("---%d",(*sl)[209][0].size());
  181. //std_info("---%s",(*sl)[209][0][0][0].to_string().c_str());
  182. }
  183. #endif