ant.cppbak 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <math.h>
  4. #include "ant.h"
  5. int site::index()const
  6. {
  7. return m_algo+(m_num_dims<<1);
  8. }
  9. sit_list*sit_list::instance()
  10. {
  11. static sit_list _impl;
  12. //_impl.load_from_db();
  13. return &_impl;
  14. }
  15. site::site(int id)
  16. :m_algo(0)
  17. ,m_num_dims(0)
  18. ,m_id(id)
  19. ,m_path_empty(true)
  20. {
  21. }
  22. const algo_config&site::config()const
  23. {
  24. return g_config[index()];
  25. }
  26. const site& sit_list::operator[](int id) const
  27. {
  28. return m_list[id];
  29. }
  30. static int str_split(char*s,char**rc)
  31. {
  32. char**o=rc;
  33. for(;*s;)
  34. {
  35. *o=strtok_r(s,",",&s);
  36. o++;
  37. }
  38. return o-rc;
  39. }
  40. //1, 101, 1, '101-1', 4727, 75, 0, 0, '2017-08-29 10:21:14'
  41. void sit_list::read_sit_list(const char*fname)
  42. {
  43. FILE*fp=fopen(fname,"r");
  44. char buf[512];
  45. int t,id;
  46. char* s[20];
  47. while(fgets(buf,sizeof(buf),fp))
  48. {
  49. t=str_split(buf,&s[0]);
  50. if(t<8)
  51. continue;
  52. id=atoi(s[1]);
  53. if(id>(int)m_list.size())
  54. continue;
  55. int antid=atoi(s[2])-1;
  56. if(antid>=2)
  57. continue;
  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:m_list)
  62. {
  63. if(sit.m_id==-1)
  64. continue;
  65. if(sit.m_ant[0]==sit.m_ant[1])
  66. {
  67. printf("%d分站天线坐标相等.\n",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. if(id>(int)m_list.size())
  86. continue;
  87. pid=atoi(s[1]);
  88. if(pid>2)
  89. continue;
  90. point p1(atof(s[2]),-atof(s[3]));
  91. point p2(atof(s[5]),-atof(s[6]));
  92. if(pid == 0)
  93. {
  94. line_v l(p1,p2);
  95. {
  96. point px = l.line::projection(m_list[id]);
  97. m_list[id].set(px);
  98. for(int i=0;i<2;i++)
  99. {
  100. path p;
  101. p.m_slope[0] = atof(s[8]);
  102. p.m_line[0] = line_v(px,l[i]);
  103. m_list[id].m_ant[i].m_path.push_back(p);
  104. }
  105. }
  106. }
  107. else
  108. {
  109. ant &a = pid<0?m_list[id].m_ant[0]:m_list[id].m_ant[1];
  110. if(a.m_path.size()!=0)
  111. {
  112. path &p = a.m_path[0];
  113. p.m_line[abs(pid)-1] = line_v(p1,p2);
  114. p.m_slope[abs(pid)-1] = atof(s[8]);
  115. }
  116. else
  117. {
  118. path p;
  119. p.m_line[abs(pid)-1] = line_v(p1,p2);
  120. p.m_slope[abs(pid)-1] = atof(s[8]);
  121. a.m_path.push_back(p);
  122. }
  123. if(abs(pid)==1)
  124. m_list[id].set(p1);
  125. }
  126. }
  127. fclose(fp);
  128. for(auto&s:m_list)
  129. {
  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. //std_info("%f----%f",s.x,s.y);
  147. }
  148. }
  149. loc_message::loc_message()
  150. :m_num_ticks(0)
  151. {
  152. }
  153. int loc_message::tool_index()const
  154. {
  155. return m_sit.index();
  156. }
  157. algo_config site::g_config[]=
  158. {
  159. { "tof-1", 1, 2, 0.1, 1 },
  160. { "tdoa-1", 2, 2, 0.1, 1 },
  161. { "tof-2", 2, 3, 0.1, 1 },
  162. { "tdoa-2", 3, 3, 0.1, 1 },
  163. { "tof-3", 3, 4, 0.1, 1 },
  164. { "tdoa-3", 4, 4, 0.1, 1 }
  165. };
  166. template<> std::shared_ptr<sit_list>
  167. single_base<sit_list, int, std::shared_ptr<site>>::m_instance=std::make_shared<sit_list>();
  168. #ifdef _TEST
  169. int main()
  170. {
  171. log_init("./log.ini");
  172. sit_list *sl = sit_list::instance();
  173. sl->load("data_reader_antenna.txt","path_tof.txt");
  174. (*sl)[219].solving(0,100);
  175. (*sl)[219].solving(1,100.5);
  176. std_info("---%d",(*sl)[209].m_ant[0].m_path.size());
  177. std_info("---%d",(*sl)[209][0].size());
  178. std_info("---%s",(*sl)[209][0][0][0].to_string().c_str());
  179. }
  180. #endif