zhuyf 4 anni fa
parent
commit
1e6fe5ed84
22 ha cambiato i file con 274 aggiunte e 174 eliminazioni
  1. 19 91
      ant.cpp
  2. 19 10
      ant.h
  3. 27 6
      card_base.cpp
  4. 14 3
      card_base.h
  5. 6 1
      card_person.cpp
  6. 0 1
      card_person.h
  7. 11 10
      db/db_card.cpp
  8. 0 10
      geo_hash.cpp
  9. 1 0
      loc_message.h
  10. 2 1
      main.cpp
  11. 20 8
      message.cpp
  12. 2 2
      message.h
  13. 65 10
      net-service.cpp
  14. 2 1
      net-service.h
  15. 4 1
      service_position.cpp
  16. 2 1
      tdoa_sync.cpp
  17. 28 10
      websocket/jsonBuilder.cpp
  18. 1 1
      websocket/jsonBuilder.h
  19. 3 1
      websocket/web_connect.cpp
  20. 28 5
      websocket/wsTimerThread.cpp
  21. 1 0
      websocket/wsTimerThread.h
  22. 19 1
      websocket/ws_common.h

+ 19 - 91
ant.cpp

@@ -11,7 +11,8 @@
 
 int site::index()const
 {
-	return m_algo+(m_num_dims<<1);
+	//return m_algo+(m_num_dims<<1);
+    return (m_algo<<4) + m_num_dims;
 }
 
 site::site(int id)
@@ -30,63 +31,6 @@ const algo_config&site::config()const
 	return g_config[index()];
 }
 
-#if 0
-bool site::check_timestamp(const char*tm_buf)
-{
-	//秒、分、时、天、周、月、年
-
-	struct tm t={0};
-
-
-	char buf[6];
-	buf[0]=tm_buf[6];
-	buf[1]=tm_buf[5];
-	buf[2]=tm_buf[3];
-	buf[3]=tm_buf[2];
-	buf[4]=tm_buf[1];
-	buf[5]=tm_buf[0];
-
-	t.tm_year=buf[0]+100;
-	t.tm_mon=buf[1]-1;
-	t.tm_mday=buf[2];
-	t.tm_hour=buf[3];
-	t.tm_min=buf[4];
-	t.tm_sec=buf[5];
-
-	time_t now=time(0);
-	time_t site_tm=mktime(&t);
-	int off=abs(now-site_tm);
-
-	if(off>0)
-	{
-		off=log(off)/log(2);
-	}
-
-	m_timeoff_count[off]++;
-
-	if(m_package_count++ % 300 ==0 )
-	{
-		std::ostringstream stm;
-		for(uint32_t i=0;i<m_timeoff_count.size();i++)
-		{
-			if(m_timeoff_count[i]==0)
-				continue;
-
-			stm<<"("<<i<<":"<<m_timeoff_count[i]<<"),";
-		}
-
-		log_info("site-time-stat:site_id=%d,%s",m_id,stm.str().c_str());
-	}
-
-	if(memcmp(m_timestamp,buf,6)<=0)
-	{
-		memcpy(m_timestamp,buf,6);
-		return true;
-	}
-	return false;
-}
-#endif
-
 void ant::set_path(const std::vector<line_v>&v_line,std::vector<line_v>::const_iterator itm)
 {
 	auto it=itm;
@@ -275,23 +219,6 @@ bool visit_site_status::visit(std::shared_ptr<site> s)
 	return true;
 }
 
-static void test_find_path(card_path&cp,const point&p1,const point&p2)
-{
-	printf("\nfind-path:  from=(%.3lf,%.3lf),to=(%.3lf,%.3lf)\n",p1.x,p1.y,p2.x,p2.y);
-	std::vector<point> rc=cp.find_path(p1,p2);
-	for(uint32_t i=0;i<rc.size();i++)
-		printf("x=%.3lf,y=%.3lf\n",rc[i].x,rc[i].y);
-}
-
-//static void test_find_poss_path(const card_path&cp ,const point&from)
-//{
-//	log_info("\nfind-poss_path:  from=(%.3lf,%.3lf)\n",from.x,from.y);
-//	std::vector<line_v> rc=cp.find_possible_path(from,3);
-//	for(uint32_t i=0;i<rc.size();i++)
-//	{
-//		log_info("poss path from=(%.3lf,%.3lf) to=(%.3lf,%.3lf)\n", rc[i][0].x,rc[i][0].y, rc[i][1].x,rc[i][1].y);
-//	}
-//}
 void sit_list::read_ant_path(int id)
 {
 	std::string sql = "SELECT reader_id,tof_flag,b_x,b_y,b_z,e_x,e_y,e_z,spacing_ratio FROM dat_reader_path_tof_n";
@@ -451,22 +378,13 @@ void sit_list::read_ant_path(int id)
 	}
 
 	card_path::init();
