ant.cpp 4.3 KB

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