1
0

ant.cpp 4.3 KB

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