Browse Source

调整推送点位置,完善区域逻辑功能,修复部分bug

lixioayao 6 years ago
parent
commit
3d707683eb
11 changed files with 131 additions and 85 deletions
  1. 73 32
      area.cpp
  2. 29 26
      area.h
  3. 5 2
      card.cpp
  4. 6 1
      card_car.cpp
  5. 1 1
      card_person.cpp
  6. 1 1
      db/Makefile
  7. BIN
      db/libyadb.a
  8. 4 8
      main.cpp
  9. 0 2
      net-service.cpp
  10. 12 12
      websocket/Makefile
  11. BIN
      websocket/libwebsocket.a

+ 73 - 32
area.cpp

@@ -29,13 +29,29 @@ struct underground_area:area
 	{
 	
 	}
+
+    virtual bool in_area(const std::shared_ptr<site>&s, const point & p)
+	{
+		//根据s的地面、地下属性判断
+		return false;
+	}
 };
 
 struct ground_area:area
 {
+    virtual bool in_area(const std::shared_ptr<site>&s, const point & p)
+	{
+		//根据s的地面、地下属性判断
+		return false;
+	}
+};
 
-
-
+struct special_area:area
+{
+    virtual bool in_area(const std::shared_ptr<site>&s, const point & p)
+	{
+		return false;
+	}
 };
 
 void area::on_hover(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_base>&c)
@@ -64,7 +80,7 @@ void area::on_leave(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_
 	}
 }
 