-
-	test_find_path(card_path::inst(),point(4784.50,-25.49),point(4784.50,-28.78));
-	test_find_path(card_path::inst(),point(4727,-8.06),point(2200,-75));
-	test_find_path(card_path::inst(),point(4727,-8.06),point(2600,-100));
-	test_find_path(card_path::inst(),point(2768.50,-75.00),point(2768.50,-161.58));
-	test_find_path(card_path::inst(),point(4727,-8.06),point(5427.04,-304.02));
-	test_find_path(card_path::inst(),point(4714.70,-8.06),point(5427.04,-304.02));
-	test_find_path(card_path::inst(),point(4727,-75),point(2200,-75));
-	test_find_path(card_path::inst(),point(4683.625,56.988),point(2200,-75));
 }
 
 void sit_list::init_site(const std::string &ids /*=""*/)
 {
      std::string sql = "SELECT reader_id, reader_type_id, dat_reader.map_id, \
              area_id, device_type_id, dimension, dat_map.scale,need_power_alarm\
-			 ,x,y \
+			 ,x,y, pdoa_offset, pdoa_direction\
              FROM dat_reader, dat_map where \
              dat_reader.map_id=dat_map.map_id and state=0";
 
@@ -533,20 +451,25 @@ void sit_list::init_site(const std::string &ids /*=""*/)
          site_ptr->m_map_id = map_id;
          site_ptr->m_area_id = area_id;
          site_ptr->m_power_check_enable=power_alarm;
-
          site_ptr->m_device_type_id = device_type_id;
-
-         site_ptr->m_dimension = dimension;
+         site_ptr->m_num_dims = dimension;
          site_ptr->m_scale = scale;
          site_ptr->create_area();
 
-
          double x=0,y=0;
          DBRes.GetField( "x",x, Error );
          DBRes.GetField( "y",y, Error );
 
-		 log_info ("site_position:site=%d,x=%.2lf,y=%.2lf,%d",reader_id,x,y,area_id);
+         double offset = 0.0;
+         DBRes.GetField("pdoa_offset", offset, Error);
+         site_ptr->m_pdoa_offset = offset;
+
+         int direction = 0;
+         if(DBRes.GetField("pdoa_direction", direction, Error)){
+            site_ptr->m_pdoa_direction = direction;
+         }
 
+		 log_info ("site_position: site=%d, x=%.2lf, y=%.2lf, area_id=%d, m_scale=%.2f, pdoa_offset=%.2f, pdoa_direction=%d", reader_id, x, y, area_id, scale, offset, direction);
      }
 }
 
@@ -604,7 +527,10 @@ void sit_list::read_sit_list(int id)
         double z= 0;
         DBRes.GetField( "z",z, Error );
 
-		log_info("ant-position:reader=%d,antid=%d,x=%.2lf,y=%.2lf",reader_id,antid,x,y);
+        double _angle = 0;
+        DBRes.GetField("angle", _angle, Error);
+
+        log_info("ant-position:reader=%d, antid=%d, x=%.2lf, y=%.2lf, angle=%.2f", reader_id, antid, x, y, _angle);
 
         if(-1 == id)
         {
@@ -614,6 +540,7 @@ void sit_list::read_sit_list(int id)
               continue;
             site_ptr->m_ant[antid].m_id = antenna_id;
             site_ptr->m_ant[antid].set(x,-y);
+            site_ptr->m_ant[antid].m_angle = _angle;
             site_ptr->set_ex();
         }
         else
@@ -622,6 +549,7 @@ void sit_list::read_sit_list(int id)
             if(site_ptr)
             {
                 site_ptr->m_ant[antid].set(x,-y);
+                site_ptr->m_ant[antid].m_angle = _angle;
                 site_ptr->set_ex();
             }
             log_info("基础数据 增加或修改天线成功:天线id:%d,分站id:%d",id,reader_id);

+ 19 - 10
ant.h

