Selaa lähdekoodia

一人多卡显示bug 人车历史输入挪动 解决20小时升井bug 优化历史轨迹点

lixioayao 5 vuotta sitten
vanhempi
commit
a0a7872c0c
8 muutettua tiedostoa jossa 70 lisäystä ja 127 poistoa
  1. 15 0
      a.cpp
  2. 1 1
      bindmorecard.cpp
  3. 6 6
      card_base.cpp
  4. 1 0
      card_base.h
  5. 1 1
      card_car.cpp
  6. 7 3
      card_person.cpp
  7. 2 3
      event.cpp
  8. 37 113
      his_location.h

+ 15 - 0
a.cpp

@@ -0,0 +1,15 @@
+#include <complex>
+#include "point.h"
+
+	double make_arg(const point &pt,const point &p)
+	{
+		return  std::arg(std::complex<double>(pt.x,pt.y)-std::complex<double>(p.x,p.y));
+	}
+
+int main()
+{
+    printf("00 --- 10 %f\n",make_arg(point(1,0),point(0,0)));
+    printf("00 --- 01 %f\n",make_arg(point(0,1),point(0,0)));
+    printf("00 --- -10 %f\n",make_arg(point(-1,0),point(0,0)));
+    printf("00 --- 0-1 %f\n",make_arg(point(0,-1),point(0,0)));
+}

+ 1 - 1
bindmorecard.cpp

@@ -46,7 +46,7 @@ void CardFactory::handle_event(std::map<uint64_t,std::string> m)
         //limit_value === start_time;
         //cur_value  ===  end_time;
         write_data(vs,card1,card2);
-        create_event(uc,std::stof(vs[1]),std::stof(vs[2]),sc);
+        create_event(uc,std::stof(vs[1])*1000,std::stof(vs[2])*1000,sc);
     }
 }
 

+ 6 - 6
card_base.cpp

@@ -76,6 +76,12 @@ void card_location_base::do_status(int st)
 
     module_mgr::do_status((STATUS_CARD)st, m_id, m_type);
 }
+void card_location_base::make_his_location(uint64_t t,const point & pt)
+{
+     int sid=0,mapid=0;
+	if(auto site_ptr=get_area_tool()->m_site){sid=site_ptr->m_area_id;mapid=site_ptr->m_map_id;}
+    m_his_location_card->push(t,pt,sid,mapid);
+}
 
 void card_location_base::on_location(const std::vector<point>&vp,const std::vector<loc_message> &lm )
 {
@@ -94,12 +100,6 @@ void card_location_base::on_location(const std::vector<point>&vp,const std::vect
 		double acc = lm[0].m_acc;
         m_acc = lm[0].m_acc;
 		log_info("useful:type:%d,card_id:%d,ct:%d,timestamp:%llu, loc_point,x:%f,y:%f acc:%.2f",m_type,m_id,m_ct,m_time,x,y,acc);
-
-        int sid=0,mapid=0;
-        if(site_ptr){sid=site_ptr->m_area_id;mapid=site_ptr->m_map_id;}
-        //if(auto st=m_area_tool->m_site)sid=st->m_area_id;
-	    m_his_location_card->push(m_time,pt,sid,mapid);
-
 		do_business(lm.front().m_sit, pt, acc);
 	}
 	else

+ 1 - 0
card_base.h

@@ -98,6 +98,7 @@ struct card_location_base:card,std::enable_shared_from_this<card_location_base>
 	virtual void get_card(bool f)=0;
 	virtual void site_hover(int sid){}
 
+    void make_his_location(uint64_t t,const point & pt);
     void on_message(zloop<task*> * loop,const message_locinfo&loc,bool is_history);
     void on_location(const std::vector<point>&vp,const std::vector<loc_message> &lm );
     void do_status(int st);

+ 1 - 1
card_car.cpp

@@ -96,7 +96,7 @@ void car::make_package()
     //log_info("%s,down_time:%f,today:%lu,duty:%u",tool_other::type_id_to_str(m_type,m_id).c_str(),cp.down_time,tool_time::morning_of_today_ms(),on_duty);
 	upt_card_pos(cp,pt);
     //int sid=0; if(auto st=m_area_tool->m_site)sid=st->m_area_id; m_his_location_card->push(pt.m_time,pt,sid,cp.map_id);
-
+    make_his_location(pt.m_time,pt);
 	uint64_t _now=tool_time::now_to_ms();
 	uint64_t t=_now>m_timeval?_now-m_timeval:m_timeval-_now;
 	if(t>10*1000)

+ 7 - 3
card_person.cpp

@@ -19,8 +19,8 @@
 #include "cardMgr.h"
 
 extern config_file config;
-int person::m_limit_detained_time=config.get("service.detained_time",10);
-int person::m_auto_up_mine_time=config.get("service.auto_up_mine_time",20);
+int person::m_limit_detained_time=-1;
+int person::m_auto_up_mine_time=-1;
 person::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 worketype_id)
 	:card_location_base(type,cardid,needdisplay,t,deptid,level_id,cid)
 	,m_workLine(wl)