-bool area::in_area(const point & p)
+bool area::in_area(const std::shared_ptr<site>&s, const point & p)
 {
 	if(m_bound.empty())
 	  return false;
@@ -376,14 +392,14 @@ void area_list::init_from_db(int id/*=-1*/)
 
             map.insert({area_id,ap});
 
-            CheckAreaType(ap,area_type_id,0);
+//            CheckAreaType(ap,area_type_id,0);
         }
         else
         {
             auto tmp_ptr = area_list::instance()->get(id);
             if(tmp_ptr)
             {
-                CheckAreaType(tmp_ptr,area_type_id,tmp_ptr->m_area_type);
+//               CheckAreaType(tmp_ptr,area_type_id,tmp_ptr->m_area_type);
 
                 tmp_ptr->update(over_count_person, over_time_person,scale,map_id,area_type_id,
                                 over_count_vehicle,over_time_vehicle);
@@ -403,7 +419,7 @@ void area_list::init_from_db(int id/*=-1*/)
 
                 area_list::instance()->add(id, ap);
 
-                CheckAreaType(ap,area_type_id,0);
+//               CheckAreaType(ap,area_type_id,0);
             }
 
             log_info("基础数据 增加或修改区域成功:区域id:%d,over_count_person:%d over_time_person:%d,scale:%.2f,map_id:%d\
@@ -423,6 +439,7 @@ void area_list::init_from_db(int id/*=-1*/)
 }
 
 
+#if 0
 //新画禁区功能-给禁区中的卡发送警告及呼叫
 void area_list::CheckAreaType(int area_id,int new_area_type,int old_area_type)
 {
@@ -502,6 +519,8 @@ void area_list::CheckAreaType( std::shared_ptr<area> pArea,int new_area_type,int
     card_list::instance()->accept(lv);
 }
 
+#endif
+
 #if 0
 void area_list::init_from_db()
 {
@@ -589,52 +608,74 @@ std::vector<point> area_list::init_path(std::string &str)
 	return std::move(vp);
 }
 
-std::shared_ptr<area> area_list::get_area(const point&pt)
+std::vector<std::shared_ptr<area>> area_list::get_area(const std::shared_ptr<site> s,const point&pt)
 {
-	std::shared_ptr<area> ret=nullptr;
+	std::vector<std::shared_ptr<area>> ret;
 		
 	auto map = area_list::instance()->m_map;
 
 	for(const auto &a:map)
 	{
-		if(a.second->in_area(pt))
-		  ret = a.second;
+		if(a.second->in_area(s, pt))
+		{
+			ret.push_back(a.second);
+		}
 	}
 	//区域覆盖不完全地图,很多车辆人行驶在地图外,如何确认.
-	return ret;
+	return std::move(ret);
 }
 
 void area_tool::on_point(const std::shared_ptr<site>&s,std::shared_ptr<card_location_base> c,const point&pt)
 {
 	log_info("on_point...cardid:%d,type:%d",c->m_id,c->m_type);
-	//获取地标信息
+
 	setLandmark(pt);
-	if(m_area_hover != nullptr && m_area_hover->m_area->in_area(pt))
-	{
-//		do_hover_biz(card_id,speed,type);
-	}
-	else
+
+	std::vector<std::shared_ptr<area>> areas=area_list::instance()->get_area(s, pt);//找出所有的区域
+	std::sort(areas.begin(),areas.end(),[](std::shared_ptr<area>&l,std::shared_ptr<area>&r){
+			return l->id()<r->id();
+			});
+
+	auto c1=m_hover_list.begin(),ce=m_hover_list.end();
+	auto a1=areas.begin() ,ae=areas.end();
+
+	std::vector<std::shared_ptr<area_hover>> nlist;
+
+	while (c1!=ce && a1!=ae)
 	{
-		auto area = area_list::instance()->get_area(pt);
-		if(area == nullptr)
-		{
-			//这里使用分站区域比较合理
-//			log_error("Cardid:%d can not find area..[x:%.2f,y:%.2f]",card_id,pt.x,pt.y);
-			return;
+		if ((*c1)->id()<(*a1)->id()) 
+		{ 
+			(*c1)->m_area->on_leave(*c1, c);
+			++c1;
 		}
-		if(m_area_hover==nullptr)
+		else if ((*a1)->id()<(*c1)->id()) 
 		{
-//			m_area_hover = std::make_shared<area_hover>(area,pt,speed);
-//			do_enter_biz(card_id,speed,type);
+			nlist.push_back(std::make_shared<area_hover>(*a1,pt));
+			(*a1)->on_enter(nlist.back(),c);
+			++a1;
 		}
-		else
-		{
-//			do_leave_biz(card_id,speed,type);
-
-//			m_area_hover.reset(new area_hover(area,pt,speed));
-//			do_enter_biz(card_id,speed,type);
+		else 
+		{ 
+			nlist.push_back(*c1);
+			(*c1)->m_area->on_hover(*c1,c);
+			++c1,++a1;
 		}
 	}
+
+	while(c1!=ce)
+	{
+		(*c1)->m_area->on_leave(*c1, c);
+		++c1;
+	}
+
+	while(a1!=ae)
+	{
+		nlist.push_back(std::make_shared<area_hover>(*a1,pt));
+		(*a1)->on_enter(nlist.back(),c);
+		++a1;
+	}
+
+	m_hover_list=std::move(nlist);
 }
 
 void area_hover::setLandmark(const point &pt)

+ 29 - 26
area.h

@@ -13,6 +13,7 @@ struct point;
 struct area_business;
 struct business_data;
 struct card_location_base;
+struct site;
 
 /*
 	每个区域对应一个area对象。
@@ -35,7 +36,7 @@ struct area
 	virtual	void on_enter(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_base>&c);
 	virtual	void on_leave(std::shared_ptr<area_hover>&a,std::shared_ptr<card_location_base>&c);
 
-    bool in_area(const point & p);
+    virtual bool in_area(const std::shared_ptr<site>&s, const point & p);
     int id()const
     {
         return m_id;
@@ -113,7 +114,8 @@ struct area_list:single_base<area_list,int,std::shared_ptr<area>>
 {
     area_list();
 
-    std::shared_ptr<area> get_area(const point&pt);
+	//根据分站、所在点找出所在区域列表
+	std::vector<std::shared_ptr<area>> get_area(const std::shared_ptr<site> s,const point&pt);
     std::vector<point> init_path(std::string  &str);
     ///id=-1为初始化所有
     void init_from_db(int id=-1);
@@ -141,7 +143,7 @@ struct area_hover
 	std::vector<std::shared_ptr<business_data>> m_data;
 
     area_hover()=default;
-    area_hover(std::shared_ptr<area>&area,const point&pt,double speed)
+    area_hover(std::shared_ptr<area>&area,const point&pt)
         :m_area(area)
     {
         m_enter_time=m_last_time=time(0);
@@ -199,48 +201,49 @@ struct area_hover
 struct site;
 struct area_tool
 {
-    std::shared_ptr<area_hover> m_area_hover=nullptr;
+	//卡所在的所有area的列表,以id排序
+	std::vector<std::shared_ptr<area_hover>> m_hover_list;
+
+	//推送卡位置时需要推送的所在区域id列表
+	std::vector<int> m_push_area_id_list;
+
+	std::shared_ptr<area_hover> get_area_first()const
+	{
+		if(m_hover_list.empty())
+			return nullptr;
+
+		return m_hover_list.front();
+	}
+
+	void init_area(std::shared_ptr<area>&a,const point&pt,std::shared_ptr<card_location_base> c)
+	{
+		m_hover_list.clear();
+		m_hover_list.push_back(std::make_shared<area_hover>(a,pt));
+		a->on_enter(m_hover_list.back(), c);
+	}
 
 	void on_point(const std::shared_ptr<site>&s,std::shared_ptr<card_location_base> c,const point&pt);
 
     void setLandmark(const point &pt)
     {
+#if 0
         if(m_area_hover)
         {
             m_area_hover->setLandmark(pt);
         }
-    }
-    //special area or no area att.,return true;else return false.
-    bool special_area()
-    {
-        if(m_area_hover==nullptr)
-            return true;
-        return m_area_hover->m_area->special();
+#endif
     }
     std::tuple<time_t,time_t,int,int,int,int,double,double> getLandmark()
     {
+#if 0
         if(m_area_hover)
             return m_area_hover->getLandmark();
         else
+#endif 
             return std::make_tuple(0,0,0,0,0,0,0,0);
 
     }
 
-	void do_hover_biz(uint32_t card_id,double speed,int16_t type)
-	{
-//		m_area_hover->m_area->on_hover(card_id,m_area_hover,speed,type);
-	}
-
-	void do_enter_biz(uint32_t card_id,double speed,int16_t type)
-	{
-//		m_area_hover->m_area->on_enter(card_id,m_area_hover,speed,type);
-	}
-
-	void do_leave_biz(uint32_t card_id,double speed,int16_t type)
-	{
-//		m_area_hover->m_area->on_leave(card_id,m_area_hover,speed,type);
-	}
-
 	void change_area(uint32_t card_id,double speed,int16_t type,int32_t new_areaid)
 	{
 #if 0

+ 5 - 2
card.cpp

@@ -242,7 +242,8 @@ void card_list::load_his_card_postion_vehicle()
             area->m_vehicle_count++;
 
             point pt = *card_ptr;
-            card_ptr->m_area_tool->m_area_hover = std::make_shared<area_hover>( area, pt,speed);
+            card_ptr->m_area_tool->init_area(area,pt,temp_ptr);
+			//m_area_hover = std::make_shared<area_hover>( area, pt,speed);
             auto area_hover_ptr = card_ptr->get_area_hover();
 
             auto e_t = tool_time::to_time_ex(enter_time);
@@ -361,7 +362,9 @@ void card_list::load_his_card_postion_staff()
             area->m_person_count++;
 
             point pt = *card_ptr;
-            card_ptr->m_area_tool->m_area_hover = std::make_shared<area_hover>(area,pt,speed);
+            card_ptr->m_area_tool->init_area(area,pt,temp_ptr);
+			
+//			m_area_hover = std::make_shared<area_hover>(area,pt,speed);
             auto area_hover_ptr = card_ptr->get_area_hover();
 
             auto e_t = tool_time::to_time_ex(enter_time);

+ 6 - 1
card_car.cpp

@@ -36,7 +36,7 @@ void car::site_hover(int sid)
 
 std::shared_ptr<area_hover> car::get_area_hover()
 {
-	return m_area_tool->m_area_hover;
+	return m_area_tool->get_area_first();
 }
 
 std::shared_ptr<mine_tool> car::get_mine_tool()
@@ -82,8 +82,12 @@ bool car::on_timer()
 {
 	return make_package();
 }
+
 int car::statbiz(int32_t special_id)
 {
+#pragma message ("代码被注释掉,需调整...")
+	return 0;
+#if 0
 	int status = get_stat();
 	if(status == STATUS_LOST)
 	{
@@ -98,6 +102,7 @@ int car::statbiz(int32_t special_id)
 		}
 	}
 	return status;
+#endif
 }
 bool car::make_package()
 {

+ 1 - 1
card_person.cpp

@@ -72,7 +72,7 @@ void person::IKSDK_DB(int sid)
 
 std::shared_ptr<area_hover> person::get_area_hover()
 {
-	return m_area_tool->m_area_hover;
+	return m_area_tool->get_area_first();
 }
 
 std::shared_ptr<mine_tool> person::get_mine_tool()

+ 1 - 1
db/Makefile

@@ -185,7 +185,7 @@ mandir = ${datarootdir}/man
 mkdir_p = $(MKDIR_P)
 oldincludedir = /usr/include
 pdfdir = ${docdir}
-prefix = /home/lemon/resource/ya-serv/db/../../dist
+prefix = /home/lemon/resource/ya-serv/db/../..
 program_transform_name = s,x,x,
 psdir = ${docdir}
 sbindir = ${exec_prefix}/sbin

BIN
db/libyadb.a


+ 4 - 8
main.cpp

@@ -36,7 +36,7 @@ struct Init_Setting
         std_info("json_interval:%d",send_interval);
         std::vector<std::string> url_list;
         url_list.push_back(url);
-        //wsClientMgr_init(url_list,send_interval);//init websocket
+        wsClientMgr_init(url_list,send_interval);//init websocket
         YADB::_DB_POOL_SETTING_ DBSetting;
 
         DBSetting.Host = config.get("db.host","127.0.0.1");
@@ -57,16 +57,12 @@ struct Init_Setting
         std_info("here....");
         area_list::instance()->init_from_db();
         std_info("here....");
-        //test
-        point pt(3348,100);
-        int id = area_list::instance()->get_area(pt)->id();
-        std_info("test area:%d",id);
-
+	
         Landmark_list::instance()->init_from_db();
+
         //auto a = Landmark_list::instance()->get(5,id,pt);
         //std_info("test landmark:id:%d,dir:%d,dis:%.2f",std::get<0>(a),std::get<1>(a),std::get<2>(a));
-
-        special_area_list::instance()->init_from_db();
+        //special_area_list::instance()->init_from_db();
         //auto s = special_area_list::instance()->get_special_id(1013,point(4727,-254),2);
         //std_info("test special_area:%d",s);
 		mine_business::inst()->load();

+ 0 - 2
net-service.cpp

@@ -33,8 +33,6 @@ void net_service::on_timer()
 {
 	visit_site_status vss;
 	sit_list::instance()->accept(vss);
-	card_list_visit cls;
-	card_list::instance()->accept(cls);
 	mine_business::inst()->run_business();
 }
 void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t len)

+ 12 - 12
websocket/Makefile

@@ -109,11 +109,11 @@ distuninstallcheck_listfiles = find . -type f -print
 am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
   | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
 distcleancheck_listfiles = find . -type f -print
-ACLOCAL = ${SHELL} /home/lemon/resource/ya-serv/missing --run aclocal-1.12
+ACLOCAL = ${SHELL} /home/zzj/ya-src/ya-serv/missing --run aclocal-1.12
 AMTAR = $${TAR-tar}
-AUTOCONF = ${SHELL} /home/lemon/resource/ya-serv/missing --run autoconf
-AUTOHEADER = ${SHELL} /home/lemon/resource/ya-serv/missing --run autoheader
-AUTOMAKE = ${SHELL} /home/lemon/resource/ya-serv/missing --run automake-1.12
+AUTOCONF = ${SHELL} /home/zzj/ya-src/ya-serv/missing --run autoconf
+AUTOHEADER = ${SHELL} /home/zzj/ya-src/ya-serv/missing --run autoheader
+AUTOMAKE = ${SHELL} /home/zzj/ya-src/ya-serv/missing --run automake-1.12
 AWK = gawk
 CC = gcc
 CCDEPMODE = depmode=gcc3
@@ -121,7 +121,7 @@ CFLAGS = -g -O2
 CPPFLAGS = 
 CXX = g++
 CXXDEPMODE = depmode=gcc3
-CXXFLAGS = -g -O2
+CXXFLAGS = -g
 CYGPATH_W = echo
 DEFS = 
 DEPDIR = .deps
@@ -138,7 +138,7 @@ LDFLAGS =
 LIBOBJS = 
 LIBS = 
 LTLIBOBJS = 
-MAKEINFO = ${SHELL} /home/lemon/resource/ya-serv/missing --run makeinfo
+MAKEINFO = ${SHELL} /home/zzj/ya-src/ya-serv/missing --run makeinfo
 MKDIR_P = /bin/mkdir -p
 OBJEXT = o
 PACKAGE = libwebsocket-a
@@ -154,10 +154,10 @@ SET_MAKE =
 SHELL = /bin/sh
 STRIP = 
 VERSION = 1.0
-abs_builddir = /home/lemon/resource/ya-serv/websocket
-abs_srcdir = /home/lemon/resource/ya-serv/websocket
-abs_top_builddir = /home/lemon/resource/ya-serv/websocket
-abs_top_srcdir = /home/lemon/resource/ya-serv/websocket
+abs_builddir = /home/zzj/ya-src/ya-serv/websocket
+abs_srcdir = /home/zzj/ya-src/ya-serv/websocket
+abs_top_builddir = /home/zzj/ya-src/ya-serv/websocket
+abs_top_srcdir = /home/zzj/ya-src/ya-serv/websocket
 ac_ct_CC = gcc
 ac_ct_CXX = g++
 am__include = include
@@ -177,7 +177,7 @@ host_alias =
 htmldir = ${docdir}
 includedir = ${prefix}/include
 infodir = ${datarootdir}/info
-install_sh = ${SHELL} /home/lemon/resource/ya-serv/install-sh
+install_sh = ${SHELL} /home/zzj/ya-src/ya-serv/install-sh
 libdir = ${exec_prefix}/lib
 libexecdir = ${exec_prefix}/libexec
 localedir = ${datarootdir}/locale
@@ -186,7 +186,7 @@ mandir = ${datarootdir}/man
 mkdir_p = $(MKDIR_P)
 oldincludedir = /usr/include
 pdfdir = ${docdir}
-prefix = /home/lemon/resource/ya-serv/websocket/../../dist
+prefix = /home/zzj/ya-src/ya-serv/websocket/../../dist
 program_transform_name = s,x,x,
 psdir = ${docdir}
 sbindir = ${exec_prefix}/sbin

BIN
websocket/libwebsocket.a