@@ -68,6 +68,7 @@ struct ant :point
 {
     std::array<path,2> m_path;
     int m_id;
+    double m_angle = 0;
 
     path & operator[](int i)
     {
@@ -92,8 +93,8 @@ struct ant :point
 struct site:point,std::enable_shared_from_this<site>
 {
     static algo_config g_config[];
-    int      m_algo;			//TOF:0,TDOA:1
-    int      m_num_dims;	    //1维:0,2维:1,3维:2
+    int      m_algo;			// TOF:0, TDOA:1, PDOA:2
+    int      m_num_dims;	    // 1维:0, 2维:1, 3维:2
     double  m_scale = 2.0;  // 地图比例尺
     point    m_position;
     mutable double m_height=1.5;
@@ -107,16 +108,13 @@ struct site:point,std::enable_shared_from_this<site>
     int m_area_id = 0;
     /// 设备类型,分站、通信分站、交通灯等
     int m_device_type_id=0;
-    /// 指定分站定位类型:一维定位,二维定位,三维定位
-    int m_dimension=0;
-
+    
     //pdoa
+    double m_pdoa = 100.0;          // pdoa分站当前上传相位差
+    double m_last_pdoa = 100.0;      // pdoa分站上一帧上传相位差
     double m_pdoa_offset = 0.0;     // pdoa分站天线相位偏移量
     int m_pdoa_direction = 0;       // pdoa分站天线1朝向
-    float m_pdoa = 100.0;           // pdoa分站当前上传相位差
-    float m_last_pdoa = 100.0;      // pdoa分站上一帧数据的相位差
-    boost::circular_buffer<float> m_cb_pdoa;    // pdoa分站历史相位差队列
-
+    float m_pdoa_diff = 0.0;        
     std::shared_ptr<client> m_clt=nullptr;
     std::shared_ptr<area> m_area=nullptr;
 
@@ -276,6 +274,13 @@ struct site:point,std::enable_shared_from_this<site>
         return std::move(a.getsol(dist));
     }
 
+    std::vector<point> solving_pdoa(const int& ant_id, double dist)const
+    {
+        const ant& a = m_ant[ant_id];
+        logn_info(3, "[pdoa] solving_pdoa, dist=%.4f, a.x=%.4f, a.y=%.4f", dist, a.x, a.y);
+        return std::move(a.getsol(dist));
+    }
+
     ant&operator[](int i)
     {
         return m_ant[i];
@@ -315,7 +320,11 @@ struct site:point,std::enable_shared_from_this<site>
 
 */
 
-	void on_power_status(bool ac_down);//电源状态
+	void on_power_status(bool ac_down);     //电源状态
+    void set_algo(int _algo)
+    {
+        m_algo = _algo;
+    }
 };
 
 struct visit_site_status:visitor<std::shared_ptr<site>>

+ 27 - 6
card_base.cpp

@@ -102,20 +102,39 @@ void card_location_base::make_his_location(uint64_t t,const point & pt,bool bclo
     log_info("make_his_location: card_id: %d,map_id: %d,area_id: %d,site_id: %d",m_id,map_id,area_id,site_id);
 	m_his_location_card->push(t,pt,area_id,map_id,site_id,bclose);
 }
+
 //坐标点输入业务入口
 void card_location_base::on_location(const std::vector<point>&vp,const std::vector<loc_message> &lm )
 {
-	loc_point pt = m_sel_tool->select_solution(vp,lm);
-	pt.y=-pt.y;
-	auto site_ptr=get_area_tool()->m_site;
-	int sid=0;
-	if(site_ptr)sid=site_ptr->m_id;
+    auto it = lm.cbegin();
+
+    loc_point pt;
+    if(it != lm.cend()){
+        switch((*it).m_loc_type){
+            case LDT_TOF:
+    	        pt = m_sel_tool->select_solution(vp,lm);
+	            pt.y = -pt.y;
+                break;
+            case LDT_TDOA:
+                break;
+            case LDT_PDOA:
+                pt.x = vp[0].x;
+                pt.y = vp[0].y;
+                pt.m_useless = true;
+                log_info("[pdoa] position's size = %d, x=%.2f, y=%.2f", vp.size(), pt.x, pt.y);
+                break;
+        }
+    }
+
+	auto site_ptr = get_area_tool()->m_site;
+	int sid = 0;
+	if(site_ptr)
+        sid = site_ptr->m_id;
 	if(pt.m_useless)
 	{
 		x = tool_other::round(pt.x,3);
 		y = tool_other::round(pt.y,3);
 
-
 		double acc = lm[0].m_acc;
         m_acc = lm[0].m_acc;
 		log_info("useful:type=%d,card=%d,site=%d,ct=%d,timestamp=%llu, loc_point,x=%f,y=%f acc=%.2f",m_type,m_id,sid,m_ct,m_time,x,y,acc);
@@ -193,6 +212,7 @@ void card_location_base::on_message(zloop<task*>* loop, message_pdoa_locinfo& lo
 
     m_message_handle->on_message(loop, loc, is_history);
 }
+
 //前端推送位置函数.
 void card_location_base::upt_card_pos(YA::_CARD_POS_&cp, point &pt)
 {
@@ -223,6 +243,7 @@ void card_location_base::upt_card_pos(YA::_CARD_POS_&cp, point &pt)
 	
 	swsTimerThrd.upt_card_pos(cp);
 }
+
 void card_location_base::del_card_pos()
 {
 	YA::_CARD_POS_ cp;

+ 14 - 3
card_base.h

@@ -6,6 +6,7 @@
 #include <atomic>
 #include "point.h"
 #include "common.h"
+#include <boost/circular_buffer.hpp>
 
 #define CARD_LOST_TIME_OUT (60*1000)
 
@@ -28,7 +29,9 @@ struct area_tool;
 struct message_tdoa_locinfo;
 struct message_pdoa_locinfo;
 
-namespace YA{struct _CARD_POS_;}
+namespace YA{
+    struct _CARD_POS_;
+}
 
 struct card:point
 {
@@ -81,15 +84,23 @@ struct card_location_base:card,std::enable_shared_from_this<card_location_base>
     std::unique_ptr<smooth_tool> m_smo_tool;
 	std::unique_ptr<card_message_handle> m_message_handle;
 	std::unique_ptr<location_card> m_his_location_card;
-
 	std::atomic<int> m_upmine_flag{0};
 
 	time_t m_help_last_time=0;
 	int    m_help_bit=0;
 
+    //pdoa
+    int16_t m_last_ct = -1;
+    int m_buff_size = 0;
+    float m_pdoa_diff = 100.0;                  // pdoa分站当前上传相位差
+    float m_last_pdoa_diff = 100.0;             // pdoa 分站上一帧数据的相位差
+    boost::circular_buffer<float> m_cb_pdoa;    // the list of current pdoa's different of phase;
+    boost::circular_buffer<float> m_cb_tof;     // the list of tof that is pdoa history value
+    boost::circular_buffer<point> m_cb_point;
+
     card_location_base()=default;
     card_location_base(const std::string&type,uint32_t id,uint16_t dis,int16_t t,int32_t,int32_t,uint32_t );
-
+ 
 	void inc_upmine_flag(int flag){m_upmine_flag=flag;}
     int upmine_flag(){return m_upmine_flag.load();}
 

+ 6 - 1
card_person.cpp

@@ -114,6 +114,7 @@ std::shared_ptr<mine_tool> person::get_mine_tool()
 }
 void person::do_business(const std::shared_ptr<site>&site,const point &pt,double acc)
 {
+    m_mine_tool->m_is_attendance = true;
     //区域相关逻辑驱动
 	m_area_tool->on_point(shared_from_this(),pt);
     //处理历史轨迹
@@ -145,6 +146,7 @@ void person::handle_three_rates(const point & pt)
 	cp.work_type_id=m_worktype_id;
 	put_three_rates(cp);
 }
+
 //定时推送到web函数,
 void person::on_timer()
 {
@@ -155,7 +157,8 @@ void person::on_timer()
 			log_warn("up_mine:att=false,upmine_flag=%d",m_upmine_flag.load());
 			m_upmine_flag=0;
 		}
-
+        
+        log_info("[person] person is not attendance");
 		return;
 	}
 
@@ -170,6 +173,7 @@ void person::on_timer()
 	cp.down_time = m_mine_tool->get_down_time();
 	cp.work_time = m_mine_tool->get_work_time();
 	cp.is_on_duty= m_mine_tool->is_on_duty();
+    cp.m_freq = m_freq;
 	upt_card_pos(cp,pt);
 	log_info("on_timer here ...%d,%lld,%.2f,%.2f,%d,%d--%d,speed=%.2f",m_id,_time,pt.x,pt.y,cp.map_id,cp.area_info.size(),person::m_limit_detained_time,m_speed);
     //int sid=0; if(auto st=m_area_tool->m_site)sid=st->m_area_id; m_his_location_card->push(_time,pt,sid,cp.map_id);
@@ -190,6 +194,7 @@ void person::on_timer()
 		m_upmine_flag=0;
 	}
 }
+
 //***********************************************
 //整点打印入井超过设定时长(默认10h)
 //进入盲区超过2h的卡

+ 0 - 1
card_person.h

@@ -25,7 +25,6 @@ struct person:card_location_base, card_area
     person(const std::string &type,uint32_t cardid,uint16_t needdisplay,int16_t t,int32_t deptid,int32_t level_id,uint32_t cid,int wl,const std::string &sname,const std::string &dname,int workrype_id);
     ~person();
 
-
     void clear();
     void reset(std::shared_ptr<monkey_person> mp);
     void handle_three_rates(const point & pt);

+ 11 - 10
db/db_card.cpp

@@ -1,21 +1,20 @@
-
 #include <memory>
 #include <unordered_map>
 #include "log.h"
 #include "config_file.h"
 #include "db_api/CDBResultSet.h"
 #include "db_api/CDBSingletonDefine.h"
-
 #include "../card_base.h"
 #include "../card_person.h"
 #include "../common.h"
 #include "../common_tool.h"
+
 extern config_file config;
 namespace db_card
 {
 	std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> load_car(const std::string & lszId64)
 	{
-		std::string sql = "SELECT ve.vehicle_id, ve.card_id, c.card_type_id, c.freq_id \
+		std::string sql = "SELECT ve.vehicle_id, ve.card_id, c.card_type_id, cf.freq_value, \
 						   ve.dept_id, ve.group_id, v.vehicle_type_id, vt.vehicle_level_id, \
 						   vt.is_railroad AS vt_is_railroad,ve.need_display ,ve.power_alarm,\
 						   vt.vehicle_category_id,v.bigger_car_flag,vc.over_speed \
@@ -26,6 +25,7 @@ namespace db_card
 						   LEFT JOIN dat_group g ON ve.group_id = g.group_id \
 						   LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
 						   LEFT JOIN dat_vehicle_category vc ON vc.vehicle_category_id = vt.vehicle_category_id \
+                           LEFT JOIN dat_card_freq cf on cf.freq_id = c.freq_id \
 						   WHERE c.state_id = 0";
 
 		std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> map;
@@ -64,8 +64,8 @@ namespace db_card
 			unsigned int card_type_id  = 0;
 			DBRes.GetField( "card_type_id",card_type_id, Error );
 
-            int freq_id = 0;
-            DBRes.GetField("freq_id", freq_id, Error);
+            double freq = 0;
+            DBRes.GetField("freq_value", freq, Error);
 
 			int dept_id = 0;
 			DBRes.GetField( "dept_id",dept_id, Error );
@@ -110,7 +110,7 @@ namespace db_card
 			auto clb = card_location_base::make_car(strategy,vsid,need_display,card_type_id,
 					dept_id,vehicle_category_id, vehicle_type_id,vehicle_level_id,vehicle_id);
 			uint64_t cardid = tool_other::type_id_to_u64(card_type_id,vsid);
-			clb->set_freq_id(freq_id);
+            clb->m_freq = freq;
 
             log_info("cardId:%llu,id:%d dept_id:%d,need_display:%d-cardid:%s,categoryid:%d,vchile_id:%d,type:%d,vehicle_type_id:%d",
 					cardid,vsid,dept_id,need_display,card_id.c_str(),vehicle_category_id,vehicle_id,card_type_id,vehicle_type_id);
@@ -122,7 +122,7 @@ namespace db_card
 
 	std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> load_person(const std::string & lszId64,const std::string&strategy)
 	{
-		std::string sql = "SELECT s.staff_id, s.card_id, c.card_type_id, c.freq_id, s.dept_id, s.group_id, s.occupation_id, \
+		std::string sql = "SELECT s.staff_id, s.card_id, c.card_type_id, cf.freq_value, s.dept_id, s.group_id, s.occupation_id, \
 						   ol.occupation_level_id,s.worktype_id,s.need_display,s.work_line\
 							,ds.name as staffer_name,dd.name as dept_name\
 						   FROM dat_staff_extend s \
@@ -131,6 +131,7 @@ namespace db_card
 						   LEFT JOIN dat_card c ON s.card_id = c.card_id \
 						   LEFT JOIN dat_occupation o ON s.occupation_id = o.occupation_id \
 						   LEFT JOIN dat_occupation_level ol ON ol.occupation_level_id = o.occupation_level_id \
+                           LEFT JOIN dat_card_freq cf on cf.freq_id = c.freq_id \
 						   WHERE s.duty_id = 0 AND c.state_id = 0";
 
 		std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> map;
@@ -168,8 +169,8 @@ namespace db_card
 			unsigned int card_type_id  = 0;
 			DBRes.GetField( "card_type_id",card_type_id, Error );
 
-            int freq_id = 0;
-            DBRes.GetField("freq_id", freq_id, Error);
+            double freq = 0;
+            DBRes.GetField("freq_value", freq, Error);
 
 			int dept_id = 0;
 			DBRes.GetField( "dept_id",dept_id, Error );
@@ -208,7 +209,7 @@ namespace db_card
             std::shared_ptr<card_location_base> clb =
                     std::make_shared<person>(strategy,vsid,need_display,card_type_id,dept_id,occupation_level_id,staff_id,work_line,staffer_name,dept_name,worktype_id);
             uint64_t cardid = tool_other::type_id_to_u64(card_type_id,vsid);
-            clb->set_freq_id(freq_id);
+            clb->m_freq = freq;
 
 			log_info("Init_card.cardId:%llu,id:%d dept_id:%d,need_display:%d,card:%s:work_line:%d,staff_id:%d,type:%d,staffer_name:%s,dept_name:%s",
 					cardid, vsid, dept_id, need_display, card_id.c_str(), work_line, staff_id, card_type_id,staffer_name.c_str(), dept_name.c_str());

+ 0 - 10
geo_hash.cpp

@@ -16,9 +16,6 @@ void geo_list::find_near(std::vector<uint64_t>&ret,int x,int y,unsigned h,uint32
 			continue;
 		if (card_no==it->second)
 			continue;
-		//std::stringstream ss;
-		//ss<<"-----LemonHash---findnear---cardid"<<card_no<<"x:"<<x<<"y:"<<y<<"dist2:"<<dist2<<" cardid:"<<it->second<<"x:"<<xi<<"y:"<<yi<<"sn"<<sn;
-		//debug_print_syslog(0,"%s",ss.str().c_str());
 		ret.push_back(it->second);
 	}
 }
@@ -47,7 +44,6 @@ std::vector<uint64_t> geo_list::find_near(int x,int y,int dist,uint64_t card_no)
 	return std::move(r);
 }
 
-//std::vector<std::string> find_near(const char*card_no,int dist)
 std::vector<uint64_t> geo_list::find_near(uint64_t card_no,int dist)
 {
 	std::vector<uint64_t> r;
@@ -61,13 +57,9 @@ std::vector<uint64_t> geo_list::find_near(uint64_t card_no,int dist)
 	return find_near(std::get<0>(h),std::get<1>(h),dist,card_no);
 }
 
-//void update(int x,int y,const char*card_no)
 void geo_list::update(int x,int y,uint64_t card_no)
 {
-	//std::stringstream ss;
 	unsigned h=ghash::encode(x,y);
-	//ss<<"-----LemonHash--update--"<<card_no<<"x:"<<x<<"y:"<<y<<"h:"<<h;
-	//debug_print_syslog(0,"%s",ss.str().c_str());
 
 	auto it=card2geo.find(card_no);
 	if(it==card2geo.end())
@@ -89,8 +81,6 @@ void geo_list::update(int x,int y,uint64_t card_no)
 
 		}
 
-
-
 		geo2card.insert(std::make_pair(h,card_no));
 	}
 }

+ 1 - 0
loc_message.h

@@ -25,6 +25,7 @@ struct loc_message
 
     // pdoa内容
     double m_poa[3];        // 三天线的相位值
+    double m_angle;         // 天线角度
 
 	loc_message()
 	 :m_num_ticks(0)

+ 2 - 1
main.cpp

@@ -66,7 +66,7 @@ struct Init_Setting
         std::vector<std::string> url_list;
         url_list.push_back(url);
         if(!url_2.empty())url_list.push_back(url_2);
-        if(!wsClientMgr_init(url_list,send_interval))
+        if(!wsClientMgr_init(url_list, send_interval))
         {
             std_info("连接webServer[%s] 失败,采集服务器无法启动!",url.c_str());
             log_warn("连接webServer[%s] 失败!",url.c_str());
@@ -215,6 +215,7 @@ int main(int argc ,char * argv[])
 
     int interface_port = config.get("service.interface_port",7001);
     log_info("service-position.run(%d)",interface_port);
+    std_info("service-position.run(%d)",interface_port);
     ios_service::start_service_position(interface_port);
 
     log_info("service_handle::instance(&mh)->run(%d)",port);

+ 20 - 8
message.cpp

@@ -342,13 +342,19 @@ void message_pdoa_locinfo::load(zistream& is)
     is>>b;
 
     m_card_type = b&0x0F;
-    m_batty_status = (b>>4)&0xFF;
-    //log_info("type: %d, battery: %d", m_card_type, m_batty_status);
+    //m_batty_status = (b>>4)&0xFF;
+
+    is>>b;
+    m_batty_status = b;
 
     //2字节卡号,2字节卡的ct号
     uint16_t id;
     is>>id>>m_card_ct;
     m_card_id = id;
+
+    if(m_card_ct % 5 == 4){
+        m_batty_status = (m_batty_status>>4)&0xFF;
+    }
     
     //角速度值:人卡车卡表示含义不同
     is>>b;
@@ -367,16 +373,22 @@ void message_pdoa_locinfo::load(zistream& is)
     }
 
     //信号电平值,tof测距结果
-    uint16_t tof;
-    uint8_t rssi;
-    is>>rssi>>tof;
+    uint8_t rssi = 0;
+    uint32_t tof = 0;
+    uint8_t high_tof = 0;
+    is>>rssi>>high_tof>>tof;
     m_rssi = rssi;
-    m_tof = tof;
+    m_tof = high_tof;
+    m_tof = (m_tof<<32) | tof;
 
     is>>m_ant_id;
     --m_ant_id;
 
-    is>>m_poa[0]>>m_poa[1]>>m_poa[2];
+    int16_t _poa = 0;
+    for(int i = 0; i < 3; ++i){
+        is>>_poa;
+        m_poa[i] = (float)((((short)_poa)*1.0)/1000.0);
+    }
 
-    logn_info(3,"[pdoa] timestamp=%llu, type=%d, card_id=%d, site=%d, ct=%d, status=%d, acc=%d, tof=%llu, ant_id=%d, spq=%d, poa1=%d, poa2=%d, poa3=%d", m_time_stamp, m_card_type, m_card_id, m_site_id, m_card_ct, m_batty_status, m_acc, m_tof, m_ant_id, m_rssi, m_poa[0], m_poa[1], m_poa[2]);
+    logn_info(3,"[pdoa] card_type=%d, card_id=%d, site=%d, ct=%d, status=%d, acc=%d, tof=%llu, ant_id=%d, rssi=%d, poa1=%.2f, poa2=%.2f, poa3=%.2f", m_card_type, m_card_id, m_site_id, m_card_ct, m_batty_status, m_acc, m_tof, m_ant_id, m_rssi, m_poa[0], m_poa[1], m_poa[2]);
 }