@@ -28,6 +28,10 @@ person::person(const std::string &type,uint32_t cardid,uint16_t needdisplay,int1
 	,m_stafferName(sname)
 	,m_deptName(dname)
 {
+    if(person::m_auto_up_mine_time==-1){
+        person::m_limit_detained_time=config.get("service.detained_time",10);
+        person::m_auto_up_mine_time=config.get("service.auto_up_mine_time",20);
+    }
 	m_message_handle.reset(new card_message_handle(this));
 	//m_his_location_card.reset(new location_staff(m_id,m_type,cid));
 }
@@ -97,10 +101,10 @@ std::shared_ptr<mine_tool> person::get_mine_tool()
 {
 	return m_mine_tool;
 }
-
 void person::do_business(const std::shared_ptr<site>&site,const point &pt,double acc)
 {
 	m_area_tool->on_point(shared_from_this(),pt);
+    make_his_location(m_time,pt);
 	m_timeval=m_time;
 	handle_three_rates(pt);
 }

+ 2 - 3
event.cpp

@@ -115,12 +115,11 @@ void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,doub
                 ev_ptr->m_desc=desc;
                 ev_ptr->m_id=eid;
                 ev_ptr->m_dis_type=edt;
-                if(et==ET_UWB_MORE_CARD)//一人多卡特殊处理
+                if(et == ET_VEHICLE_REAR_END||et==ET_UWB_MORE_CARD)//一人多卡特殊处理
                 {
                     ev_ptr->m_obj_id=desc;
-                    ev_ptr->m_cur_time=std::chrono::system_clock::time_point(std::chrono::milliseconds((time_t)limit_value * 1000));
+                    //ev_ptr->m_cur_time=std::chrono::system_clock::time_point(std::chrono::milliseconds((time_t)limit_value * 1000));
                 }
-                if(et == ET_VEHICLE_REAR_END)ev_ptr->m_obj_id=desc;
                 //保存告警信息
                 event_list::instance()->add(eid,ev_ptr);
             }

+ 37 - 113
his_location.h

@@ -74,7 +74,7 @@ struct location_card
 		m_p.set(pt);
         init_att(pt,time);
 	}
