ant.cpp 4.0 KB

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