+ 2 - 2
message.h

@@ -107,7 +107,7 @@ struct message_locinfo:task
 {
 	uint64_t m_time_stamp;  // 分站时间戳
 	time_t   m_site_time;   // 分站时间
-	uint64_t m_tof;
+	uint64_t m_tof;         // 卡tof值
 	uint32_t m_site_id;     // 分站号
 
 	uint32_t m_card_type;   // 卡类型
@@ -160,7 +160,7 @@ struct message_tdoasync:task
 struct message_pdoa_locinfo: public message_locinfo{
     uint8_t m_loc_type;
     uint8_t m_loc_dimension;
-    int16_t m_poa[3];
+    float m_poa[3];
     
     void zero_this();
     void load(zistream& is);

+ 65 - 10
net-service.cpp

@@ -111,6 +111,7 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
                     }
 
 					check_message_time(clt,site_ptr,&site_tm,site_ct,power);
+                    site_ptr->m_algo = LDT_TOF;
 
                     if(clt->type()!=2){
 					    site_ptr->set_client(clt);
@@ -200,12 +201,12 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
 				break;
             case CHAR_LOCATEDATA_PDOA:
                 {
-                    int32_t site_id = parse_data_anchor(clt, is);
+                    int32_t site_id = parse_data_anchor_opt(clt, is);
                     if(site_id < 0){
                         return;
                     }
-                    const auto &site_ptr = sit_list::instance()->get(static_cast<int32_t>(site_id));
-
+                    const auto& site_ptr = sit_list::instance()->get(static_cast<int32_t>(site_id));
+                    site_ptr->set_algo(LDT_PDOA);
                     struct timeval tv;
                     gettimeofday(&tv, NULL);
                     uint64_t t = tv.tv_sec*1000 + tv.tv_usec/1000;
@@ -216,12 +217,13 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
                         task* t = task::alloc<message_pdoa_locinfo>();
                         message_pdoa_locinfo& m = t->body<message_pdoa_locinfo>();
                         m.load(is);
-                        m.m_loc_type = LDT_PDOA;
-                        //m.m_site_id = site_id;
+                        m.m_site_id = site_ptr->m_id;
                         m.m_time_stamp = tstamp;
+                        m.m_loc_type = LDT_PDOA;
                         t->m_cmd_code = cmd;
                         t->m_hash_id = m.m_card_id;
                         site_ptr->m_pdoa = get_pdoa(m.m_poa, site_ptr->m_pdoa_offset);
+                        m_loc_worker->request(t);
                     }
                 }
                 break;
@@ -267,6 +269,8 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
 					if(site_id < 0){
                         return;
                     }
+                    const auto& site_ptr = sit_list::instance()->get(static_cast<int32_t>(site_id));
+                    site_ptr->set_algo(LDT_TDOA);
 
 					while(!is.eof())
 					{
@@ -362,19 +366,70 @@ int32_t net_service::parse_data_anchor(const std::shared_ptr<client>& clt, zistr
     return site_id;
 }
 
+// 分站优化协议
+int32_t net_service::parse_data_anchor_opt(const std::shared_ptr<client>& clt, zistream& s)
+{
+    // 分站号,2字节
+    uint16_t site_id = 0;
+    // 分站时间戳,2字节
+    uint16_t site_ct = 0;
+    // 分站时间,4字节
+    uint32_t site_time_stamp = 0;
+    // 大小分站所属关系,1字节
+    uint8_t reverse = 0;
+    // 状态字节,1字节,包括3部分:供电状态,设备类型,保留
+    uint8_t power = 0;
+    struct tm site_tm={0}; 
+
+    s>>site_id>>site_ct>>site_time_stamp>>reverse>>power;
+
+    time_t _sts = site_time_stamp;
+    localtime_r(&_sts, &site_tm);
+
+    const auto &site_ptr = sit_list::instance()->get(static_cast<int32_t>(site_id));
+
+    if(!site_ptr)
+    {
+        logn_error(1,"未定义分站:net=%s, site=%d", clt->name().c_str(), site_id);
+        return -1;
+    }
+
+    // pdoa分站不检查天线是否相等
+    /*if(site_ptr->is_abnormal_site())
+    {
+        logn_error(1,"分站[%d]天线异常", site_id);
+        return -1;
+    }*/
+
+    //check_message_time(clt, site_ptr, &site_tm, site_ct, power);
+
+    site_ptr->m_device_type_id = (power>>3)&0x07;
+
+    if(clt->type()!=2){
+        site_ptr->set_client(clt);
+        site_ptr->on_power_status((power&1)==0);
+    }
+
+    logn_info(1,"分站数据:site_id: %d, site_ct: %d, time: %s, power: %d", site_id, site_ct, tool_time::to_str_ex(&site_tm).c_str(), power);
+
+    return site_id;
+}
+
+
+
 void net_service::parse_data_card()
 {
 }
 
-float net_service::get_pdoa(int16_t poa[], const double& offset)
+float net_service::get_pdoa(float poa[], const double& offset)
 {
     if(poa == nullptr){
         return -10.0;
     }
 
-    float poa1 = poa[0]*0.001;
-    float poa2 = poa[1]*0.001;
-    float poa3 = poa[2]*0.001;
+    float poa1 = poa[0];
+    float poa2 = poa[1];
+    float poa3 = poa[2];
 
     float pdoa_raw = poa2 - poa1 + PI;
     while(pdoa_raw >= TPI){
@@ -396,7 +451,7 @@ float net_service::get_pdoa(int16_t poa[], const double& offset)
         pdoa -= TPI;
     }
 
-    logn_info(3, "[pdoa] poa1=%.4f, poa2=%.4f, poa3=%.4f, poa_diff=%.4f", poa1, poa2, poa3, pdoa);
+    //logn_info(3, "[pdoa] poa1=%.4f, poa2=%.4f, poa3=%.4f, poa_diff=%.4f", poa1, poa2, poa3, pdoa);
 
     return pdoa;
 }

+ 2 - 1
net-service.h

@@ -21,8 +21,9 @@ struct net_service:service_callback
     void on_connect(const std::shared_ptr<client> &clt);
 
     int32_t parse_data_anchor(const std::shared_ptr<client>& clt, zistream& s);
+    int32_t parse_data_anchor_opt(const std::shared_ptr<client>& clt, zistream& s);
     void parse_data_card();
-    float get_pdoa(int16_t poa[], const double& offset);
+    float get_pdoa(float poa[], const double& offset);
 
 };
 

+ 4 - 1
service_position.cpp

@@ -21,6 +21,7 @@ void service_position::init_cache(info_send_ptr& p_info)
 void service_position::notify(const std::string& msg, const std::string& id, const double& feq)
 {
     if(m_stop){
+        log_info("[service-position] thread's running tag is true, m_stop=true");
         return;
     }
 
@@ -30,6 +31,8 @@ void service_position::notify(const std::string& msg, const std::string& id, con
         return;
     }
 
+    log_info("[service-position] card_id=%s, freq=%.2f, json_pos: %s", id.c_str(), feq, msg.c_str());
+
     service_ptr _service = m_service;
     if(_service){
         boost::shared_ptr<std::string> p_buffer(new std::string(msg));
@@ -229,7 +232,7 @@ void service_position::handle_notify(buffer_ptr p_buffer)
         return;
     }
 
-    log_info("[service-position] send msg: %s", p_buffer->c_str());
+    //log_info("[service-position] send msg: %s", p_buffer->c_str());
     for(auto iter = m_sockets.begin(); iter != m_sockets.end(); ++iter){
         (*iter)->async_write_some(boost::asio::buffer(p_buffer->c_str(), p_buffer->size()), boost::bind(&service_position::handle_write, shared_from_this(), _1, _2, *iter, p_buffer));
     }

+ 2 - 1
tdoa_sync.cpp

@@ -38,7 +38,6 @@ struct tdoa_sync_impl:tdoa_sync
         // 线性插值类型
         int ip_type = config.get("service.interpolation", 0);
 
-        log_info("[tdoa] interpolation type: %d", ip_type);
         switch(ip_type){
             case 0:
                 ip_value = ssync_manager.cal_time_by_linear(_tag_msg);
@@ -55,6 +54,8 @@ struct tdoa_sync_impl:tdoa_sync
         }
 	    
         tdoa_msg.m_interpolation = ip_value;
+
+        log_info("[tdoa] interpolation_info: card_id=%d, ct=%d, sync_num=%d, type=%d, value=%lld", tdoa_msg.m_card_msg.m_id, tdoa_msg.m_card_msg.m_time_stamp, tdoa_msg.m_card_msg.m_sync_num, ip_type, ip_value);
 	}
 };
 