-	bool line_changed(const point &pt,int &df)
+	bool line_changed(const point &pt)//,int &df)
 	{
 		if(!is_valid())
 		  return false;
@@ -89,23 +89,26 @@ struct location_card
         //查看路径方向是否改变
         bool change_flag=(arg-m_arg > -1e-10 && arg-m_arg<1e-10);
         //change_flag为true,标识没有发生变化
-        if(change_flag)m_direct_index=0;
+       // if(change_flag)m_direct_index=0;
 		log_info("his_location:line_changed:%d,%f,m_arg:%f,%s,%f,%f",m_cardid,arg,m_arg, change_flag?"same":"not same",m_arg-arg,dis);
-        //if(dis<0.5 && fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
-        //判断5次反向才做下一步动作
-        if(fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
-        {
-            if(++m_direct_index<=10)
-            {
-                df=1;return false;
-            }
-        }
+        if(dis<0.5 && fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
+            return false;
+        //判断10次反向才做下一步动作
+       // if(fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
+       // {
+       //     if(++m_direct_index<=10)
+       //     {
+       //         df=1;return false;
+       //     }
+       // }
 		return !point::eq(arg,m_arg,1e-10);
 	}
 	bool is_speed_changed(const point& pt,uint64_t time)
 	{
 		bool flag = false;
 		double v=0.0;
+        point ps=m_d.back().p;
+        if(ps.dist(pt)<0.1)return  flag;
 		if(m_d.size()>=4)
 		{
 			mini_data d1 = m_d.front();
@@ -187,20 +190,23 @@ struct location_card
 		bool flag=false;
 		int  iflag=0;
         //判断是否路径发生了变化
+        //这里现在又判断,如果反向了也会返回true.但是不运作,依然走下面的逻辑就会有问题
+        //比如速度
 		flag=handle_message(p,timestamp);
 		if(time_out(p,timestamp))
-			if(!flag)iflag=2;
-		if(is_speed_changed(p,timestamp))
 			if(!flag)iflag=1;
+		if(is_speed_changed(p,timestamp))
+			if(!flag)iflag=2;
 		if(is_area_changed(areaid))
-			if(!flag)iflag=1;
+			if(!flag)iflag=3;
 		if(is_map_changed(mapid))
-			if(!flag)iflag=1;
+			if(!flag)iflag=4;
+		log_info("his_location cardid:%d:%d",m_cardid,iflag);
 		if(iflag)
 		{
-			update(p,timestamp);
+			update(p,timestamp,iflag);
 			//set_invalid();	
-            if(iflag==1){
+            if(iflag>1){
 			    set(p,timestamp);
 			    insert();
             }
@@ -216,8 +222,9 @@ struct location_card
 		log_info("his_location[%d,%lu]:%s",m_cardid,m_timestamp,nsql);
 		sDBConnPool.PushAsync(nsql);
 	}
-	void update(const point &p,uint64_t timestamp)
+	void update(const point &p,uint64_t timestamp,int flag=0)
 	{
+        static uint64_t last_timestamp=0;
 		//std::string tabName=getTabName();
 		char nsql[512]={0};
 		const char * sql = "update his_location set last_time='%s',speed=%.2f where obj_id=%d and begin_time='%s' and last_time is null;";
@@ -225,8 +232,16 @@ struct location_card
 		double t	= (timestamp - m_timestamp)/1000;
 		double avge_speed= dist/t;
 		if(std::isnan(avge_speed)|| std::isinf(avge_speed))avge_speed=0;
+        if(last_timestamp != 0) 
+        {
+		    const char * ss = "update his_location set last_time='%s',speed=%.2f where obj_id=%d and begin_time='%s' and last_time = '%s';";
+		    snprintf(nsql,512,ss,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_objid,tool_time::to_str(m_timestamp/1000).c_str(),tool_time::to_str(last_timestamp/1000).c_str());
+        }
+        else
+		    snprintf(nsql,512,sql,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_objid,tool_time::to_str(m_timestamp/1000).c_str());
+        if(flag==1) last_timestamp=timestamp;
+        else last_timestamp=0;
 
-		snprintf(nsql,512,sql,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_objid,tool_time::to_str(m_timestamp/1000).c_str());
 		log_info("his_location[%d]:%s[%lu,%lu]",m_cardid,nsql,timestamp,m_timestamp);
 		sDBConnPool.PushAsync(nsql);
 	}
@@ -239,8 +254,8 @@ struct location_card
 	bool  handle_message(const point &p,uint64_t timestamp)
     {
 		bool flag = false;
-        int df=0;
-		if(line_changed(p,df))
+        //int df=0;
+		if(line_changed(p))//,df))
         {
             flag = true;
             std::vector<point> rc=find_path(m_d.back().p,p);
@@ -258,7 +273,7 @@ struct location_card
             //置m_arg非法
             set_invalid();
         }
-        if(df==1)flag=true;
+        //if(df==1)flag=true;
         return flag;
     }
     bool handle_path(std::vector<point> &rc,uint64_t timestamp,bool flag)
@@ -286,95 +301,4 @@ struct location_card
     }
 
 };
-#if 0
-struct location_staff:location_card
-{
-	location_staff(uint32_t id,uint64_t type,uint32_t objid)
-		:location_card(id,type,objid)
-	{}
-	virtual std::string getTabName(){return std::string{"his_location_staff_"};}
-	//人员如果运行方向发生变化的话,需要求的拐点。如果有拐点,入拐点。时间大与120s则不做处理。没有拐点,则不求
-	virtual bool  handle_message(const point &p,uint64_t timestamp)
-	{
-		bool flag = false;
-		if(line_changed(p))
-		{
-			log_info("his_location:line_changed %d",m_cardid);
-			flag=true;
-			if(timestamp-m_timestamp>120*1000)
-			{
-				log_info("his_location:line_changed_timeout %d",m_cardid);
-				update(m_d.back().p,m_d.back().time);
-				set(p,timestamp);
-			}
-			else
-			{
-				log_info("his_location:line_changed_find_path %d,(%.2f,%.2f)-->(%.2f,%.2f)-->(%.2f,%.2f)",m_cardid,m_p.x,m_p.y,m_d.back().p.x,m_d.back().p.y,p.x,p.y);
-				if(rc.empty())				
-				{
-					log_info("his_location:line_changed rc.empty() %d",m_cardid);
-					update(m_d.back().p,m_d.back().time);
-					set(m_d.back().p,m_d.back().time);
-				}
-				else
-				{
-					for(uint32_t i=0;i<rc.size();i++)
-						log_info("his_location:find_path..x=%.3lf,y=%.3lf\n",rc[i].x,rc[i].y);
-					if(rc.size()==1)
-					{
-						log_info("his_location:line_changed %d circle point(%.2f,%.2f)",m_cardid,rc[0].x,rc[0].y);
-						point tmp(rc[0].x,-rc[0].y);
-						update(tmp,m_d.back().time);
-						set(tmp,m_d.back().time);
-					}
-					else if(rc.size()==2)
-					{
-						point tmp(rc[0].x,-rc[0].y);
-						update(tmp,m_d.back().time);
-						set(tmp,m_d.back().time);
-						//
-						tmp.set(rc[1].x,-rc[1].y);
-						m_arg=make_arg(tmp,m_p);
-						insert();
-						//
-						update(tmp,timestamp);
-						set(tmp,timestamp);
-					}
-					else//更多的拐点
-					{
-						point tmp(rc[0].x,-rc[0].y);
-						update(tmp,m_d.back().time);
-						tmp.set(rc.back().x,-rc.back().y);
-						set(tmp,timestamp);
-					}
-				}
-			}
-			init_att();
-		}
-		return flag;
-	}
-};
-struct location_vehicle:location_card
-{
-	location_vehicle(uint32_t id,uint64_t type,uint32_t objid)
-		:location_card(id,type,objid)
-	{}
-	virtual std::string getTabName(){return std::string{"his_location_vehicle_"};}
-	//车辆是有推送拐点的,所以不需要求拐点。如果运行方向发生变化的话,直接更新数据库即可,使用上一个点的时间。同时生成这一次的历史。
-	virtual bool  handle_message(const point &p,uint64_t timestamp)
-	{
-		bool flag =false;
-		if(line_changed(p))
-		{
-			flag=true;
-            //如果有拐点,说明是丢失信号后,飞跃得过程
-//			std::vector<point> rc=card_path::inst().find_path(point(m_d.back().p.x,-m_d.back().p.y),point(p.x,-p.y));
-			log_info("his_location:line_changed %d ",m_cardid);
-			update(m_d.back().p,m_d.back().time);
-			set(m_d.back().p,m_d.back().time);init_att();
-		}
-		return flag;
-	}
-};
-#endif
 #endif