+ 28 - 10
websocket/jsonBuilder.cpp

@@ -506,23 +506,41 @@ namespace YA
 		return sb.GetString();
 	}
 
-    std::string jsonBuilder::build_ios_card_pos(const _BASE_CARD_& stCard)
+    std::string jsonBuilder::build_ios_card_pos(const _CARD_POS_& card)
     {
         rapidjson::StringBuffer sb;
         rapidjson::Writer<rapidjson::StringBuffer> writer(sb); 
         rapidjson::Document doc;
-	rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();
+	    rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();
 
-	rapidjson::Value root( rapidjson::kObjectType );
+	    rapidjson::Value root( rapidjson::kObjectType );
 
         // "cmd":
-	__SetCmd( JSON_CMD_VALUE_POS_MAP, root, allocator );
- 	// "version"
+	    __SetCmd( JSON_CMD_VALUE_POS_MAP, root, allocator );
+ 	    // "version"
         __AddVersion(root, allocator);
 
-       
-        // "data"
-        rapidjson::Value data(rapidjson::kObjectType);
+        // "item"
+        rapidjson::Value item(rapidjson::kObjectType);
+        rapidjson::Value value;
+        value.SetString(std::to_string(card.ID).c_str(), allocator);
+        item.AddMember("cardid", value, allocator);
+        item.AddMember("x", card.x, allocator);
+        item.AddMember("y", card.y, allocator);
+        item.AddMember("z", card.z, allocator);
+        item.AddMember("acc", card.m_acc, allocator);
+        item.AddMember("speed", card.speed, allocator);
+        item.AddMember("acc_x", card.m_tri_acc[0], allocator);
+        item.AddMember("acc_y", card.m_tri_acc[1], allocator);
+        item.AddMember("acc_z", card.m_tri_acc[2], allocator);
+        item.AddMember("ang_x", card.m_tri_ang[0], allocator);
+        item.AddMember("ang_y", card.m_tri_ang[1], allocator);
+        item.AddMember("ang_z", card.m_tri_ang[2], allocator);
+        item.AddMember("steps", card.m_walking_step, allocator);
+        item.AddMember("jump", card.m_jump_count, allocator);
+        item.AddMember("hang_time", card.m_hang_time, allocator);
+        item.AddMember("hang_height", card.m_hang_height, allocator);
+        /*rapidjson::Value data(rapidjson::kObjectType);
         data.AddMember("card_type", 1 , allocator);
         data.AddMember("cardid", "10", allocator);
         data.AddMember("x", 10.0 , allocator);
@@ -540,8 +558,8 @@ namespace YA
         data.AddMember("jump", 8 , allocator);
         data.AddMember("hang_time", 3 , allocator);
         data.AddMember("hang_height", 4, allocator);
-
-        root.AddMember("data", data, allocator);
+        */
+        root.AddMember("data", item, allocator);
 
         root.Accept(writer);  
 

+ 1 - 1
websocket/jsonBuilder.h

@@ -245,7 +245,7 @@ namespace YA
 
 		*/
 		std::string BuildCardPos( const std::map<uint64_t, _CARD_POS_>& CardPosList );
-        std::string build_ios_card_pos(const _BASE_CARD_& stCard);
+        std::string build_ios_card_pos(const _CARD_POS_& card);
 		/**
 		* @brief
 		生成车辆进入特殊区域jason函数。

+ 3 - 1
websocket/web_connect.cpp

@@ -42,6 +42,8 @@ void web_connect::close()
 
 bool web_connect::connect()
 {
+    swsTimerThrd.Start();
+
     //连接服务器
     if ( swsClientMgr.connect() != 0 )
     {
@@ -52,7 +54,7 @@ bool web_connect::connect()
     //登录
     swsClientMgr.login();
 
-    swsTimerThrd.Start();
+    //swsTimerThrd.Start();
 
     return true;
 }

+ 28 - 5
websocket/wsTimerThread.cpp

@@ -1,6 +1,5 @@
 #include "wsTimerThread.h"
 #include <iostream>
-
 #include "wsClientMgr.h"
 #include "constdef.h"
 #include "log.h"
@@ -70,13 +69,36 @@ namespace YA
 		    return;
 		__CardPosList.copy( CardPosList );
 		std::string jsCardPos = __jsBuilder.BuildCardPos( CardPosList );
-//		log_info("[pos_map]%s",jsCardPos.c_str());
 		swsClientMgr.send( JSON_CMD_VALUE_PUSH, jsCardPos );
 	}
 
+    void wsTimerThread::send_card_pos()
+    {
+        if(__CardPosList.empty()){
+            //std::cout<<"send_card_pos: card's list is empty.";
+            return;
+        } 
+
+        std::map<uint64_t, _CARD_POS_> cards;
+        __CardPosList.copy(cards);
+        //log_info("[service-position] size=%d", cards.size());
+        //service_position send
+        for(auto it = cards.begin(); it != cards.end(); ++it)
+        {
+            std::string json_pos = __jsBuilder.build_ios_card_pos(it->second);
+            //log_info("[service-position] json_pos: card_id=%d, freq=%.2f, json=%s", it->second.ID, it->second.m_freq, json_pos.c_str());
+            ios_service::m_ios_service->notify(json_pos, std::to_string(it->second.ID), it->second.m_freq);
+        }
+    }
+
+    /*
+     * 定时器线程发送定位数据
+     *
+     * */
 	void wsTimerThread::_ThreadFunc( wsTimerThread * pOwner )
 	{	
-		while ( pOwner->__Enable )
+        log_info("The timer thread is running");
+        while ( pOwner->__Enable )
 		{
 			std::time_t t = time( 0 );
 			int seconds = (int)std::difftime( t, __LastSendTime );
@@ -84,10 +106,11 @@ namespace YA
 			if ( seconds >= pOwner->__Config.SendInterval )
 			{
 				pOwner->__SendCardPos();
+                //service_position send
+                pOwner->send_card_pos();
 				__LastSendTime = t;
 			}
-
-			boost::this_thread::sleep( boost::posix_time::millisec( 1 ) );
+          	boost::this_thread::sleep( boost::posix_time::millisec( 1 ) );
 		}
 
 		pOwner->__ExitCond.notify_one();

+ 1 - 0
websocket/wsTimerThread.h

@@ -98,6 +98,7 @@ namespace YA
 
 		*/
 		void __SendCardPos();
+        void send_card_pos();
 	protected:
 		/**
 		* @brief

+ 19 - 1
websocket/ws_common.h

@@ -44,11 +44,27 @@ namespace YA
 		}
 	};
 
+    // 传感器,加速度,角速度
+    struct sensor{
+        double m_acc;           // 加速度
+        double m_ang;           // 角速度
+        double m_tri_acc[3];    // 三轴,0-x,1-y,2-z轴
+        double m_tri_ang[3];    // 三轴,
+        uint8_t m_walking_step; // 行进步数
+        uint8_t m_jump_count;   // 跳跃次数
+        double m_hang_time;     // 滞空时间
+        double m_hang_height;   // 滞空高度
+
+        sensor(): m_acc(0.0), m_ang(0.0),m_walking_step(0), m_jump_count(0),m_hang_time(0), m_hang_height(0)
+        {
+            m_tri_acc[0] = m_tri_acc[1] = m_tri_acc[2] = m_tri_ang[0] = m_tri_ang[1] = m_tri_ang[2] = 0.0;
+        }
+    };
 	/**
 	* @brief
 	基础卡信息结构体。
 	*/
-	struct _BASE_CARD_
+	struct _BASE_CARD_: public sensor
 	{
 		int Type;               //卡类型
 		int ID;                 //卡ID
@@ -66,6 +82,7 @@ namespace YA
 		int running_stat;       //运行状态: 包括上猴车状态
 		int biz_stat;           //业务状态
 		double speed;           //速度
+        double m_freq;          // 卡频率
 		_BASE_CARD_()
 		{
 			Type            = 0;
@@ -84,6 +101,7 @@ namespace YA
 			running_stat    = 0;
 			biz_stat        = 0;
 			speed           = 0.0;
+            m_freq          = 0.0;
 		}
 	};