Kaynağa Gözat

增加了前端推送多个区域信息包括地标信息的功能,修改了之前的地标信息的逻辑

lixioayao 6 yıl önce
ebeveyn
işleme
b14ee56502

+ 2 - 3
Makefile.am

@@ -16,10 +16,9 @@ SRC_MAIN= ant.cpp area.cpp base64.cpp bindmorecard.cpp mine_business.cpp card_ar
     	  card.cpp card_message_handle.cpp cardMgr.cpp card_path.cpp card_person.cpp crc.cpp geo_hash.cpp \
 		  landmark.cpp line_fit.cpp loc_point.cpp loc_tool.cpp message.cpp message_file.cpp mine.cpp \
 		  net-service.cpp point.cpp select_tool.cpp site_area.cpp special_area.cpp tdoa_sync.cpp visit.cpp \
-		  web-client.cpp worker.cpp  znet.cpp ya_setting.cpp area_business.cpp event.cpp 
-SRC_MAIN_EVENT= mine_module/MineCardManager.cpp
+		  web-client.cpp worker.cpp event.cpp znet.cpp ya_setting.cpp area_business.cpp
 
-AM_SOURCES=$(SRC_MODULE_SERVICE) $(SRC_MONKEYCAR) $(SRC_MAIN) $(SRC_MAIN_EVENT)
+AM_SOURCES=$(SRC_MONKEYCAR) $(SRC_MODULE_SERVICE) $(SRC_MAIN) $(SRC_MAIN_EVENT)
 
 AM_CPPFLAGS=-Wall -pthread -m64 -g -std=c++11  -I${prefix}/include -I/usr/local/mysql/include -Iwebsocket -Iwebsocket/sio -I./db -I../dist/include -I../rapidjson/include -Imodule_service
 

+ 7 - 20
ant.cpp

@@ -4,6 +4,7 @@
 #include "ant.h"
 #include "db_api/CDBSingletonDefine.h"
 #include "event.h"
+#include "tool_time.h"
 template<> std::shared_ptr<sit_list> 
 single_base<sit_list, int, std::shared_ptr<site>>::m_instance=std::make_shared<sit_list>();
 int site::index()const
@@ -330,35 +331,21 @@ void sit_list::read_sit_list(int id)
     }
 }
 
-
 /*
-
    处理分站供电状态,交流供电时,ac_down=false,直流供电时,ac_down=true
 
    目前只有大分站实现了这个功能,并且井下安装时是否接入了该电信号也不确定
    ,所以需要有张表定义某个ID是否需要告警
-
  */
 void site::on_power_status(bool ac_down)//电源状态
 {
-	if(!m_power_check_enable)
-		return;
-	
-	if(ac_down == m_power_ac_down)
-		return;
-	m_power_ac_down=ac_down;
-	if(m_power_ac_down)
+	if(!m_power_check_enable || ac_down == m_power_ac_down)
 	{
-		//掉电告警
-	
-	
-	}
-	else
-	{
-		//撤销警告
-	
-	
-	}
+        return;
+    }
+    m_power_ac_down=ac_down;
+    event_tool::instance()->handle_event(OT_DEVICE_READER,ET_READER_POWER_BY_BATTERY,id(),tool_time::now_to_seconds(),ac_down,m_power_ac_down);
+    log_info("[event warning: reader power supply by battery] reader_id: Power %d->%d.",id(),!m_power_ac_down,m_power_ac_down);
 }
 
 #if 0

+ 0 - 206
ant.cppbak

@@ -1,206 +0,0 @@
-
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-#include "ant.h"
-
-int site::index()const
-{
-	return m_algo+(m_num_dims<<1);
-}
-
-sit_list*sit_list::instance()
-{
-	static sit_list _impl;
-	//_impl.load_from_db();
-	return &_impl;
-}
-site::site(int id)
-	:m_algo(0)
-	,m_num_dims(0)
-    ,m_id(id)
-    ,m_path_empty(true)
-{
-
-}
-const algo_config&site::config()const
-{
-	return g_config[index()];
-}
-
-const site& sit_list::operator[](int id) const
-{
-    return m_list[id];
-} 
-static int str_split(char*s,char**rc)
-{
-	char**o=rc;
-
-	for(;*s;)
-	{
-		*o=strtok_r(s,",",&s);
-		o++;
-	}
-
-	return o-rc;
-}
-
-//1, 101, 1, '101-1', 4727, 75, 0, 0, '2017-08-29 10:21:14'
-void sit_list::read_sit_list(const char*fname)
-{
-	FILE*fp=fopen(fname,"r");
-	char buf[512];
-	int t,id;
-	char* s[20];
-	while(fgets(buf,sizeof(buf),fp))
-	{
-		t=str_split(buf,&s[0]);
-		if(t<8)
-			continue;
-
-		id=atoi(s[1]);
-		if(id>(int)m_list.size())
-			continue;
-
-		int antid=atoi(s[2])-1;
-		if(antid>=2)
-			continue;
-
-		m_list[id].m_id=id;
-		m_list[id].m_ant[antid].set(atof(s[4]),-atof(s[5]));
-	}
-
-	for(auto&sit:m_list)
-	{
-		if(sit.m_id==-1)
-			continue;
-
-		if(sit.m_ant[0]==sit.m_ant[1])
-		{
-			printf("%d分站天线坐标相等.\n",sit.m_id);
-		}
-
-		sit.set( (sit.m_ant[0].x+sit.m_ant[1].x)/2,(sit.m_ant[0].y+sit.m_ant[1].y)/2);
-	}
-
-	fclose(fp);
-}
-void sit_list::read_ant_path(const char*fname)
-{
-	FILE*fp=fopen(fname,"r");
-	char buf[512],*p;
-	int t,id,pid;
-	char* s[20];
-	while((p=fgets(buf,sizeof(buf),fp)))
-	{
-		t=str_split(buf,&s[0]);
-		if(t<9)
-			continue;
-
-		id=atoi(s[0]);
-		if(id>(int)m_list.size())
-			continue;
-
-		pid=atoi(s[1]);
-		if(pid>2)
-          continue;
-
-        point p1(atof(s[2]),-atof(s[3]));
-        point p2(atof(s[5]),-atof(s[6]));
-        
-        if(pid == 0)
-        {
-            line_v l(p1,p2);
-            {
-                point px = l.line::projection(m_list[id]);
-                m_list[id].set(px);
-                for(int i=0;i<2;i++)
-                {
-                    path p;
-                    p.m_slope[0] = atof(s[8]);
-                    p.m_line[0] = line_v(px,l[i]);
-                    m_list[id].m_ant[i].m_path.push_back(p);
-                }
-            }
-        }
-        else 
-        {
-            ant &a = pid<0?m_list[id].m_ant[0]:m_list[id].m_ant[1];
-            if(a.m_path.size()!=0)
-            {
-                path &p = a.m_path[0];
-                p.m_line[abs(pid)-1] = line_v(p1,p2);
-                p.m_slope[abs(pid)-1] = atof(s[8]);
-            }
-            else
-            {
-                path p;
-                p.m_line[abs(pid)-1] = line_v(p1,p2);
-                p.m_slope[abs(pid)-1] = atof(s[8]);
-                a.m_path.push_back(p);
-            }
-            if(abs(pid)==1)
-				 m_list[id].set(p1);
-        }
-	}
-	fclose(fp);
-
-	for(auto&s:m_list)
-	{
-		if(s.m_id==-1)
-			continue;
-        s.swap();
-		if((s.path(0).empty() && s.path(1).empty()))
-			continue;
-        s.m_path_empty=false; 
-
-        for(auto &a:s.m_ant)
-        for(auto &p:a.m_path)
-        {
-            if(!p.m_line[0].empty())
-            {
-                point px = p.m_line[0].line::projection(a);
-                p.m_line[0]=line_v(px,p.m_line[0][1]);
-            }
-        }
-        std_info("%s",s.to_string().c_str());
-        //std_info("%f----%f",s.x,s.y);
-	}
-}
-
-
-
-loc_message::loc_message()
-	 :m_num_ticks(0)
-{
-}
-int loc_message::tool_index()const
-{
-	return m_sit.index();
-}
-
-algo_config site::g_config[]=
-{
-	{ "tof-1",  1, 2, 0.1, 1 },
-	{ "tdoa-1", 2, 2, 0.1, 1 },
-	{ "tof-2",  2, 3, 0.1, 1 },
-	{ "tdoa-2", 3, 3, 0.1, 1 },
-	{ "tof-3",  3, 4, 0.1, 1 },
-	{ "tdoa-3", 4, 4, 0.1, 1 }
-};
-
-template<> std::shared_ptr<sit_list> 
-single_base<sit_list, int, std::shared_ptr<site>>::m_instance=std::make_shared<sit_list>();
-#ifdef _TEST
-int main()
-{
-	log_init("./log.ini");
-    sit_list *sl = sit_list::instance();
-	sl->load("data_reader_antenna.txt","path_tof.txt");
-    (*sl)[219].solving(0,100);
-    (*sl)[219].solving(1,100.5);
-    std_info("---%d",(*sl)[209].m_ant[0].m_path.size());
-    std_info("---%d",(*sl)[209][0].size());
-    std_info("---%s",(*sl)[209][0][0][0].to_string().c_str());
-}
-#endif

+ 12 - 3
ant.h

@@ -1,3 +1,6 @@
+/**
+ * 分站数据结构 site_list
+ */
 #ifndef _ANT_LIST_HPP_
 #define _ANT_LIST_HPP_
 
@@ -130,6 +133,15 @@ struct site:point,std::enable_shared_from_this<site>
 
 
 	time_t m_time;
+    time_t m_rec_time;              // 接收数据的时间
+    time_t m_lost_time;		        // 丢失时间
+    time_t m_last_send_time;	    // 最后向前端发送时间
+
+    unsigned char m_reader_dir;		// 分站方向,对于大小分站适用
+    unsigned char m_relay_counts;		// 大小分站经过中继数
+    int  m_tick_count;			    // 分站发生消息的计数器
+    bool m_power_check_enable=false;//该分站是否启用交流掉电检测功能(告警功能)
+    bool m_power_ac_down=false;     //false=交流电供电状态
 
     site(int id=-1);
 
@@ -318,9 +330,6 @@ struct site:point,std::enable_shared_from_this<site>
         m_ant[0].m_path.clear();
         m_ant[1].m_path.clear();
     }
-
-	bool m_power_check_enable=false;//该分站是否启用交流掉电检测功能
-	bool m_power_ac_down=false;//交流电供电状态
 /*
 
 	处理分站供电状态,交流供电时,ac_down=false,直流供电时,ac_down=true

+ 0 - 293
ant.hbak

@@ -1,293 +0,0 @@
-#ifndef _ANT_LIST_HPP_
-#define _ANT_LIST_HPP_
-
-#include <math.h>
-#include <array>
-#include <deque>
-#include <tuple>
-#include <memory>
-#include <algorithm>
-#include <sstream>
-#include "log.h"
-#include "line.h"
-#include "point.h"
-#include "write-copy.h"
-
-struct path
-{
-    std::array<line_v,2>	m_line; 
-    std::array<double,2>    m_slope;
-    path()
-    {
-        for(auto &d:m_slope)
-            d=0;
-    }
-    std::string to_str() const
-    {
-        std::stringstream ss;
-        for(int i=0;i<2;i++)
-        {
-            ss<<"line:" <<m_line[i].to_string()<<"slope:"<<m_slope[i]<< " cos:"<<m_line[i].cos()<<" sin:"<<m_line[i].sin()<<" | ";
-        }
-        return ss.str();
-    }
-    bool vaild() const
-    {
-        return !m_line[0].empty();
-    }
-    line_v & operator[](int i)
-    {
-        return m_line[i];
-    }
-    const line_v & operator[](int i) const 
-    {
-        return m_line[i];
-    }
-   
-};
-//?
-struct algo_config
-{
-	const char*desc;
-	int min_msg_cnt;
-	int best_msg_cnt;
-	double min_wait_time;
-	double max_wait_time;
-};
-//
-struct ant :point
-{
-	std::vector<path> m_path;
-    path & operator[](int i)
-    {
-        return m_path[i];
-    }
-    const path & operator[](int i) const
-    {
-        return m_path[i];
-    }
-    size_t size() const
-    {
-        return m_path.size();
-    }
-    std::vector<point> getsol(const double &dist) const
-    {
-        std::vector<point> v;
-        for(const auto & p : m_path)
-        {
-            double d  = dist;
-            if(p.vaild())
-            {
-                point pt;
-                if(dist <= p.m_line[0].length() || (dist > p.m_line[0].length() && p.m_line[1].empty()))        
-                {
-                    d += d*p.m_slope[0];
-                    pt = point(p.m_line[0][0].x + d*p.m_line[0].cos() , p.m_line[0][0].y + d*p.m_line[0].sin());
-                }
-                else
-                {
-                    d -= p.m_line[0].length();
-                    d += d*p.m_slope[1];
-                    pt = point(p.m_line[1][0].x+d*p.m_line[1].cos(),p.m_line[1][0].y+d*p.m_line[1].sin());
-                }
-                v.push_back(pt);
-                std_info("get_sol:x:%.2f,y:%.2f",pt.x,pt.y);
-            }
-            else
-                std_error("%s","ant::getsol empty path..");
-        }
-        return std::move(v);
-    }
-
-};
-
-struct site:point
-{
-	static algo_config g_config[];
-	int      m_algo;			//TOF:0,TDOA:1
-	int      m_num_dims;	    //1维:0,2维:1,3维:2
-    double  m_scale = 2.0;  // 地图比例尺
-
-	point    m_position;
-	int index()const;
-	const algo_config&config()const;
-
-	site(int id=-1);
-
-	mutable double m_height=1.5;
-	int m_id;
-	bool m_path_empty;
-	std::array<ant,2> m_ant;
-
-	mutable double m_ant_dist=0;
-	mutable double m_ant_dist_sum_new=0;
-	mutable int m_ant_dist_cnt_new=0;
-
-    point get_dstp(const point pt) const 
-    {
-        point tmp;
-        for(const auto & p : m_ant[0].m_path)
-        {
-            for(int i=0;i<2;i++)
-            {
-                if(!p[i].empty())
-                {
-                    if(p[i].contain(pt,0.01))
-                    {
-                        //if(i==0)
-                         // return *this;
-                        //else
-                          tmp = p[i][0];
-                    }
-                }
-            }
-        }
-        return tmp;
-    }
-
-	void count_ant_dist(double dist_tof1, double dist_tof2)const
-	{
-		if(dist_tof1<10 || dist_tof2<10)
-			return;
-		double dist = fabs(dist_tof1 - dist_tof2);
-		if(dist>5)
-			return;
-		m_ant_dist_sum_new += dist;
-		m_ant_dist_cnt_new++;
-		
-		if(m_ant_dist_cnt_new >= 2500)
-		{
-			m_ant_dist = m_ant_dist_sum_new / m_ant_dist_cnt_new;
-			m_ant_dist_sum_new = 0;
-			m_ant_dist_cnt_new = 0;
-		}
-	}
-    void swap()
-    {
-       auto v0 =  m_ant[0].m_path;
-       auto v1 =  m_ant[1].m_path;
-       std::copy (std::begin(v0),std::end(v0),std::back_inserter(m_ant[1].m_path));
-       std::copy (std::begin(v1),std::end(v1),std::back_inserter(m_ant[0].m_path));
-    }
-	double ant_dist()const
-	{
-		return m_ant[0].dist(m_ant[1]);
-	}
-	
-	bool is_path_empty()const
-	{
-        return m_path_empty;
-	}
-
-	bool have_valid_path()const
-	{
-        return m_id != -1 && ant_dist() > 0.1;
-	}
-
-	std::string to_string()const
-	{
-        std::stringstream ss;
-        ss<<"site_id:"<<m_id<<"x:"<<x<<" y: "<<y;
-        for(const auto a:m_ant)
-        {  
-            ss<<"<";
-            for(const auto p:a.m_path)
-            {
-                ss<<"{"<<p.to_str()<<"}";
-            }
-            ss<<">";
-        }
-        return ss.str();
-	}
-
-	const point&path(int i)const
-	{
-        static point p;
-        if(i>=(int)m_ant[0].m_path.size())
-            return p ;
-		return m_ant[0].m_path[i].m_line[0][1];
-	}
-
-    std::vector<point> solving(int ant_id, double dist)const
-	{
-        const ant &a = m_ant[ant_id];
-        if(dist<50 && dist>0)
-		{
-			if(dist<m_height)
-			{
-				m_height=dist;
-				dist=0;				
-			}
-			else
-			{
-				dist=sqrt(dist*dist-m_height*m_height);
-			}
-		}
-        return std::move(a.getsol(dist));
-   	}
-    ant operator[](int i)
-    {
-        return m_ant[i];
-    }
-    const ant operator[](int i) const
-    {
-        return m_ant[i];
-    }
-};
-
-
-struct sit_list:single_base<sit_list,int,std::shared_ptr<site>>
-{
-
-	const site& operator[](int id) const;
-	static void load(const char*ant_file,const char*path_file)
-	{
-		read_sit_list(ant_file);
-		read_ant_path(path_file);
-	}
-
-	static void load_from_db()
-	{
-		load("data_reader_antenna.txt","path_tof.txt");
-	}
-
-	static void read_sit_list(const char*fname);
-	static void read_ant_path(const char*fname);
-};
-
-struct loc_message
-{
-	site     m_sit;
-	uint64_t m_num_ticks; //tof时间片m_tof或tdoa相对root时间
-	uint64_t m_loc_time;
-	uint32_t m_card_id;
-	int32_t	 m_card_ct;
-	int8_t   m_card_type;
-	int8_t   m_ant_id;
-	int16_t  m_rav;
-	int16_t  m_acc;
-	uint16_t m_sync_ct;
-	uint16_t m_rssi;
-
-
-	loc_message();
-	loc_message(site s,uint64_t num_ticks,uint64_t timestamp,
-			uint32_t cardid,int32_t ct,int8_t type,int8_t antid,	
-			int16_t rav,int16_t acc,uint16_t sync_ct,uint16_t rssi)
-		:m_sit(s)
-		 ,m_num_ticks(num_ticks)
-         ,m_loc_time(timestamp)
-        ,m_card_id(cardid)
-        ,m_card_ct(ct)
-        ,m_card_type(type)
-        ,m_ant_id(antid)
-        ,m_rav(rav)
-        ,m_acc(acc)
-        ,m_sync_ct(sync_ct)
-        ,m_rssi(rssi)
-	{}
-	int tool_index()const;
-};
-
-#endif
-

+ 57 - 91
area.cpp

@@ -13,7 +13,11 @@
 #include <boost/algorithm/string/classification.hpp>
 
 #include "area_business.h"
+#include "site_area.h"
 #include"card.h"
+#include "tool_time.h"
+#include "websocket/ws_common.h"
+#include "websocket/wsClientMgr.h"
 
 template<> std::shared_ptr<area_list> 
 single_base<area_list, int, std::shared_ptr<area>>::m_instance=std::make_shared<area_list>();
@@ -32,6 +36,13 @@ struct underground_area:area
 		  f=true;
 		return f;
 	}
+	//推入特殊区域的是否需要其他信息
+	virtual	void on_enter(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c)
+	{
+		YA::_CARD_POS_ cp;
+		cp.area_id = m_id;
+		swsClientMgr.SendSpecialAreaProcess(cp);
+	}
 };
 
 struct special_area:area
@@ -63,6 +74,8 @@ area::area(int id,int limit_count_person, int limit_time_person,double scale,int
      ,m_vehicle_count(0)
     {
 		m_area_business_list=area_business::get_instance_list(m_area_type);
+		m_event_person_count = false;
+		m_event_vehicle_count = false;
     }
 
 
@@ -266,7 +279,7 @@ void area_list::init_from_db(int id/*=-1*/)
 {
     std::string sql = "SELECT a.area_id, a.name, a.map_id, a.area_type_id, a.path,b.scale, \
             over_count_person, over_count_vehicle, over_time_person, over_time_vehicle, \
-            over_speed_vehicle, is_attendance,business_type \
+            over_speed_vehicle, is_attendance,business_type, a.is_work_area\
             FROM dat_area a,dat_map b\
             where a.map_id = b.map_id and  area_id not in \
 			  (select monkeycar_base_info_id from dat_monkeycar_base_info)";
@@ -330,6 +343,9 @@ void area_list::init_from_db(int id/*=-1*/)
 		uint32_t b_type =0;
         DBRes.GetField( "business_type",b_type, Error );
 
+        int is_work_area = 0;
+        DBRes.GetField( "is_work_area",is_work_area, Error );
+
         log_info("init_area : id:%d,path:%s",area_id, path.c_str());
 
         if(-1 == id)
@@ -338,6 +354,7 @@ void area_list::init_from_db(int id/*=-1*/)
             ap->m_limit_vehicle_second = over_time_vehicle;
             ap->m_limit_vehicle_count = over_count_vehicle;
             ap->m_over_speed_vehicle = over_speed_vehicle;
+            ap->m_is_work_area = is_work_area;
 
             ap->m_bound=init_path(path);
             for(const auto &p : ap->m_bound)
@@ -355,6 +372,7 @@ void area_list::init_from_db(int id/*=-1*/)
             tmp_ptr->update(over_count_person, over_time_person,scale,map_id,area_type_id, over_count_vehicle,over_time_vehicle);
             tmp_ptr->m_bound=init_path(path);
             tmp_ptr->m_over_speed_vehicle = over_speed_vehicle;
+            tmp_ptr->m_is_work_area = is_work_area;
             for(const auto &p : tmp_ptr->m_bound)
                 log_info("point:area_id:%d--x:%.2f,y:%.2f",area_id,p.x,p.y);
 
@@ -373,88 +391,6 @@ void area_list::init_from_db(int id/*=-1*/)
     init_monkeycar_area(id);
 }
 
-
-#if 0
-//新画禁区功能-给禁区中的卡发送警告及呼叫
-void area_list::CheckAreaType(int area_id,int new_area_type,int old_area_type)
-{
-    auto area_ptr = area_list::instance()->get(area_id);
-    if (!area_ptr) {
-        log_info("区域已经删除:areaid=%d", area_id);
-        return;
-    }
-    CheckAreaType(area_ptr,new_area_type,old_area_type);
-}
-void area_list::CheckAreaType( std::shared_ptr<area> pArea,int new_area_type,int old_area_type)
-{
-    if (nullptr == pArea)
-    {
-        return ;
-    }
-    if (new_area_type != AREA_TYPE::AREA_TYPE_FORBIDDEN && old_area_type != AREA_TYPE::AREA_TYPE_FORBIDDEN)
-    {
-        return;
-    }
-
-    struct local_visit:visitor<std::shared_ptr<card_location_base>>
-    {
-        std::shared_ptr<area> m_area;
-        int m_old_area_type;
-        bool visit(std::shared_ptr<card_location_base> c)
-        {
-            //处理
-            point pt(c->x,c->y,c->z);
-            std::shared_ptr<area> point_area = area_list::instance()->get_area(pt);
-            if (point_area == nullptr)
-            {
-                return true;
-            }
-            //不在区域里
-            if (m_area->m_id != point_area->m_id)
-            {
-                return true;
-            }
-
-            if (m_area->m_area_type == AREA_TYPE::AREA_TYPE_FORBIDDEN)
-            {
-                //发送进入禁区的警告
-                //呼叫
-                std::shared_ptr<area_hover> _area_hover = c->get_area_hover();
-                if (nullptr != _area_hover)
-                {
-                    _area_hover->m_area = m_area;
-                    _area_hover->m_area->on_enter(_area_hover,c);
-                }
-            }
-            else
-            {
-                if (m_old_area_type == AREA_TYPE::AREA_TYPE_FORBIDDEN)
-                {
-                    //之前是禁区,改成非禁区
-                    //发送一个离开禁区的警告
-                    //停止呼叫
-                    std::shared_ptr<area_hover> _area_hover = c->get_area_hover();
-                    if (nullptr != _area_hover)
-                    {
-                        _area_hover->m_area->on_leave(_area_hover,c);
-                    }
-                }
-                else
-                {
-                    return  false;
-                }
-            }
-
-            return true;
-        }
-    };
-    local_visit lv;
-    lv.m_area = pArea;
-    lv.m_old_area_type = old_area_type;
-    card_list::instance()->accept(lv);
-}
-
-#endif
 std::vector<point> area_list::init_path(std::string &str)
 {
 	if(str.empty())
@@ -487,11 +423,16 @@ std::vector<std::shared_ptr<area>> area_list::get_area(const std::shared_ptr<sit
 	//区域覆盖不完全地图,很多车辆人行驶在地图外,如何确认.
 	return std::move(ret);
 }
+area_hover::area_hover(std::shared_ptr<area>&area,const point&pt)
+	:m_area(area)
+{
+    m_enter_time=m_last_time=tool_time::now_to_ms();
+    m_enter_point=m_last_point=pt;
+}
 
 void area_tool::on_point(const std::shared_ptr<site>&s,const 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);
 	
 	int special_area=-1;
 	std::vector<std::shared_ptr<area>> areas=area_list::instance()->get_area(s,c, pt,special_area);
@@ -556,12 +497,37 @@ void area_tool::on_leave(const std::shared_ptr<card_location_base>& c)
     }
 }
 
-void area_hover::setLandmark(const point &pt)
+void area_tool::set_area_info(int mapid,double scale,int areaid,const point &pt,uint64_t t,int type)
 {
-	set(pt);
-	auto lm = Landmark_list::instance()->get(mapid(),id(),pt);
-	landmark_id = std::get<0>(lm);
-	landmark_dir = std::get<1>(lm);
-	landmark_dis = std::get<2>(lm)*scale();
-	log_info("landmark:%d %d %.2f,(%.2f,%.2f),%f",landmark_id,landmark_dir,landmark_dis,pt.x,pt.y,scale());
+	if(0==type)
+	{
+		m_mapid = mapid;
+		m_scale=scale;
+		set_area_info(mapid,areaid,pt,t);
+	}
+	else if(1==type)
+	{
+		set_area_info(mapid,areaid,pt,t);
+	}
+	else if(2==type)
+	{
+		auto it =m_area_info.find(areaid);
+		if(it != m_area_info.end())
+		  m_area_info.erase(it);
+	}
+	else
+	{
+		log_info("wrong type..");
+	}
 }
+void area_tool::set_area_info(int mapid,int areaid,const point &pt,uint64_t t)
+{
+	auto lm = Landmark_list::instance()->get(mapid,areaid,pt);
+	int landmark_id = std::get<0>(lm);
+	int landmark_dir = std::get<1>(lm);
+	double landmark_dis = std::get<2>(lm)*m_scale;
+	log_info("landmark:%d %d %.2f,(%.2f,%.2f),%f",landmark_id,landmark_dir,landmark_dis,pt.x,pt.y,m_scale);
+	std::tuple<int,int,int,double,uint64_t> tinfo=std::make_tuple(areaid,landmark_id,landmark_dir,landmark_dis,t);
+	m_area_info[areaid].swap(tinfo);
+}
+

+ 23 - 54
area.h

@@ -8,6 +8,8 @@
 #include <point.h>
 #include "common.h"
 #include <write-copy.h>
+#include <set>
+#include <map>
 
 struct area_hover;
 struct point;
@@ -77,13 +79,17 @@ public:
 	*/
     int m_area_type;
 
-	//人卡超时及超员数量
+	//人卡超时及超员数量(阀值)
     int m_limit_person_second;
     int m_limit_person_count;
+    //是否人卡超员已有告警
+    bool m_event_person_count;
 
-	//人卡超时及超员数量
+	//人卡超时及超员数量(阀值)
     int m_limit_vehicle_second;
     int m_limit_vehicle_count;
+    //是否人卡超员已有告警
+    bool m_event_vehicle_count;
     double m_scale;
     int32_t m_mapid;
 
@@ -92,8 +98,12 @@ public:
     ///区域车卡数
     std::atomic<int> m_vehicle_count;
 
+
     //区域速度门限
     double m_over_speed_vehicle;
+
+    //是否是工作区域(0:不是、1:是)
+    int m_is_work_area=0;
 };
 
 struct area_list:single_base<area_list,int,std::shared_ptr<area>>
@@ -108,21 +118,13 @@ struct area_list:single_base<area_list,int,std::shared_ptr<area>>
     void init_monkeycar_area(int id=-1);
 private:
 	std::shared_ptr<area>  create(int type,int id,int limit_count_person, int limit_time_person,double scale,int32_t mapid,int32_t b_type);
-    //禁区功能-给禁区中的卡发送警告及呼叫
-    void CheckAreaType(int area_id,int new_area_type,int old_area_type);
-    void CheckAreaType( std::shared_ptr<area> pArea,int new_area_type,int old_area_type);
 };
 
 struct area_hover
 {
     std::shared_ptr<area>  m_area;
-    time_t m_enter_time,m_last_time;
-    point  m_enter_point,m_last_point;
-
-    int landmark_id;
-    int landmark_dir;
-    double landmark_dis;
-
+    uint64_t m_enter_time,m_last_time;
+    point	 m_enter_point,m_last_point;
 	/*
 		记录该业务所关心的需持续使用的数据,每个业务一个指针
 		建议该数据项在on_enter时初始化,on_leave时清除
@@ -130,17 +132,8 @@ 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)
-        :m_area(area)
-    {
-        m_enter_time=m_last_time=time(0);
-        m_enter_point=m_last_point=pt;
-        landmark_id=0;
-        landmark_dir=0;
-        landmark_dis=0;
-    }
-
-	std::shared_ptr<business_data>&get_business_data(int type)
+    area_hover(std::shared_ptr<area>&area,const point&pt);
+   	std::shared_ptr<business_data>&get_business_data(int type)
 	{
 		if(type>=(int)m_data.size())
 		{
@@ -171,11 +164,6 @@ struct area_hover
     {
         return m_area->id()<o.m_area->id();
     }
-    std::tuple<time_t,time_t,int,int,int,int,double,double> getLandmark()
-    {
-        return std::make_tuple(m_enter_time,m_last_time,mapid(),id(),landmark_id,landmark_dir,landmark_dis,scale());
-    }
-    void setLandmark(const point &pt);
     void set(const point&pt)
     {
         m_last_time=time(0);
@@ -192,8 +180,10 @@ struct area_tool
 	std::vector<std::shared_ptr<area_hover>> m_hover_list;
 
 	//推送卡位置时需要推送的所在区域id列表
-	std::vector<int> m_push_area_id_list;
-
+	std::map<int,std::tuple<int,int,int,double,uint64_t>> m_area_info;
+	int m_mapid=-1;
+	double m_scale=2.0;
+	//返回第一个,人卡第一个全部是井下0
 	std::shared_ptr<area_hover> get_area_first()const
 	{
 		if(m_hover_list.empty())
@@ -212,30 +202,9 @@ struct area_tool
 	void on_point(const std::shared_ptr<site>&s,const std::shared_ptr<card_location_base>& c,const point&pt);
     void on_leave(const std::shared_ptr<card_location_base>& c);
 
-    void setLandmark(const point &pt)
-    {
-		for(const auto & ha:m_hover_list)
-			ha->setLandmark(pt);
-    }
-    std::tuple<time_t,time_t,int,int,int,int,double,double> getLandmark()
-    {
-		double dis = DBL_MAX,d=0;
-		std::shared_ptr<area_hover> tmp=nullptr;
-		for(const auto & ha:m_hover_list)
-		{
-			d=ha->landmark_dis;
-			if(d<dis){
-				dis=d;tmp = ha;
-			}
-		}	
-		if(tmp)
-		  return tmp->getLandmark();
-		else
-          return std::make_tuple(0,0,0,0,0,0,0,0);
-
-    }
-
-	void change_area(uint32_t card_id,double speed,int16_t type,int32_t new_areaid)
+	void set_area_info(int mapid,double scale,int areaid,const point &pt,uint64_t t,int type);
+	void set_area_info(int mapid,int areaid,const point &pt,uint64_t t);
+   	void change_area(uint32_t card_id,double speed,int16_t type,int32_t new_areaid)
 	{
 #if 0
 		do_leave_biz(card_id,speed,type);

+ 0 - 1
area_business.cpp

@@ -1,6 +1,5 @@
 
 #include <assert.h>
-
 #include "area_business.h"
 #include "area_business_car_attendance.h"
 #include "area_business_card_enter_or_leave.h"

+ 6 - 7
card.cpp

@@ -17,7 +17,6 @@
 #include "area.h"
 #include "card.h"
 #include "mine_business.h"
-#include "mine_module/MineCardManager.h"
 
 extern config_file config;
 void card_list::init_staffer(int64_t id64)
@@ -260,9 +259,9 @@ void card_list::load_his_card_postion_vehicle()
                 mine_tool_ptr->m_is_attendance = true;
             }
 
-            area_hover_ptr->landmark_id = landmark_id;
-            area_hover_ptr->landmark_dir = direction_mapper_id;
-            area_hover_ptr->landmark_dis = landmark_dist;
+            //area_hover_ptr->landmark_id = landmark_id;
+            //area_hover_ptr->landmark_dir = direction_mapper_id;
+            //area_hover_ptr->landmark_dis = landmark_dist;
 
             card_ptr->m_time = tool_time::now_to_ms();
         }
@@ -382,9 +381,9 @@ void card_list::load_his_card_postion_staff()
                 mine_tool_ptr->m_is_attendance = true;
             }
 
-            area_hover_ptr->landmark_id = landmark_id;
-            area_hover_ptr->landmark_dir = direction_mapper_id;
-            area_hover_ptr->landmark_dis = landmark_dist;
+            //area_hover_ptr->landmark_id = landmark_id;
+            //area_hover_ptr->landmark_dir = direction_mapper_id;
+            //area_hover_ptr->landmark_dis = landmark_dist;
 
             card_ptr->m_time = tool_time::now_to_ms();
         }

+ 4 - 6
card_base.h

@@ -88,13 +88,11 @@ struct card_location_base:card,std::enable_shared_from_this<card_location_base>
     virtual void clear();
 	virtual void reset(std::shared_ptr<monkey_person> mp){}
     virtual int get_vehicle_type_id(){return  0;}
-    virtual std::tuple<time_t,time_t,int,int,int,int,double,double> getLandmark()=0;
+	virtual void set_area_info(int mapid,double scale,int areaid,uint64_t t,int type)=0;
 	virtual int get_area()=0;
     virtual std::shared_ptr<area_tool> get_area_tool()=0;
-    virtual int get_vehicle_category_id()
-    {
-        return -1;
-    }
+    virtual int get_vehicle_category_id(){return -1;}
+    virtual int get_workline(){return -1;}
 
     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 );
@@ -103,9 +101,9 @@ struct card_location_base:card,std::enable_shared_from_this<card_location_base>
 	void del_card_pos();
 	int	 get_stat();
 	void put_three_rates(card_pos &);
+
     bool is_person() const;
     bool is_vehicle() const;
-
 	virtual ~card_location_base();
 
     static std::shared_ptr<card_location_base> make_person(const std::string&type,uint32_t cardid,uint16_t needdisplay,int16_t t,

+ 22 - 19
card_car.cpp

@@ -9,7 +9,6 @@
 #include "select_tool.h"
 #include "websocket/ws_common.h"
 #include "special_area.h"
-#include "websocket/wsClientMgr.h"
 #include "common_tool.h"
 #include "tool_time.h"
 #include "mine_business.h"
@@ -45,6 +44,10 @@ std::shared_ptr<site_area_hover> car::get_site_area()
 {
 	return m_site_area;
 }
+void car::set_area_info(int mapid,double scale,int areaid,uint64_t t,int type)
+{
+	m_area_tool->set_area_info(mapid,scale,areaid,*this,t,type);
+}
 
 void car::do_business(const std::shared_ptr<site>&site,const point &pt,double acc)
 {
@@ -69,10 +72,10 @@ void car::handle_three_rates(const point &pt)
 	m_biz_stat=get_stat();
 	cp.biz_stat = m_biz_stat;
 	cp.x=pt.x;cp.y=pt.y;cp.z=pt.z;	
-	const auto lm = m_area_tool->getLandmark();
+	//const auto lm = m_area_tool->getLandmark();
 //	cp.enter_time = std::get<0>(lm)*1000;
 //	cp.area_id = std::get<3>(lm);
-	cp.map_id = std::get<2>(lm);
+	cp.map_id = m_area_tool->m_mapid;
 	cp.vibration=m_acc;
 	put_three_rates(cp);
 }
@@ -97,24 +100,29 @@ void car::make_package()
 {
 	YA::_CARD_POS_ cp;
 	loc_point pt = getSmoothPoint();
+	//const auto lm = m_area_tool->getLandmark();
+	//cp.enter_area_time = std::get<0>(lm);
+	//cp.rec_time = std::get<1>(lm);
+	//uint32_t map_id = std::get<2>(lm);
+	//uint32_t area_id = std::get<3>(lm);
+	//cp.area_id=area_id;
+	//cp.landmark_id = std::get<4>(lm);
+	//cp.lm_direction = std::get<5>(lm);
+	//cp.landmark_dis=std::get<6>(lm);
+	cp.area_info=m_area_tool->m_area_info;	
+	cp.map_id =m_area_tool->m_mapid;
 
-	const auto lm = m_area_tool->getLandmark();
-	cp.enter_area_time = std::get<0>(lm);
-	cp.rec_time = std::get<1>(lm);
-	uint32_t map_id = std::get<2>(lm);
-	uint32_t area_id = std::get<3>(lm);
-	cp.map_id =map_id;cp.area_id=area_id;
-	cp.landmark_id = std::get<4>(lm);
-	cp.lm_direction = std::get<5>(lm);
-	cp.landmark_dis=std::get<6>(lm);
 	int32_t biz_stat=m_biz_stat;
-	
 	cp.biz_stat=biz_stat;
 	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();
 	upt_card_pos(cp,pt);
-	m_his_location_card->push(pt.m_time,pt,area_id,map_id);
+	if(!cp.area_info.empty())
+	{
+		int areaid = cp.area_info.begin()->first;
+		m_his_location_card->push(pt.m_time,pt,areaid,cp.map_id);
+	}
 	uint64_t _now=tool_time::now_to_ms();
 	uint64_t t=_now>m_timeval?_now-m_timeval:m_timeval-_now;
 	if(t>10*1000)
@@ -144,8 +152,3 @@ loc_point car::getSmoothPoint()
 	return lp;
 }
 
-std::tuple<time_t,time_t,int,int,int,int,double,double> car::getLandmark()
-{
-	return  m_area_tool->getLandmark();
-}
-

+ 1 - 2
card_car.h

@@ -44,14 +44,13 @@ public:
         return m_vehicle_category_id;
     }
 
+	virtual void set_area_info(int mapid,double scale,int areaid,uint64_t t,int type);
 private:
 	void handle_three_rates(const point &pt);
 	void on_timer();
 	//int statbiz(int32_t special_id);
 	void make_package();
 	loc_point getSmoothPoint();
-
-	virtual std::tuple<time_t,time_t,int,int,int,int,double,double> getLandmark();
 };
 
 

+ 0 - 945
card_path.cppbak

@@ -1,945 +0,0 @@
-#include <stdio.h>
-#include <algorithm>
-#include <unordered_map>
-#include <set>
-#include <memory>
-#include <atomic>
-#include <thread>
-#include "zlist.h"
-#include "line.h"
-#include "ant.h"
-
-#include "card_path.h"
-#include "visit.h"
-
-namespace{
-
-static const double PI=3.1416;
-inline bool eq(double a,double b,double e=0.0001)
-{
-	return fabs(a-b)<e;
-}
-
-struct vertex:point
-{
-	float level;
-	int sid0,sid1;
-	vertex()
-		:level(0)
-		,sid0(0)
-		,sid1(0)
-	{}
-
-	vertex(const point&pt,float level_=0,int site_id0=0,int site_id1=0)
-		:point(pt)
-		,level(level_)
-		,sid0(site_id0)
-		,sid1(site_id1)
-	{
-	}
-
-	std::string to_string()const
-	{
-		char buf[128];
-		sprintf(buf,"%.2f,%.3lf,%d,%d,%.2lf",x,y,sid0,sid1,level/PI*180);
-
-		return buf;
-	}
-};
-
-struct vertex_list;
-struct base_path:std::array<int,2>
-{
-	int sid;
-	base_path(int i1=-1,int i2=-1)
-	{
-		at(0)=i1;
-		at(1)=i2;
-	}
-
-	bool operator<(const base_path&o)const
-	{
-		int c=at(0)-o.at(0);
-		if(c!=0)
-			return c<0;
-
-		return at(1)-o.at(1)<0;
-	}
-
-	point  cross(const vertex_list&v_list, const base_path&o)const;
-	bool   contains(const vertex_list&v_list, const point&o, double e)const;
-	double arg(const vertex_list&v)const;
-	int    type(const vertex_list&v)const;
-	line_v as_line(const vertex_list&v)const;
-	int    level(const vertex_list&v)const;
-};
-
-struct vertex_list
-{
-	std::vector<vertex> v;
-
-	std::string to_string()const
-	{
-		std::string ret;
-		ret.reserve(1024);
-
-		char buf[128];
-		for(int i=0,len=v.size();i<len;i++)
-		{
-			sprintf(buf,"vertex:%3d,%s\n",i,v[i].to_string().c_str());
-
-			ret+=buf;
-		}
-
-		return std::move(ret);
-	}
-
-	void log()
-	{
-		printf("%s",to_string().c_str());
-	}
-
-
-	static unsigned hash(const point&p)
-	{
-		return (((((unsigned)p.x)>>2)<<16) + (((unsigned)p.y)>>2));
-	}
-
-	int find(const point&p,double x=1)const
-	{
-		int rc=-1;
-		double t;
-
-		for(int i=0,len=v.size();i<len;i++)
-		{
-			t=p.dist(v[i]);
-			if(t<x)
-			{
-				rc=i;
-				x=t;
-			}
-		}
-
-		return rc;
-	}
-
-	int add(const point&p,float level=0,int sid0=0,int sid1=0)
-	{
-		int i=find(p);
-
-		if(i<0)
-		{
-			v.push_back(vertex(p,level,sid0,sid1));
-			return v.size()-1;
-		}
-
-		vertex&v0=v[i];
-
-		v0.level=std::max(v0.level,level);
-
-		return i;
-	}
-
-	int size()const
-	{
-		return v.size();
-	}
-
-	const vertex&operator[](int i)const
-	{
-		return v[i];
-	}
-
-	vertex&operator[](int i)
-	{
-		return v[i];
-	}
-};
-
-int base_path::level(const vertex_list&v)const
-{
-	const vertex&p0=v[at(0)];
-	const vertex&p1=v[at(1)];
-
-	return p0.level+p1.level;
-}
-
-line_v base_path::as_line(const vertex_list&v)const
-{
-	const vertex&p0=v[at(0)];
-	const vertex&p1=v[at(1)];
-
-	return line_v(p0,p1);
-}
-
-double  base_path::arg(const vertex_list&v)const
-{
-	return as_line(v).arg();
-}
-
-bool  base_path::contains(const vertex_list&v, const point&o, double e)const
-{
-	return as_line(v).contain(o,e);
-}
-
-point  base_path::cross(const vertex_list&v, const base_path&o)const
-{
-	line_v l0=as_line(v);
-	line_v l1=o.as_line(v);
-
-	return l0.crossing(l1);
-}
-
-void log_path(const std::vector<base_path>&path,const vertex_list&v_list)
-{
-	printf("%s\n","----------------------------------------------------------------");
-	for(int i=0,len=path.size();i<len;i++)
-	{
-		double c=path[i].arg(v_list)/PI*180;
-		printf("base_path %.6lf, %03d,(%d,%s),(%d,%s)\n",c,i,path[i][0],v_list[path[i][0]].to_string().c_str(),path[i][1],v_list[path[i][1]].to_string().c_str());
-	}
-}
-struct handle_path :visitor<std::shared_ptr<site>>
-{
-	std::vector<base_path> ret;
-	bool visit(std::shared_ptr<site> sit)
-	{
-		//auto&s=sites[i];
-		const auto &s = *sit;
-
-		if(!s.have_valid_path())
-			continue;
-
-		if(s.path(0).empty()||s.path(1).empty())
-			continue;
-        if(s[0].size()<2)
-            continue;
-        line_v l000 = s[0][0][0];
-        line_v l010 = s[0][1][0];
-        if(l000.is_same(l010))
-        {
-            printf("same....%d",s.m_id);
-			int p0=v.add(point::min(s.path(0),s.path(1)),0,s.m_id);
-			int p1=v.add(point::max(s.path(0),s.path(1)),0,s.m_id);
-
-		    ret.push_back(base_path(p0,p1));
-			ret.back().sid=s.m_id;
-        }
-        else
-        {
-            point px = l000.line::crossing(l010);
-            for(int i=0;i<2;i++)
-            {
-			    int p0=v.add(point::min(px,s.path(i)),0,s.m_id);
-			    int p1=v.add(point::max(px,s.path(i)),0,s.m_id);
-
-		        ret.push_back(base_path(p0,p1));
-			    ret.back().sid=s.m_id;
-            }
-        }
-        for(int i=0;i<2;i++)
-        {
-            if(!s[0][i][1].empty())
-            {
-			    int p0=v.add(point::min(s[0][i][1][0],s[0][i][1][1]),0,s.m_id);
-			    int p1=v.add(point::max(s[0][i][1][0],s[0][i][1][1]),0,s.m_id);
-
-		        ret.push_back(base_path(p0,p1));
-			    ret.back().sid=s.m_id;
-            }
-        }
-		return true;
-	}
-};
-static std::vector<base_path> init_path(const sit_list&sites,vertex_list&v)
-{
-	std::vector<base_path> ret;
-//	for(uint32_t i=0;i<sites.m_list.size();i++)
-//	{
-//		auto&s=sites[i];
-//
-//		if(!s.have_valid_path())
-//			continue;
-//
-//		if(s.path(0).empty()||s.path(1).empty())
-//			continue;
-//        if(s[0].size()<2)
-//            continue;
-//        line_v l000 = s[0][0][0];
-//        line_v l010 = s[0][1][0];
-//        if(l000.is_same(l010))
-//        {
-//            printf("same....%d",s.m_id);
-//			int p0=v.add(point::min(s.path(0),s.path(1)),0,s.m_id);
-//			int p1=v.add(point::max(s.path(0),s.path(1)),0,s.m_id);
-//
-//		    ret.push_back(base_path(p0,p1));
-//			ret.back().sid=s.m_id;
-//        }
-//        else
-//        {
-//            point px = l000.line::crossing(l010);
-//            for(int i=0;i<2;i++)
-//            {
-//			    int p0=v.add(point::min(px,s.path(i)),0,s.m_id);
-//			    int p1=v.add(point::max(px,s.path(i)),0,s.m_id);
-//
-//		        ret.push_back(base_path(p0,p1));
-//			    ret.back().sid=s.m_id;
-//            }
-//        }
-//        for(int i=0;i<2;i++)
-//        {
-//            if(!s[0][i][1].empty())
-//            {
-//			    int p0=v.add(point::min(s[0][i][1][0],s[0][i][1][1]),0,s.m_id);
-//			    int p1=v.add(point::max(s[0][i][1][0],s[0][i][1][1]),0,s.m_id);
-//
-//		        ret.push_back(base_path(p0,p1));
-//			    ret.back().sid=s.m_id;
-//
-//            }
-//        }
-//    }
-
-/*
-
-		if(x.contain(s,2.5))
-		{
-			int p0=v.add(point::min(s.path(0),s.path(1)),0,s.m_id);
-			int p1=v.add(point::max(s.path(0),s.path(1)),0,s.m_id);
-
-		    ret.push_back(base_path(p0,p1));
-			ret.back().sid=s.m_id;
-			continue;
-		}
-
-		for(int j=0;j<2;j++)
-		{
-			if(!s.path(j).empty() && s.dist(s.path(j))<2)
-				continue;
-
-			point p=s.path(j);
-			int p0=v.add(point::min(s,p),0,s.m_id);
-			int p1=v.add(point::max(s,p),0,s.m_id);
-			ret.push_back(base_path(p0,p1));
-			ret.back().sid=s.m_id;
-		}
-	}
-*/
-	log_path(ret,v);
-    printf("++++++++++++++++++++++++++++++++++++++++++++");
-	std::sort(ret.begin(),ret.end());
-	log_path(ret,v);
-    printf("++++++++++++++++++++++++++++++++++++++++++++");
-	ret.erase(std::unique(ret.begin(),ret.end()),ret.end());
-	log_path(ret,v);
-    printf("++++++++++++++++++++++++++++++++++++++++++++");
-
-	std::sort(ret.begin(),ret.end(),[&v](const base_path&p1,const base_path&p2){
-		double arg=p1.arg(v)-p2.arg(v);
-
-		if(fabs(arg)<0.1)
-		{
-			return v[p1[0]]<v[p2[0]];
-		}
-
-		return arg<0;
-	});
-
-	log_path(ret,v);
-
-	for(int i=0,len=ret.size();i<len;i++)
-	{
-		line_v li=ret[i].as_line(v);
-		for(int j=i+1;j<len;j++)
-		{
-			line_v lj=ret[j].as_line(v);
-			if(!lj.is_same(li,2.5))
-				continue;
-
-			line_v ij=lj.projection(li);
-
-			if(ij.empty())
-				continue;
-
-			point p0=point::min(v[ret[j][0]],v[ret[i][0]]);
-			point p1=point::max(v[ret[j][1]],v[ret[i][1]]);
-
-			ret[j][0]=v.add(p0,0);
-			ret[j][1]=v.add(p1,0);
-
-			ret[i][0]=0;
-			ret[i][1]=0;
-			break;
-		}
-	}
-
-	ret.erase(std::remove_if(ret.begin(),ret.end(),[&v](const base_path&p){
-		return p[0]==0||p[1]==0;
-	}),ret.end());
-#ifdef __DEBUG__
-	std::sort(ret.begin(),ret.end(),[&v](const base_path&p1,const base_path&p2){
-		double arg=p1.arg(v)-p2.arg(v);
-
-		if(fabs(arg)<0.1)
-		{
-			return v[p1[0]]<v[p2[0]];
-		}
-
-		return arg<0;
-	});
-
-	log_path(ret,v);
-#endif
-
-	std::vector<std::vector<int>> p0(ret.size());
-	std::vector<base_path> ret2;
-	for(int i=0,len=ret.size();i<len;i++)
-	{
-		p0[i].push_back(ret[i][0]);
-		for(int j=i+1;j<len;j++)
-		{
-			if(i==j) continue;
-
-			point cr=ret[i].cross(v,ret[j]);
-			if(cr.empty())
-				continue;
-
-			double arg=fabs(ret[i].as_line(v).arg()-ret[j].as_line(v).arg());
-			while(arg>PI/2) 
-				arg-=PI/2;
-
-			if(arg/PI*180<5)//相交小于5度,不切分已有路径
-				continue;
-
-			int id=v.add(cr,arg,v[ret[i][0]].sid0,v[ret[j][0]].sid0);
-			p0[i].push_back(id);
-			p0[j].push_back(id);
-		}
-
-		p0[i].push_back(ret[i][1]);
-
-		std::sort(p0[i].begin(),p0[i].end(),[&v](int i0,int i1){
-			return v[i0]<v[i1];
-		});
-
-		auto it=std::unique(p0[i].begin(),p0[i].end());
-		p0[i].erase(it,p0[i].end());
-
-		for(int j=1,cnt=p0[i].size();j<cnt;j++)
-			ret2.push_back(base_path(p0[i][j-1],p0[i][j]));
-	}
-
-	ret2.erase(std::remove_if(ret2.begin(),ret2.end(),[&v](base_path&p){
-		point&p0=v[p[0]];
-		point&p1=v[p[1]];
-
-		return p0.dist(p1)<0.1;
-	}),ret2.end());
-
-	std::sort(ret2.begin(),ret2.end());
-	ret2.erase(std::unique(ret2.begin(),ret2.end()),ret2.end());
-
-/*
-	ret.clear();
-	for(int i=0,len=ret2.size();i<len;i++)
-	{
-		std::vector<line_v> tmp;
-		tmp.push_back(ret2[i].as_line(v));
-		for(int j=0;j<len;j++)
-		{
-			if(i==j) continue;
-
-			if(ret[j].level(v)<ret[i].level(v))
-				continue;
-
-			line l1=ret2[j].as_line(v);
-		}
-	}
-
-	std::sort(ret2.begin(),ret2.end(),[&v](base_path&p1,base_path&p2){
-		return p1.arg(v)<p2.arg(v);
-	});
-	*/
-
-#ifdef __DEBUG__
-	std::sort(ret2.begin(),ret2.end(),[&v](const base_path&p1,const base_path&p2){
-		double arg=p1.arg(v)-p2.arg(v);
-
-		if(fabs(arg)<0.1)
-		{
-			return v[p1[0]]<v[p2[0]];
-		}
-
-		return arg<0;
-	});
-
-	log_path(ret2,v);
-#endif
-
-	return std::move(ret2);
-}
-
-
-
-#if 0
-struct ghash
-{
-	static std::tuple<int,int> decode(unsigned h)
-	{
-		const uint64_t S=0x8000000000000000;
-
-		int x=0,y=0;
-		for(int i=0;i<64;i++)
-		{
-			x<<=1;
-			y<<=1;
-
-			if(h&S) 
-				x|=1;
-			h<<=1;
-
-			if(h&S) 
-				y|=1;
-			h<<=1;
-		}
-
-		return std::make_tuple(x-2147483648,y-2147483648);
-	}
-
-	static uint64_t encode(int64_t x, int64_t y)
-	{
-		return encode_(x+2147483648,y+2147483648);
-	}
-
-public: //test
-	static void test_code(int64_t x,int64_t y)
-	{
-		uint64_t h=ghash::encode(x,y);
-		auto t=ghash::decode(h);
-
-		printf("src x=%X,y=%X hash=%X,check x=%X,y=%X\n",x,y,h,std::get<0>(t),std::get<1>(t));
-	}
-
-	static void test()
-	{
-		for(int i=0;i<10;i++)
-		{
-			test_code((4<<i)-1,(4<<i)-1);
-			test_code((4<<i)-1,(4<<i));
-			test_code((4<<i)-1,(4<<i)-1);
-			test_code((4<<i),(4<<i)-1);
-		}
-	}
-private:
-	static unsigned encode_(unsigned short x, unsigned short y)
-	{
-		const unsigned S=0x8000;
-		unsigned r=0;
-		for(int i=0;i<16;i++)
-		{
-			r<<=2;
-			if(x&S)
-			{
-				r|=(y&S)?3:2;
-			}
-			else
-			{
-				if(y&S) r|=1;
-			}
-
-			x<<=1;
-			y<<=1;
-		}
-		
-		return r;
-	}
-};
-#endif
-
-
-struct geolist
-{
-	std::unordered_map<uint64_t,int> geo2path;
-public:
-
-	static uint64_t encode(double x0,double y0)
-	{
-		uint64_t x=(uint32_t)(x0*10);
-		uint64_t y=(uint32_t)(y0*10);
-
-		return (x<<32)|y;
-	}
-
-	int find(double x,double y)const
-	{
-		uint64_t h=encode(x,y);
-
-		auto it=geo2path.find(h);
-
-		if(it==geo2path.end())
-			return -1;
-
-		return it->second;
-	}
-
-	void add(double x,double y,int id)
-	{
-		uint64_t h=encode(x,y);
-		geo2path.insert(std::make_pair(h,id));
-	}
-
-	int size()
-	{
-		return geo2path.size();
-	}
-
-	void print()
-	{
-		for(auto it=geo2path.begin();it!=geo2path.end();++it)
-		{
-			//std::cout<<it->first<<"\n";
-            printf("%ld\n",it->first);
-		}
-	}
-
-	geolist()
-	{
-	}
-
-	~geolist()
-	{
-	}
-};
-
-struct graph
-{
-	vertex_list v;
-	std::vector<std::vector<int>>  d;   //索引为起始顶点,数组内容为目标点
-	std::vector<std::array<int,2>> l;	//bast_path list
-	geolist geo;
-
-	graph()
-	{}
-
-	void init(const vertex_list&v_,const std::vector<base_path>&bp)
-	{
-		for(auto&p:bp)
-		{
-			int from=v.add(v_[p[0]]);
-			int to=v.add(v_[p[1]]);
-
-			l.push_back({from,to});
-
-			int id=l.size()-1;
-
-			line_v lv(v[from],v[to]);
-
-			printf("line:%s\n",lv.to_string().c_str());
-
-			double cos=lv.cos_k();
-			double sin=lv.sin_k();
-
-			double x,y;
-			for(double r=0,len=lv.length();r<len+0.1;r+=0.05)
-			{
-				x=lv[0].x+r*cos;
-				y=lv[0].y+r*sin;
-
-//				printf("x=%lf,y=%lf\n",x,y);
-
-				for(int i=-1;i<=1;i++)
-				for(int j=-1;j<=1;j++)
-				{
-					geo.add(x+i/10.,y+j/10.,id);
-				}
-			}
-
-			add(from,to);
-		}
-	}
-
-	std::vector<line_v>  find_possible_path(const point&from,double dist) const
-	{
-		std::vector<line_v> ret;
-
-		int start_pt_id=v.find(from,dist);
-		if(start_pt_id==-1)
-			return std::move(ret);
-
-		point start_pt=v[start_pt_id];
-
-		for(uint32_t i=0;i<d[start_pt_id].size();i++)
-		{
-			ret.push_back(line_v(start_pt,v[d[start_pt_id][i]]));
-		}
-
-		return std::move(ret);
-	}
-
-	void add(int from,int to)
-	{
-		if((int)d.size()<=from) d.resize(from+1);
-		if((int)d.size()<=to) d.resize(to+1);
-
-		d[from].push_back(to);
-		d[to].push_back(from);
-	}
-
-	bool find(std::vector<int>&ret,int from,std::array<int,2>&to,std::set<int>&ex,int level)
-	{
-		if(level--<0)
-			return false;
-
-		ret.push_back(from);
-
-		for(int p:d[from]) //在当前路径
-		{
-			if(ex.find(p)!=ex.end()) //找过
-				continue;
-
-			if(p==to[0]||p==to[1])//找到
-				return true;
-//			{
-//				ret.push_back(p);
-//				return true;
-//			}
-		}
-
-		ex.insert(from);
-
-		for(int p:d[from])//在下级路径
-		{
-			if(ex.find(p)!=ex.end())//找过
-				continue;
-			if(find(ret,p,to,ex,level)) //找到
-			{
-				return true;
-			}
-		}
-
-		ret.pop_back();
-		return false;
-	}
-
-	bool is_at_path(const point&pt)const
-	{
-		return geo.find(pt.x,pt.y)>=0;
-	}
-
-	std::vector<point> find(const point&from,const point&to)
-	{
-		int f=geo.find(from.x,from.y);
-		int t=geo.find(to.x,to.y);
-
-		if(f<0 || t<0 || f==t)
-			return {};
-#if 0
-		std::vector<point> rc[2];
-		for(int i=0;i<2;i++)
-		{
-			std::vector<int> ret;
-			std::set<int> ex({l[f][1-i]});
-			if(find(ret,l[f][i],l[t],ex,2))
-			{
-				for(auto id:ret)
-					rc[i].push_back(v[id]);
-			}
-		}
-		if(!rc[0].empty() && (rc[1].empty() || rc[0].size() < rc[1].size()))
-			return std::move(rc[0]);
-		else if(!rc[1].empty())
-			return std::move(rc[1]);
-#endif
-		std::vector<int> ret;
-		int size=v.size();
-		std::vector<double> mat(size+1,-1);
-		std::vector<double> trace(size+1,-1);
-		std::vector<bool> val(size+2,false);
-		mat[l[t][0]]=to.dist(v[l[t][0]]);
-		mat[l[t][1]]=to.dist(v[l[t][1]]);
-		int f0=l[f][0],f1=l[f][1];
-		for(int i=0;i<2;i++)
-		{
-			if(mat[f0]!=-1 && mat[f1]!=-1)
-				break;
-			for(int j=0;j<size;j++)
-				if(mat[j]!=-1)val[j]=true;
-			for(int j=0;j<size;j++)
-			{
-				if(val[j]==false)continue;
-				for(unsigned int k=0;k<d[j].size();k++)
-				{
-					double dist=v[j].dist(v[d[j][k]]);
-					if(mat[d[j][k]]==-1 || mat[j]+dist < mat[d[j][k]])
-					{
-						mat[d[j][k]] = mat[j]+dist;
-						trace[d[j][k]] = j;
-					}
-				}
-			}
-		}
-		mat[f0]=mat[f0]+from.dist(v[l[f][0]]);
-		mat[f1]=mat[f1]+from.dist(v[l[f][1]]);
-		std::vector<point> rc;
-		if(mat[f0]!=-1 && (mat[f1]==-1 || mat[f0] < mat[f1]))
-		{
-			int temp=f0;
-			while(temp!=-1)
-			{
-				rc.push_back(v[temp]);
-				temp=trace[temp];
-			}
-			return std::move(rc);
-		}
-		else if(mat[f1]!=-1)
-		{
-			int temp=f1;
-			while(temp!=-1)
-			{
-				rc.push_back(v[temp]);
-				temp=trace[temp];
-			}
-			return std::move(rc);
-		}
-		return {};
-	}
-};
-
-
-std::atomic<int> g_init_flag(0);
-graph g_graph;
-
-}//namespace
-
-void card_path::init(const sit_list&sites)
-{
-    //Ensure only ont thread can init path.
-	int expect=0;
-	if(g_init_flag.compare_exchange_strong(expect,1))
-	{
-		vertex_list v_list;
-		v_list.add(point(0,0),0,-1);
-		//std::vector<base_path> opath=init_path(sites,v_list);
-		handle_path hp;
-		card_list::instance()->accept(hp);
-
-		g_graph.init(v_list,opath);
-
-		++g_init_flag;
-	}
-    //if != 2 then wait here until init over.
-	while(g_init_flag.load()!=2)
-	{
-		std::this_thread::sleep_for (std::chrono::seconds(1));
-	}
-}
-
-
-card_path&card_path::inst()
-{
-	static card_path path;
-	return path;
-}
-
-std::vector<point> card_path::find_path(const point&from,const point&to)const
-{
-	return g_graph.find(from,to);
-}
-
-bool card_path::is_at_path(const point&pt)const
-{
-	return g_graph.is_at_path(pt);
-}
-
-std::vector<line_v>  card_path::find_possible_path(const point&from,double dist) const
-{
-	return std::move(g_graph.find_possible_path(from,dist));
-}
-
-#ifdef __DEBUG__
-
-void test_at_path(card_path&cp,const point&pt)
-{
-	if(cp.is_at_path(pt))
-		printf("test (%.3lf,%.3lf) is-at-path:true\n",pt.x,pt.y);
-	else
-		printf("test (%.3lf,%.3lf) is-at-path:false\n",pt.x,pt.y);
-}
-
-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);
-}
-
-void test_find_poss_path(const card_path&cp ,const point&from)
-{
-	printf("\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++)
-	{
-		printf("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);
-	}
-}
-
-int main()
-{
-	std::unique_ptr<sit_list> sites(new sit_list());
-	sites->load("data_reader_antenna.txt","path_tof.txt");
-
-	card_path cp;
-
-	cp.init(*sites);
-#if 0
-	{
-		test_at_path(cp,point(4773.104654,-104.0887));
-
-		test_at_path(cp,point(4727,-74.8));
-		test_at_path(cp,point(4727,-75.0));
-		test_at_path(cp,point(4727,-75.2));
-		test_at_path(cp,point(4727,-75.8));
-		test_at_path(cp,point(4727,-90));
-		test_at_path(cp,point(4727,-89.6));
-		test_at_path(cp,point(4727,-89.8));
-		test_at_path(cp,point(4727,-90));
-		test_at_path(cp,point(4727,-90.2));
-		test_at_path(cp,point(4727,-90.4));
-	}
-#endif
-	//test_at_path(cp,point(4726.90,376.85));
-	test_find_path(cp,point(-227.6,174.9),point(-201.3,175.5));
-	test_find_path(cp,point(-227.625219,174.945670),point(-170.085722,176.101574));
-	test_find_path(cp,point(-393.1944,262.5324),point(-366.0754,274.1253));
-	//test_find_path(cp,point(4637.000000,-75),point(4727,135));
-#if 1
-	{
-		test_find_path(cp,point(4637.000000,-75),point(4727,135));
-		test_find_path(cp,point(4637.000000,-75),point(4727,120));
-		test_find_path(cp,point(4700,-75),point(4727,120));
-		test_find_path(cp,point(4725,-75),point(4727,135));
-		test_find_path(cp,point(4727,-89.7),point(6144.3,-523));
-	}
-#endif
-#if 0
-	{
-		test_find_poss_path(cp, point(4727,-89));
-		test_find_poss_path(cp, point(4727,-90));
-
-		test_find_poss_path(cp, point(4724,-75));
-		test_find_poss_path(cp, point(4725,-75));
-		test_find_poss_path(cp, point(4726,-75));
-		test_find_poss_path(cp, point(4727,-75));
-		test_find_poss_path(cp, point(4728,-75));
-		test_find_poss_path(cp, point(4727,-7));
-
-		test_find_poss_path(cp, point(4726.6,33));
-	}
-#endif
-	return 0;
-}
-#endif
-

+ 22 - 18
card_person.cpp

@@ -39,6 +39,10 @@ void person::clear()
 	card_location_base::clear();
 }
 
+void person::set_area_info(int mapid,double scale,int areaid,uint64_t t,int type)
+{
+	m_area_tool->set_area_info(mapid,scale,areaid,*this,t,type);
+}
 void person::site_hover(int sid)
 {
 	if(m_time<=0)
@@ -103,17 +107,13 @@ void person::reset(std::shared_ptr<monkey_person> mp)
 	m_monkeyPerson = mp;
 }
 
-std::tuple<time_t,time_t,int,int,int,int,double,double> person::getLandmark()
-{
-	return  m_area_tool->getLandmark();
-}
 void person::handle_three_rates(const point & pt)
 {
 	card_pos cp;
 	cp.work_line=m_workLine;
 	m_biz_stat=get_stat();
 	cp.biz_stat = m_biz_stat;
-	cp.x=pt.x;cp.y=pt.y;cp.z=pt.z;	
+	cp.x=pt.x;cp.y=pt.y;cp.z=pt.z;
 	//const auto lm = m_area_tool->getLandmark();
 //	cp.enter_time = std::get<0>(lm)*1000;
 //	cp.area_id = std::get<3>(lm);
@@ -132,25 +132,29 @@ void person::on_timer()
 	  mine_business::inst()->fetch_add();
 	uint64_t _time=0;
 	point pt = getSmoothPoint(_time);
-	const auto lm = m_area_tool->getLandmark();
-
-	cp.enter_area_time = std::get<0>(lm)*1000;
-	cp.rec_time = std::get<1>(lm);
-
-	int32_t map_id = std::get<2>(lm);
-	int32_t area_id = std::get<3>(lm);
-	cp.map_id=map_id;cp.area_id=area_id;
-	cp.landmark_id = std::get<4>(lm);
-	cp.lm_direction = std::get<5>(lm);
-	cp.landmark_dis=std::get<6>(lm);
+//	const auto lm = m_area_tool->getLandmark();
+//	cp.enter_area_time = std::get<0>(lm)*1000;
+//	cp.rec_time = std::get<1>(lm);
+//	int32_t map_id = std::get<2>(lm);
+//	int32_t area_id = std::get<3>(lm);
+//	cp.map_id=map_id;cp.area_id=area_id;
+//	cp.landmark_id = std::get<4>(lm);
+//	cp.lm_direction = std::get<5>(lm);
+//	cp.landmark_dis=std::get<6>(lm);
+	cp.area_info=m_area_tool->m_area_info;	
+	cp.map_id =m_area_tool->m_mapid;
 
 	cp.biz_stat = m_biz_stat;
 	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();
-	log_info("on_timer here ...%d,%lld,%.2f,%.2f,%d,%d",m_id,_time,pt.x,pt.y,area_id,map_id);
-	m_his_location_card->push(_time,pt,area_id,map_id);
 	upt_card_pos(cp,pt);
+	log_info("on_timer here ...%d,%lld,%.2f,%.2f,%d,%d--",m_id,_time,pt.x,pt.y,cp.map_id,cp.area_info.size());
+	if(!cp.area_info.empty())
+	{
+		int area_id = cp.area_info.begin()->first;
+		m_his_location_card->push(_time,pt,area_id,cp.map_id);
+	}
 	uint64_t _now=tool_time::now_to_ms();
 	uint64_t t=_now>m_timeval?_now-m_timeval:m_timeval-_now;
 	if(t>10*1000)

+ 19 - 15
card_person.h

@@ -6,32 +6,36 @@
 
 struct person:card_location_base, card_area
 {
-	std::weak_ptr<monkey_person> m_monkeyPerson;
-	int m_workLine=0;
-	time_t m_iris_recognition_timeval = 0;
-	std::string m_stafferName,m_deptName;
-	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);
-	~person();
+    std::weak_ptr<monkey_person> m_monkeyPerson;
+    int m_workLine=0;
+    time_t m_iris_recognition_timeval = 0;
+    std::string m_stafferName,m_deptName;
+    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);
+    ~person();
 
 
     void clear();
-	void reset(std::shared_ptr<monkey_person> mp);
-	void handle_three_rates(const point & pt);
-	void on_timer();
-	void IKSDK_DB(int);
-	point getSmoothPoint(uint64_t& t);
+    void reset(std::shared_ptr<monkey_person> mp);
+    void handle_three_rates(const point & pt);
+    void on_timer();
+    void IKSDK_DB(int);
+    point getSmoothPoint(uint64_t& t);
 
-	virtual void site_hover(int sid);
+    virtual void site_hover(int sid);
     virtual std::shared_ptr<area_hover> get_area_hover();
     virtual std::shared_ptr<mine_tool> get_mine_tool();
     virtual std::shared_ptr<site_area_hover> get_site_area();
-	virtual void do_business(const std::shared_ptr<site>&site,const point &pt,double acc);
-    virtual std::tuple<time_t,time_t,int,int,int,int,double,double> getLandmark();
-	virtual int get_area();
+    virtual void do_business(const std::shared_ptr<site>&site,const point &pt,double acc);
+	virtual void set_area_info(int mapid,double scale,int areaid,uint64_t t,int type);
+    virtual int get_area();
     virtual std::shared_ptr<area_tool> get_area_tool()
     {
         return m_area_tool;
     }
+    virtual int get_workline()
+    {
+        return m_workLine;
+    }
 };
 
 #endif

+ 1 - 0
common_tool.h

@@ -83,6 +83,7 @@ public:
 		uint32_t cid = id & (~(type<<32));
 		return type_id_to_str(type,cid);
 	}
+
 	static uint64_t card_id_to_u64(const std::string & cardid)
 	{
 		return type_id_to_u64(card_id_to_type(cardid),card_id_to_id(cardid));

+ 1 - 1
db/Makefile.am

@@ -3,7 +3,7 @@ AUTOMAKE_OPTIONS=foreign
 noinst_LIBRARIES=libyadb.a
 
 
-CXXFLAGS=-g
+CXXFLAGS=-fPIC -g
 AM_CPPFLAGS=-Wall -pthread -m64 -std=c++11  -I${prefix}/include -I/usr/local/mysql/include -I. -I.. -I../websocket/sio
 AM_LDFLAGS =-Wall -pthread -m64 -std=c++11  -L${prefix}/lib  -L/usr/local/mysql/lib
 

+ 1 - 4
db/db_api/CDBConnPool.cpp

@@ -1,6 +1,5 @@
 #include "CDBConnPool.h"
 #include <boost/bind.hpp>
-#include "log.h"
 
 namespace YADB
 {
@@ -8,7 +7,6 @@ namespace YADB
 
 	CDBConnPool::CDBConnPool()
 	{
-		std_info("create pool...");
 		__pAsyncDBConn = 0;
 	}
 
@@ -47,7 +45,6 @@ namespace YADB
 
 	bool CDBConnPool::Create( const _DB_POOL_SETTING_& Setting, std::string& szError )
 	{
-		std_info(".Create...%s  %s %s %s..%d",Setting.Host.c_str(),Setting.User.c_str(),Setting.DBName.c_str(),Setting.CharSet.c_str(),Setting.PoolSize);
 		return Create(Setting,true,szError);
 	}
 
@@ -57,7 +54,7 @@ namespace YADB
 
 		if ( Setting.PoolSize < DCC_MIN_COUNT )
 		{
-			szError = "CrCrxxxxxxxxxxxxeateeatCreateexxxxxxPoolSize is too small!";
+			szError = "PoolSize is too small!";
 			return false;
 		}
 

+ 0 - 489
db/db_api/mysqltest01.cpp

@@ -1,489 +0,0 @@
-#include <iostream>
-#include <mysql.h>
-#include <stdio.h>
-#include <mysql.h>
-#include <string>
-#include <time.h>
-#include <random>
-#include <thread>
-#include <chrono>
-#include <string.h>
-#include "CDBConnPool.h"
-#include "CDBHelper.h"
-
-void mysql_base_test()
-{
-	MYSQL conn;
-	int res = 0;
-	mysql_init(&conn);
-	if ( mysql_real_connect( &conn, "localhost", "root", "ok123", "yaxt", 0, NULL, CLIENT_FOUND_ROWS ) )
-	{
-		printf("connect success!\n");
-		res = mysql_query( &conn, "insert into test01(id,name,type,BirthDate) values(3,'user',2,'2018-1-2 12:13:14')" );
-		if ( res )
-		{
-			printf("error\n");
-        }
-	    else
-	    {
-		    printf("OK\n");
-	    }
-
-	    mysql_close(&conn);
-    }
-}
-
-void db_test_thread()
-{
-	std::cout << "db_test_thread begin:[" << std::this_thread::get_id() << "]" << std::endl;
-
-	//随机等待
-	std::default_random_engine e;
-	std::uniform_int_distribution<unsigned> u( 1, 9 );
-	int r = u( e );
-	std::this_thread::sleep_for( std::chrono::milliseconds( r * 100 ) );
-
-	std::string Error;
-	//从连接池中获得一个数据库连接
-	YADB::CDBConnect *pConn = sDBConnPool.GetDBConnect( Error );
-	if ( pConn )
-	{
-		//------------------------------------------------------
-		//操作test01表,基础功能测试
-		//------------------------------------------------------
-        //插入
-		char szInsert[1024] = { 0 };
-		//线程ID的hash值实在是没法看,所以用很蠢的办法把线程ID赋给记录ID
-		char szID[30] = { 0 };
-		sprintf( szID, "%d", std::this_thread::get_id() );
-		long long ID = atoll( szID );
-		std::string Name = "Tom.J";
-		int Type = 1;
-		std::string BirthDate = "2017-12-1 09:13:45";
-
-		my_ulonglong ullRes = 0;
-
-		//插入记录
-		sprintf( szInsert, "insert into test01(ID,Name,Type,BirthDate) values (%lld, \'%s\', %d,\'%s\')",	ID, Name.c_str(), Type, BirthDate.c_str() );
-		ullRes = pConn->ExecuteRealSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "插入记录失败:%s!\n", Error.c_str() );
-			Error = pConn->GetLastError();
-		}
-		else
-		{
-			printf( "插入记录成功!\n" );
-		}
-
-		//查询
-		YADB::CDBResultSet *pRes = pConn->ExecuteQuery( "select * from test01", Error );
-		my_ulonglong ResCount = pRes->GetRecordCount( Error );
-		printf( "Record count = %lld\n", ResCount );
-
-		while ( pRes->GetNextRecod( Error ) )
-		{
-			long long ID = 0;
-			pRes->GetField( "ID", ID, Error );
-
-			std::string strName;
-			pRes->GetField( "Name", strName, Error );
-
-			char szName[100] = { 0 };
-			pRes->GetField( "Name", szName, sizeof( szName ), Error );
-
-			int Type = 0;
-			pRes->GetField( "Type", Type, Error );
-
-			std::string Birth;
-			pRes->GetField( "BirthDate", Birth, Error );
-
-			MYSQL_TIME dtBirth;
-			pRes->GetField( "BirthDate", dtBirth, Error );
-
-			printf( "ID=%lld Name=%s Type=%d BirthDate=%s\n", ID, strName.c_str(), Type, Birth.c_str() );
-		}
-
-		//修改
-		memset( szInsert , 0, sizeof( szInsert ) );
-		Name = "李明";
-		BirthDate = "2018-1-1 01:01:01";
-
-		sprintf( szInsert, "update test01 set Name='%s\',BirthDate ='%s\' where ID=%lld", Name.c_str(), BirthDate.c_str(), ID );
-		ullRes = pConn->ExecuteRealSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "更新记录失败:%s!\n", Error.c_str() );
-		}
-		else
-		{
-			printf( "更新记录成功!\n" );
-		}
-
-		//删除
-		memset( szInsert, 0, sizeof( szInsert ) );
-		sprintf( szInsert, "delete from test01 where ID=%lld", ID );
-		ullRes = pConn->ExecuteSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "删除记录失败:%s!\n", Error.c_str() );
-		}
-		else
-		{
-			printf( "删除记录成功!\n" );
-		}
-
-		//用预处理方式出入记录
-		long long LID = 100000000 + ID;
-		char name[20] = "Jarry";
-		long nameLen = strlen( name );
-		int type = 2;
-		MYSQL_TIME ts;
-		ts.year = 2018;
-		ts.month = 1;
-		ts.day = 13;
-		ts.hour = 13;
-		ts.minute = 15;
-		ts.second = 16;
-		ts.second_part = 0;
-		ts.time_type = MYSQL_TIMESTAMP_DATE;
-
-		MYSQL_BIND bindData[4];
-		memset( bindData, 0, sizeof( bindData ) );
-
-		bindData[0].buffer_type = MYSQL_TYPE_LONGLONG;
-		bindData[0].buffer = ( long long * ) &LID;
-		bindData[0].is_null = 0;
-
-		bindData[1].buffer_type = MYSQL_TYPE_STRING;
-		bindData[1].buffer = ( char * ) name;
-		bindData[1].buffer_length = nameLen;
-		bindData[1].is_null = 0;
-		bindData[1].length = ( unsigned long* ) &nameLen;
-
-		bindData[2].buffer_type = MYSQL_TYPE_LONG;
-		bindData[2].buffer = &type;
-		bindData[2].is_null = 0;
-
-		bindData[3].buffer_type = MYSQL_TYPE_DATETIME;
-		bindData[3].buffer = ( char * ) &ts;
-		bindData[3].is_null = 0;
-		bindData[3].length = 0;
-
-		if ( !pConn->stmtExcute( bindData, 0, Error ) )
-		{
-			printf( "执行预处理失败:%s!\n", Error.c_str() );
-		}
-		else
-		{
-			printf( "执行预处理成功!\n" );
-
-			//删除
-			memset( szInsert, 0, sizeof( szInsert ) );
-			sprintf( szInsert, "delete from test01 where ID=%lld", LID );
-			ullRes = pConn->ExecuteSql( szInsert, Error );
-			if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-			{
-				printf( "删除记录失败:%s!\n", Error.c_str() );
-			}
-			else
-			{
-				printf( "删除记录成功!\n" );
-			}
-		}
-
-		//------------------------------------------------------
-		//操作test02表,test02表的ID字段是自增的
-		//------------------------------------------------------
-		//插入记录
-		sprintf( szInsert, "insert into test02(Name,Type,BirthDate) values (\'%s\', %d,\'%s\')",	Name.c_str(), Type, BirthDate.c_str() );
-		ullRes = pConn->ExecuteRealSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "插入记录失败:%s!\n", Error.c_str() );
-			Error = pConn->GetLastError();
-		}
-		else
-		{
-			printf( "插入记录成功!\n" );
-		}
-
-		my_ulonglong InsertedID = pConn->GetLastInsertID( Error );
-		printf( "新插入ID:%lld!\n", InsertedID );
-
-		//删除
-		memset( szInsert, 0, sizeof( szInsert ) );
-		sprintf( szInsert, "delete from test02 where ID=%lld", InsertedID );
-		ullRes = pConn->ExecuteSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "删除记录失败:%s!\n", Error.c_str() );
-		}
-		else
-		{
-			printf( "删除记录成功!\n" );
-		}
-
-		//------------------------------------------------------
-		//操作test01表,事务测试
-		//------------------------------------------------------
-		pConn->AutoCommit( false, Error );//把自动提交设置成false
-		Name = "GuaGua";
-		LID = 900000000 + ID;
-		sprintf( szInsert, "insert into test01(ID,Name,Type,BirthDate) values (%lld, \'%s\', %d,\'%s\')",	LID, Name.c_str(), Type, BirthDate.c_str() );
-		ullRes = pConn->ExecuteRealSql( szInsert, Error );
-		if ( YADB::DB_ERR_EXCUTE_QUERY == ullRes )
-		{
-			printf( "插入记录失败:%s!\n", Error.c_str() );
-			Error = pConn->GetLastError();
-		}
-		else
-		{
-			printf( "插入记录成功!\n" );
-		}
-		//pConn->Commit( Error );//提交
-		pConn->RollBack( Error );//回滚
-		pConn->AutoCommit( true, Error );//把自动提交设置成true
-
-		//归还数据库连接
-		sDBConnPool.GiveBack( pConn );
-
-		//异步执行测试
-		printf( "异步执行测试开始!\n" );
-		char szSQL[1024] = { 0 };
-		//memset( szSQL, 0, sizeof( szSQL ) );
-		sprintf( szSQL, "insert into test01(ID,Name,Type,BirthDate) values (%lld, \'%s\', %d,\'%s\')",	LID, "Mike", 3, "2000-1-1 12:13:14" );
-		sDBConnPool.PushAsync( szSQL );
-
-		memset( szSQL, 0, sizeof( szSQL ) );
-		sprintf( szSQL, "delete from test01 where ID=%lld",	LID );
-		sDBConnPool.PushAsync( szSQL );
-		printf( "异步执行测试结束!\n" );
-	}
-
-	//显示线程信息
-	std::cout << "[" << std::this_thread::get_id() << "]" << " db_test_thread end!\n" ;
-}
-
-//在多线程环境下测试
-void thread_db_class_test()
-{
-	printf( "----------------------------------------------------------------\n" );
-	printf( "                           多线程测试                             \n" );
-	printf( "----------------------------------------------------------------\n" );
-
-	YADB::_DB_POOL_SETTING_ DBSetting;
-	DBSetting.Host     = "localhost";
-	DBSetting.User     = "root";
-	DBSetting.PWD      = "ok123";
-	DBSetting.DBName   = "yaxt";
-	//DBSetting.CharSet  = "GB2312";
-	DBSetting.CharSet  = "utf8";
-	DBSetting.TimeOut  = 5;
-	DBSetting.PoolSize = 10;
-	DBSetting.stmtSQL  = "insert into test01(ID,Name,Type,BirthDate) values (?,?,?,?)";
-
-	std::string Error;
-
-	//创建连接池
-	if ( !sDBConnPool.Create( DBSetting, Error ) )
-	{
-		printf( "线程池创建失败,Err=%s\n", Error.c_str() );
-		return;
-	}
-
-	//多线程测试
-	int ThreadCount = 1;//线程数
-	for ( int i = 0; i < ThreadCount; i++ )
-	{
-		std::thread t( db_test_thread );
-		t.detach();
-	}
-
-	sDBConnPool.Close();
-}
-
-void simple_db_class_test()
-{
-	printf("----------------------------------------------------------------\n");
-	printf("                           简单测试                              \n");
-	printf("----------------------------------------------------------------\n");
-
-	YADB::_DB_POOL_SETTING_ DBSetting;
-	DBSetting.Host = "localhost";
-	DBSetting.User = "root";
-	DBSetting.PWD = "ok123";
-	DBSetting.DBName = "yaxt";
-	DBSetting.CharSet = "utf8";
-	DBSetting.TimeOut = 5;
-	DBSetting.PoolSize = 10;
-	DBSetting.stmtSQL =	"insert into test01(ID,Name,Type,BirthDate) values (?,?,?,?)";
-
-	std::string Error;
-
-	//创建连接池
-	if ( !sDBConnPool.Create( DBSetting, Error ) )
-	{
-		printf("线程池创建失败,Err=%s\n", Error.c_str());
-		return;
-	}
-
-	YADB::CDBHelper DBHelper;
-	YADB::CDBResultSet DBRes;
-	sDBConnPool.Query( "select * from test01", DBRes, Error );
-	int nCount = DBRes.GetRecordCount( Error );
-	if (nCount > 0)
-	{
-		printf( "The record count=%d\n", nCount );
-
-		while ( DBRes.GetNextRecod(Error) )
-		{
-			long long ID = 0;
-			DBRes.GetField( "ID", ID, Error );
-
-			char szName[100] = { 0 };
-			DBRes.GetField( "Name", szName, sizeof( szName ), Error );
-
-			std::string strName;
-			DBRes.GetField( "Name", strName, Error );
-
-			int Type = 0;
-			DBRes.GetField( "Type", Type, Error );
-
-			unsigned int uType = 0;
-			DBRes.GetField( "Type", uType, Error );
-
-			std::string Birth;
-			DBRes.GetField( "BirthDate", Birth, Error );
-
-			float fValue = 0.0;
-			DBRes.GetField( "FloatField", fValue, Error );
-
-			double dValue = 0.0;
-			DBRes.GetField( "DoubleField", dValue, Error );
-
-			bool bValue = false;
-			DBRes.GetField( "BoolField", bValue, Error );
-
-			MYSQL_TIME dtBirth;
-			DBRes.GetField( "DateTimeField", dtBirth, Error );
-			char szBirth[40] = { 0 };
-			DBHelper.DateTime2String( dtBirth, szBirth, sizeof( szBirth ) );
-
-			std::cout << "ID=" << ID << " ";
-			std::cout << "Name=" << szName << " ";
-			std::cout << "Name=" << strName.c_str() << " ";
-			std::cout << "Type=" << Type << " ";
-			std::cout << "Type=" << uType << " ";
-			std::cout << "BirthDate=" << Birth << " ";
-			std::cout << "FloatField=" << fValue << " ";
-			std::cout << "DoubleField=" << dValue << " ";
-			std::cout << "BoolField=" << bValue << " ";
-			std::cout << "DateTimeField=" << szBirth << " ";
-			std::cout << std::endl;
-		}
-	}
-
-	std::string strUptSQL;
-	strUptSQL = "update test01 set DoubleField=1.888888 where ID=1";
-	if ( sDBConnPool.ExecuteSql( strUptSQL.c_str(), Error ) < 0 )
-	{
-		printf( "Err,Failed to ExecuteSql:%s,Err=%s\n", strUptSQL.c_str(), Error.c_str() );
-	}
-}
-
-void stmt_test()
-{
-	printf("----------------------------------------------------------------\n");
-	printf("                          预处理测试                              \n");
-	printf("----------------------------------------------------------------\n");
-
-	YADB::_DB_POOL_SETTING_ DBSetting;
-	DBSetting.Host     = "localhost";
-	DBSetting.User     = "root";
-	DBSetting.PWD      = "ok123";
-	DBSetting.DBName   = "yaxt";
-	DBSetting.CharSet  = "utf8";
-	DBSetting.TimeOut  = 5;
-	DBSetting.PoolSize = 10;
-
-	std::string Error;
-
-	//创建连接池
-	if ( !sDBConnPool.Create( DBSetting, Error ) )
-	{
-		printf( "线程池创建失败,Err=%s\n", Error.c_str() );
-		return;
-	}
-
-	YADB::CDBConnect *pConn = sDBConnPool.GetDBConnect( Error );
-
-	//delete old record
-	pConn->ExecuteSql( "delete from test01 where ID >=10000", Error );
-
-	//insert new record bystmt
-	if ( !pConn->Preparestmt( "insert into test01(ID,Name,Type,BirthDate) values (?,?,?,?)", Error ) )
-	{
-		printf("Invoke Preparestmt失败,Err=%s\n", Error.c_str());
-		return;
-	}
-
-	for ( int i = 10000; i <= 10010000; i++ )
-	{
-		long long LID = i;
-		char name[20] = "Jarry";
-		long nameLen = strlen(name);
-		int type = 2;
-		MYSQL_TIME ts;
-		ts.year = 2018;
-		ts.month = 1;
-		ts.day = 13;
-		ts.hour = 13;
-		ts.minute = 15;
-		ts.second = 16;
-		ts.second_part = 0;
-		ts.time_type = MYSQL_TIMESTAMP_DATE;
-
-		MYSQL_BIND bindData[4];
-		memset(bindData, 0, sizeof(bindData));
-
-		bindData[0].buffer_type = MYSQL_TYPE_LONGLONG;
-		bindData[0].buffer = (long long *) &LID;
-		bindData[0].is_null = 0;
-
-		bindData[1].buffer_type = MYSQL_TYPE_STRING;
-		bindData[1].buffer = (char *) name;
-		bindData[1].buffer_length = nameLen;
-		bindData[1].is_null = 0;
-		bindData[1].length = (unsigned long*) &nameLen;
-
-		bindData[2].buffer_type = MYSQL_TYPE_LONG;
-		bindData[2].buffer = &type;
-		bindData[2].is_null = 0;
-
-		bindData[3].buffer_type = MYSQL_TYPE_DATETIME;
-		bindData[3].buffer = (char *) &ts;
-		bindData[3].is_null = 0;
-		bindData[3].length = 0;
-
-		if ( !pConn->stmtExcute( bindData, 0, Error ) )
-		{
-			printf("执行预处理失败:%s!\n", Error.c_str());
-		}
-	}
-	printf("预处理完成!\n");
-}
-
-int main()
-{
-	//mysql_base_test();
-	simple_db_class_test();
-	//thread_db_class_test();
-	//stmt_test();
-
-	printf( "Press Enter key to continue...\n" );
-	fgetc( stdin );
-
-	printf( "All Done!\n" );
-	return 0;
-}

+ 11 - 6
event.cpp

@@ -200,12 +200,17 @@ std::shared_ptr<ya_event> card_event::on_message(EVENT_TYPE et,uint64_t id,bool
         event_ptr->x = card_ptr->x;
         event_ptr->y = card_ptr->y;
         event_ptr->m_is_display = card_ptr->m_display;
-        const auto lm = card_ptr->getLandmark();
-        event_ptr->m_area_id = std::get<3>(lm);
-        event_ptr->m_map_id = std::get<2>(lm);
-        event_ptr->m_landmarkid = std::get<4>(lm);
-        event_ptr->m_landmarkdist = std::get<6>(lm);
-        event_ptr->m_landmarkdirect = std::get<5>(lm);
+        //const auto lm = card_ptr->getLandmark();
+		auto area_info_map = card_ptr->get_area_tool()->m_area_info;
+		if(!area_info_map.empty())
+		{
+			auto lm = area_info_map.begin()->second;
+			event_ptr->m_area_id = std::get<0>(lm);
+       		event_ptr->m_map_id = card_ptr->get_area_tool()->m_mapid;
+       		event_ptr->m_landmarkid = std::get<1>(lm);
+       		event_ptr->m_landmarkdist = std::get<3>(lm);
+       		event_ptr->m_landmarkdirect = std::get<2>(lm);
+		}
     }
     return event_ptr;
 }

+ 5 - 2
event.h

@@ -34,11 +34,14 @@ enum OBJECT_TYPE
 };
 
 enum EVENT_TYPE{ // 事件类型
+    ET_OVER_COUNT_PERSON = 1,       // 井下人员超员
+    ET_OVER_COUNT_VEHICLE = 2,      // 井下车辆超员
     ET_AREA_OVER_COUNT_PERSON = 3,	// 区域人员超员
     ET_AREA_OVER_COUNT_VEHICLE = 4,	// 区域车辆超员
     ET_READER_ERROR = 6,
     ET_CARD_LOW_POWER_SERIOUS = 12, // 电量极低
-
+    ET_CARD_OVER_TIME_PERSON = 13, // 人员井下超时
+    ET_CARD_OVER_TIME_VEHICLE = 14, // 车辆井下超时
     ET_CARD_AREA_OVER_TIME_PERSON = 15, // 人员区域超时
     ET_CARD_AREA_OVER_TIME_VEHICLE = 16, // 车辆区域超时
 
@@ -49,7 +52,7 @@ enum EVENT_TYPE{ // 事件类型
     ET_CARD_HELP = 24, // 人员呼救
 
     ET_CARD_MOTIONLESS=32,//静止不动告警
-
+    ET_READER_POWER_BY_BATTERY=33,//分站电池:1为电池供电,0为交流电供电,当电池供电需要告警
     ET_VEHICLE_NEAR_GEOFAULT=38,//靠近断层告警
 
     CARD_EVENT_COUNT_MAX

+ 34 - 31
main.cpp

@@ -35,7 +35,8 @@ 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
+        if(!wsClientMgr_init(url_list,send_interval))
+		  exit(0);
         YADB::_DB_POOL_SETTING_ DBSetting;
 
         DBSetting.Host = config.get("db.host","127.0.0.1");
@@ -45,31 +46,25 @@ struct Init_Setting
         DBSetting.CharSet = config.get("db.charset","utf8");
         DBSetting.TimeOut = config.get("db.conn_timeout",5);
         DBSetting.PoolSize = config.get("db.pool_size",30);
-        _mysql_init(DBSetting);
-		std_info("....%s  %s %s %s..%d",DBSetting.Host.c_str(),DBSetting.User.c_str(),DBSetting.DBName.c_str(),DBSetting.CharSet.c_str(),DBSetting.PoolSize);
-		CYaSetting::Init_sys_setting();
+        if(!_mysql_init(DBSetting))
+		  exit(0);
 
+		CYaSetting::Init_sys_setting();
         sit_list::instance()->load_from_db();
-
         card_list::instance()->init_card_from_db();
-
-        std_info("here....");
         area_list::instance()->init_from_db();
-        std_info("here....");
-	
+        //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();
         //auto s = special_area_list::instance()->get_special_id(1013,point(4727,-254),2);
         //std_info("test special_area:%d",s);
-		getchar();
 		mine_business::inst()->load();
-
         card_list::instance()->load_his_card_postion_from_db();
         event_list::instance()->load_his_data_from_db();
-		
         db_para dp;	
         dp.Host=DBSetting.Host;
         dp.User=DBSetting.User;
@@ -90,19 +85,23 @@ struct Init_Setting
 		three_rates::get_instance()->init(ip,dbs);
 		three_rates::get_instance()->start();
 	}
-    void _mysql_init(YADB::_DB_POOL_SETTING_ &dps)
+    bool _mysql_init(YADB::_DB_POOL_SETTING_ &dps)
     {
         std::string szError = "";
-		std_info("....%s  %s %s %s..%d",dps.Host.c_str(),dps.User.c_str(),dps.DBName.c_str(),dps.CharSet.c_str(),dps.PoolSize);
+		bool flag = true;
         //创建连接池
         if ( !sDBConnPool.Create( dps, szError ) )
         {
-            log_error("数据库线程池创建失败,Err=%s\n", szError.c_str());
+            log_error("数据库线程池创建失败,Err=%s", szError.c_str());
+            std_error("数据库线程池创建失败,Err=%s", szError.c_str());
+			flag = false;
         }
+		return flag;
     }
 
-    void wsClientMgr_init(const std::vector<std::string>&uri_list,int32_t st)
+    bool wsClientMgr_init(const std::vector<std::string>&uri_list,int32_t st)
     {
+		bool flag = true;
         std::map<std::string, YA::MSG_HANDLE_FUNC_TYPE> MsgFuncList;
 
         //MsgFuncList.insert( std::make_pair( "req_all_person_on_car", On_req_all_person_on_car ) );
@@ -111,20 +110,24 @@ struct Init_Setting
 
         swsClientMgr.Build( uri_list, MsgFuncList );
 
-        //连接服务器
-        if ( swsClientMgr.connect() != 0 )
-        {
-            log_error("web socket init failed.");
-            std_error("web socket init failed.");
-            return;
-        }
-        //登录
-        swsClientMgr.login();
-        //init thread...
-        YA::_THREAD_CONFIG_ Config;
-        Config.SendInterval = st;
-        swsTimerThrd.Init( Config );
-        swsTimerThrd.Start();
+		do{
+			//连接服务器
+			 if ( swsClientMgr.connect() != 0 )
+       		 {
+       		     log_error("web socket init failed.");
+       		     std_error("websocket 初始化失败....");
+	   		 	 flag =false;
+				 break;
+       		 }
+       		 //登录
+       		 swsClientMgr.login();
+       		 //init thread...
+       		 YA::_THREAD_CONFIG_ Config;
+       		 Config.SendInterval = st;
+       		 swsTimerThrd.Init( Config );
+       		 swsTimerThrd.Start();
+		}while(false);
+		return flag;
     }
 };
 

+ 8 - 0
message.h

@@ -5,6 +5,14 @@
 
 struct zistream;
 
+#define CHAR_LOCATEDATA_TOF_EXTEND 0x843b			// TOF实时定位数据,请求、应答
+#define CHAR_LOCATEDATAHIS_TOF_EXTEND 0x853b		// TOF历史定位数据,请求、应答
+#define CHAR_LOCATEDATA_TDOA_EXTEND 0x863b			// TDOA实时定位数据,请求、应答
+#define CHAR_LOCATEDATAHIS_TDOA_EXTEND 0x873b		// TDOA历史定位数据,请求、应答
+#define CHAR_TDOA_READER_SYNC_TIME 0xa78d			// TDOA分站时间同步
+#define CHAR_ADHOC	0x803b							// 上传自组网数据
+#define CHAR_CTRL_READER_CMD 0x804c					// 向分站发送控制指令,控制分站向上位机发送数据
+
 //	分站传上来的卡定位数据,包括tof,tdoa
 struct message_locinfo
 {

+ 0 - 1
mine.cpp

@@ -1,7 +1,6 @@
 #include "mine.h"
 #include "common_tool.h"
 #include"tool_time.h"
-#include "mine_module/MineCardManager.h"
 
 void mine_tool::on_point(uint32_t card_id, int32_t type, int vehicle_category_id)
 {

+ 3 - 7
mine_business.cpp

@@ -7,15 +7,14 @@
 #include "mine_business.h"
 #include "log.h"
 #include "point.h"
-#include "db/db_api/CDBConnPool.h"
 #include "db/db_api/CDBSingletonDefine.h"
 #include "db/db_tool.h"
 #include "common_tool.h"
 #include "ant.h"
 #include "ya_setting.h"
 #include "card_path.h"
-#include "card_base.h"
 #include "card.h"
+#include "area.h"
 struct card_sensor
 {
 	card_sensor(int32_t wid,const point &p,const std::string &cid)
@@ -226,7 +225,6 @@ mine_business::mine_business()
 	m_staffer_num_ptr.reset(new staffer_num_business);
 	m_reverse_alarm_ptr.reset(new reverse_alarm_business);
 	m_rear_ended_ptr.reset(new rear_end_collision_prevented_business);
-	std_info("------------------------mine_business-------------------------------");
 }
 mine_business* mine_business::inst()
 {
@@ -487,8 +485,7 @@ void rear_end_collision_prevented_business::handle_message()
 		_flag=false;
 		auto c=*it;
 		if (c->empty())continue;
-		auto t=c->getLandmark();
-		double map_scale = std::get<7>(t);
+		double map_scale = c->get_area_tool()->m_scale;
 		for (auto prv_it=std::next(it);prv_it!=m_v.cend();++prv_it)
 		{
 			auto c2=*prv_it;
@@ -537,8 +534,7 @@ void rear_end_collision_prevented_business::handle_message()
 		}
 		auto c=card_list::instance()->get(u1);
 		if(!c) continue;
-		auto lm=c->getLandmark();
-		double map_scale = std::get<7>(lm);
+		double map_scale = c->get_area_tool()->m_scale;
 		double dis = get_absolute_distance(u1,u2)*map_scale;
 		log_info("vehicle_alarm_distance %s %f",vvid.c_str(),dis);
 

+ 0 - 197
mine_module/MineCardManager.cpp

@@ -1,197 +0,0 @@
-#include "MineCardManager.h"
-#include "ya_setting.h"
-#include "common_tool.h"
-#include "mine.h"
-
-CMineCardManager::CMineCardManager()
-{
-    m_minecards = std::make_shared<mine_card_info>();
-}
-
-std::shared_ptr<mine_card_info> CMineCardManager::GetMineCards() 
-{
-    return m_minecards;
-}
-
- /**
-     * @brief 获取事件ID
-     **/
-bool CMineCardManager::Exist(SET_CARDID &list,uint64_t id)
-{
-    if (list.find(id) == list.end())
-    {
-        return false;
-    }
-    return true;
-}
-
-bool CMineCardManager::Exist(SET_CARDID &list,int card_id,int card_type)
-{
-    return Exist(list,tool_other::type_id_to_u64(card_type,card_id));
-}
-/**
- * @brief 人员下井
- * @param card 卡
- **/
-void CMineCardManager::OnPersonDown(std::shared_ptr<card> card,bool bInit/* = false*/)
-{
-    if (nullptr == card)
-    {
-        return ;
-    }
-     //设置卡的状态
-    card->m_is_attendance = EAttendanceState::MineDown;
-   
-    uint64_t key = tool_other::type_id_to_u64(card->m_id,card->m_type);
-    if (this->Exist(m_minecards->m_down_person,key))
-    {
-        return ;
-    }   
-     //移除升井中的状态
-    m_minecards->m_up_person.erase(key);
-    //加入到井下列表中
-    m_minecards->m_down_person.insert(key);
-    if(!bInit)
-    {
-        //井下超员判断
-        this->OnPersonOvercrowdingWarning();
-    }
-}
-    /**
- * @brief 人员升井
- * @param card 卡
- **/
-void CMineCardManager::OnPersonUp(std::shared_ptr<card> card)
-{
-    if (nullptr == card)
-    {
-        return ;
-    }
-    card->m_is_attendance = EAttendanceState::MineUp;
-    uint64_t key = tool_other::type_id_to_u64(card->m_id,card->m_type);
-    if (this->Exist(m_minecards->m_up_person,key))
-    {
-        return ;
-    }   
-     //移除井下列表
-    m_minecards->m_down_person.erase(key);
-    //加入到升井列表中
-    m_minecards->m_up_person.insert(key);
-    
-    int max_person = CYaSetting::m_sys_setting.over_count_person;
-    //井下超员判断--取消
-    if (max_person != 0 && (int)m_minecards->m_down_person.size() < max_person )
-    {
-        //this->CancelEvent(EVENT_TYPE::ET_OVER_COUNT_PERSON,(int)m_minecards->m_down_person.size());
-    }
-    
-}
-
-/**
- * @brief 人员超员警告
-**/
-void CMineCardManager::OnPersonOvercrowdingWarning()
-{
-  //  int max_person = CYaSetting::m_sys_setting.over_count_person;
-  //  //井下超员判断
-  //  if (max_person != 0 && (int)m_minecards->m_down_person.size() > max_person )
-  //  {
-  //      std::string log = "";
-  //      for (uint64_t id : m_minecards->m_down_person)
-  //      {
-  //          std::shared_ptr<card_location_base> pitcard = card_list::instance()->get(id);
-  //          if (nullptr != pitcard)
-  //          {
-  //              log += tool_other::type_id_to_str(pitcard->m_type,pitcard->m_id);
-  //              log += "&";
-  //          }
-  //      }
-  //      //打印日志
-  //      log_info("[lemon mp_card_list_down_person:]:%s",log.c_str());
-
-  //      this->StartEvent(EVENT_TYPE::ET_OVER_COUNT_PERSON,max_person,(int)m_minecards->m_down_person.size());
-  //  }
-}
-
-/**
-* @brief 人员井下超时
-**/
-void CMineCardManager::OnPersonInMineOverTime(int card_id,int card_type)
-{
-  //  std::shared_ptr<card_location_base> card = card_list::instance()->get(tool_other::type_id_to_u64(card_type, card_id));
-  //  if (nullptr == card)
-  //  {
-  //      return ;
-  //  }
-
-  //  std::shared_ptr<mine_tool> mine = card->get_mine_tool();
-  //  if(nullptr == mine )
-  //  {
-  //      return ;
-  //  }
-
-  //  int sec= tool_time::to_ms(std::chrono::system_clock::now()) - mine->get_work_time();
-  //  if (!mine->m_is_overtime && sec > (int)CYaSetting::m_sys_setting.over_time_person)
-  //  {
-  //      //人员超时
-  //      mine->m_is_overtime = true;
-  //      mine->m_overtime = std::chrono::system_clock::now();
-  //  }
-  //  else if (mine->m_is_overtime && sec < (int)CYaSetting::m_sys_setting.over_time_person)
-  //  {
-  //      mine->m_is_overtime = false;
-  //      mine->m_overtime = std::chrono::system_clock::now();
-  //  }
-  //  else
-  //  {
-  //      return ;
-  //  }
-
-  //  // 发送警告
-  //  event_ptr evPtr = event_list::instance()->get_event_card(card->m_id,card->m_type,ET_CARD_OVER_TIME_PERSON);
-  //  if (nullptr == evPtr)
-  //  {
-  //      event_ptr evPtr = event_list::create_event_card(card->m_id, card->m_type, ET_CARD_OVER_TIME_PERSON);
-  //      event_list::instance()->copy_event(card, evPtr);
-  //      event_list::instance()->add(evPtr->get_list_id(), evPtr);
-  //  }
-  //  evPtr->m_limit_value = 0;
-  //  evPtr->m_cur_value = 0;
-  //  evPtr->m_is_display = false;
-  //  evPtr->m_status = mine->m_is_overtime ? ES_START : ES_END;
-  //  evPtr->m_cur_time = std::chrono::system_clock::now();
-
-  //  event_list::save_event(evPtr);
-
-  //  log_info("OnPersonInMineOverTime: send Event=ET_CARD_OVER_TIME_PERSON card=id,eventState=%d",card->m_id,evPtr->m_status);
-}
-    /**
- * @brief 车下井
- * @param card 卡
- **/
-void CMineCardManager::OnVehicleDown(std::shared_ptr<card> card,bool bInit/* = false*/)
-{
-    if (nullptr == card)
-    {
-        return ;
-    }
-}
-    /**
- * @brief 车升井
- * @param card 卡
- **/
-void CMineCardManager::OnVehicleUp(std::shared_ptr<card> card)
-{
-    if (nullptr == card)
-    {
-        return ;
-    }
-}
-
- /**
- * @brief 车辆超员警告
- **/
-void CMineCardManager::OnVehicleOvercrowdingWarning()
-{
-
-}

+ 0 - 90
mine_module/MineCardManager.h

@@ -1,90 +0,0 @@
-/*
-** 井中卡的数据:人员下井 ,人员升进,车下井升井数据
-** 对应的操作,井下人员超时,井下超员等
-*/
-#ifndef __MINECARDMANAGER_H
-#define __MINECARDMANAGER_H
-
-#include "minestruct.h"
-#include "card.h"
-
-//井下警告类型数量
-#define MAX_MINE_EVENT_NUM 3
-
-class CMineCardManager 
-{
-private:
-    CMineCardManager();
-
-private:
-    std::shared_ptr<mine_card_info> m_minecards;
-
-    //井下警告列表ID(下标为实践类型)
-    uint64_t m_evlist[MAX_MINE_EVENT_NUM];
-private:
-    /**
-     * @brief 获取事件ID
-     **/
-    uint64_t GetMineEventId(int evType);
-    /**
-     * @brief 判断是否已存在
-     **/
-    bool Exist(SET_CARDID &list,uint64_t id);
-    bool Exist(SET_CARDID &list,int card_id,int card_type);
-     /**
-     * @brief 创建警告事件
-     * @param evType 警告类型
-     * @param limitVal 限制数据(阀门值)
-     * @param curVal 当前数据
-     **/
-    void StartEvent(int evType,int limitVal,int curVal);
-    /**
-     * @brief 取消警告事件
-     * @param evType 警告类型
-     * @param curVal 当前数据
-     **/
-    void CancelEvent(int evType,int curVal);
-public:
-    //TODO: 获取信息
-    std::shared_ptr<mine_card_info> GetMineCards() ;
-    /**
-     * @brief 人员下井,超员警告
-     * @param card 卡
-     * @param bInit 是否初始化(程序启动加载井下人员)
-     **/
-    void OnPersonDown(std::shared_ptr<card> card,bool bInit = false);
-     /**
-     * @brief 人员升井,取消超员警告
-     * @param card 卡
-     **/
-    void OnPersonUp(std::shared_ptr<card> card);
-     /**
-     * @brief 人员超员警告
-     **/
-    void OnPersonOvercrowdingWarning();
-
-    /**
-     * @brief 人员井下超时
-     **/
-    void OnPersonInMineOverTime(int card_id,int card_type);
-public:
-     /**
-     * @brief 车下井 ,车辆超员警告
-     * @param card 卡
-     * @param bInit 是否初始化(程序启动加载井下车辆)
-     **/
-    void OnVehicleDown(std::shared_ptr<card> card,bool bInit = false);
-     /**
-     * @brief 车升井,车辆超员警告取消
-     * @param card 卡
-     **/
-    void OnVehicleUp(std::shared_ptr<card> card);
-    /**
-     * @brief 车辆超员警告
-     **/
-    void OnVehicleOvercrowdingWarning();
-
-
-};
-
-#endif //__MINECARDMANAGER_H

+ 0 - 16
mine_module/minestruct.h

@@ -1,16 +0,0 @@
-#pragma once
-
-#include <set>
-#include <stdint.h>
-
-// 卡在card_list的掩码由
-typedef std::set<uint64_t> SET_CARDID;
-
-struct mine_card_info
-{
-    SET_CARDID m_down_vehicle; // 井下车辆
-    SET_CARDID m_up_vehicle; // 升井车辆
-	SET_CARDID m_down_person;  // 井下人员
-	SET_CARDID m_up_person; // 升井人员
-	SET_CARDID m_down_adhoc;   //井下自组网卡
-};

+ 80 - 5
module_service/area_business_count_checker.cpp

@@ -1,6 +1,8 @@
 #include "area.h"
 #include "card_base.h"
-
+#include "common_tool.h"
+#include "log.h"
+#include "event.h"
 #include "area_business_count_checker.h"
 /*
 	判断当前区域a中的人数是否超过设定人数,超过后告警
@@ -11,8 +13,42 @@
 void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
 						const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
 {
-
-
+    if (nullptr == a->m_area)
+    {
+        return ;
+    }
+	EVENT_TYPE ev = EVENT_TYPE::ET_OVER_COUNT_PERSON;
+	int limitVal = 0;
+	int curVal = 0;
+	//uint64_t key = tool_other::type_id_to_u64(c->m_id,c->m_type);
+	if (c->is_person())
+	{
+		a->m_area->m_person_count ++ ;
+		limitVal = a->m_area->m_limit_person_count;
+		curVal = a->m_area->m_person_count;
+		ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
+	}
+	else if (c->is_vehicle())
+	{
+		a->m_area->m_vehicle_count ++ ;
+		limitVal = a->m_area->m_limit_vehicle_count;
+		curVal = a->m_area->m_vehicle_count;
+		ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
+	}
+	if(curVal > limitVal)
+	{
+		if (c->is_vehicle())
+		{
+			a->m_area->m_event_vehicle_count = true;
+		}
+		else
+		{
+			a->m_area->m_event_person_count = true;
+		}
+		event_tool::instance()->handle_event(a->m_area->is_mine()? OT_MINE : OT_AREA,ev,a->m_area->id(),limitVal,curVal,true);
+		log_info("area_business_count_checker::on_enter : Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
+		            ,ev,a->m_area->id(),limitVal,curVal);
+	}
 }
 
 void area_business_count_checker::on_hover(const std::shared_ptr<area_hover>&a,
@@ -26,7 +62,46 @@ void area_business_count_checker::on_hover(const std::shared_ptr<area_hover>&a,
 void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
 						const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
-
-
+    if (nullptr == a->m_area)
+    {
+        return ;
+    }
+	int limitVal = 0;
+	int curVal = 0;
+	bool tmp_event = false;
+	EVENT_TYPE ev = EVENT_TYPE::ET_OVER_COUNT_PERSON;
+	if (c->is_person())
+	{
+		a->m_area->m_person_count -- ;
+		limitVal = a->m_area->m_limit_person_count;
+		curVal = a->m_area->m_person_count;
+		tmp_event = a->m_area->m_event_person_count;
+		ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_PERSON : EVENT_TYPE::ET_AREA_OVER_COUNT_PERSON ;
+	}
+	else if (c->is_vehicle())
+	{
+		a->m_area->m_vehicle_count -- ;
+		limitVal = a->m_area->m_limit_vehicle_count;
+		curVal = a->m_area->m_vehicle_count;
+		tmp_event = a->m_area->m_event_vehicle_count;
+		ev = a->m_area->is_mine()?EVENT_TYPE::ET_OVER_COUNT_VEHICLE : EVENT_TYPE::ET_AREA_OVER_COUNT_VEHICLE ;
+	}
+	else{
+		return ;
+	}
+	if(tmp_event && curVal < limitVal)
+	{
+		if (c->is_vehicle())
+		{
+			a->m_area->m_event_vehicle_count = false;
+		}
+		else
+		{
+			a->m_area->m_event_person_count = false;
+		}
+        log_info("area_business_count_checker::on_leave :Cancel Event OVER_COUNT=%d AreaId=%d,Limit=%d,CurNum=%d"
+        ,ev,a->m_area->id(),limitVal,curVal);
+		event_tool::instance()->handle_event(a->m_area->is_mine()? OT_MINE : OT_AREA,ev,a->m_area->id(),limitVal,curVal,false);
+	}
 }
 

+ 7 - 0
module_service/area_business_forbid.cpp

@@ -5,6 +5,7 @@
 #include"common_tool.h"
 #include"area.h"
 #include "card.h"
+#include "module_call.h"
 
 struct forbid_data:business_data
 {
@@ -29,6 +30,9 @@ void area_business_forbid::on_enter(const std::shared_ptr<area_hover>&a,
 
     uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
     event_tool::instance()->handle_event(OT_CARD, ev_type, id, 0, 0, true);
+
+    //呼叫
+    module_call::instance()->system_call_apoint(card_ptr->m_id,card_ptr->m_type);
 }
 
 void area_business_forbid::on_hover(const std::shared_ptr<area_hover>&a,const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
@@ -48,6 +52,9 @@ void area_business_forbid::on_leave(const std::shared_ptr<area_hover>&a,
 
     uint64_t id = tool_other::type_id_to_u64(card_ptr->m_type, card_ptr->m_id);
     event_tool::instance()->handle_event(OT_CARD, ev_type, id, 0, 0, false);
+
+    //取消呼叫
+    module_call::instance()->system_cancel_call_apoint(card_ptr->m_id,card_ptr->m_type);
 }
 
 

+ 61 - 6
module_service/area_business_person_dwell_checker.cpp

@@ -1,7 +1,9 @@
 
 #include "area.h"
 #include "card_base.h"
-
+#include "event.h"
+#include "tool_time.h"
+#include "common_tool.h"
 #include "area_business_person_dwell_checker.h"
 /*
 	判断当前区域a中的人卡停留时间
@@ -9,13 +11,25 @@
 	人员&车辆的代码重用,请自行设计
 */
 
+struct SPersonDwellChecker : business_data
+{
+    uint64_t m_enter_time;
+    point m_enter_point;
+    SPersonDwellChecker()
+    {
+        m_enter_time = 0;
+    }
+};
 
 //进入区域,记录进入时间
 void area_business_person_dwell_checker::on_enter(const std::shared_ptr<area_hover>&a,
 							const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
 {
 
-
+    auto ptr_temp = std::make_shared<SPersonDwellChecker>();
+    ptr_temp->m_enter_point.set(c->x,c->y,c->z);
+    ptr_temp->m_enter_time = tool_time::now_to_ms();
+    ptr = ptr_temp;
 }
 
 
@@ -23,8 +37,33 @@ void area_business_person_dwell_checker::on_enter(const std::shared_ptr<area_hov
 void area_business_person_dwell_checker::on_hover(const std::shared_ptr<area_hover>&a,
 							const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
-
-
+    auto ptr_temp = static_cast<SPersonDwellChecker*>(ptr.get());
+    if(nullptr == ptr_temp)
+    {
+        return ;
+    }
+	double limit_val = 0;
+	double cur_val = (tool_time::now_to_ms() - ptr_temp->m_enter_time)/1000;
+	EVENT_TYPE evType = EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
+	if(c->is_person())
+    {
+	    if (a->m_area->m_limit_person_second > cur_val)
+        {
+	        return;
+        }
+	    evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
+	    limit_val = a->m_area->m_limit_person_second;
+    }
+	else if (c->is_vehicle())
+    {
+	    return ;
+    }
+	else
+    {
+        return;
+    }
+    uint64_t id = tool_other::type_id_to_u64(c->m_type, c->m_id);
+    event_tool::instance()->handle_event(OT_CARD,evType,id,limit_val,cur_val,true);
 }
 
 
@@ -32,7 +71,23 @@ void area_business_person_dwell_checker::on_hover(const std::shared_ptr<area_hov
 void area_business_person_dwell_checker::on_leave(const std::shared_ptr<area_hover>&a,
 							const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
-
-
+    auto ptr_temp = static_cast<SPersonDwellChecker*>(ptr.get());
+    if(nullptr == ptr_temp)
+    {
+        return ;
+    }
+    ptr_temp->m_enter_point.set(c->x,c->y,c->z);
+    ptr_temp->m_enter_time = tool_time::now_to_ms();
+    EVENT_TYPE evType = EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
+    if(c->is_person())
+    {
+        evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
+    }
+    else
+    {
+        return ;
+    }
+    uint64_t id = tool_other::type_id_to_u64(c->m_type, c->m_id);
+    event_tool::instance()->handle_event(OT_CARD,evType,id,0,0,false);
 }
 

+ 17 - 6
module_service/area_business_post_area.cpp

@@ -1,30 +1,41 @@
 
 #include "area.h"
 #include "card_base.h"
-
+#include "tool_time.h"
 #include "area_business_post_area.h"
 /*
 	确定推送人员信息时的区域,每一个明确需要推送的区域,都要推送
 */
-
+struct pos_area:business_data
+{
+	pos_area(uint64_t t)
+	{
+		m_enter_time=t;
+	}
+	uint64_t m_enter_time=0;
+};
 //将推送区域信息加入人员数据
 void area_business_post_area::on_enter(const std::shared_ptr<area_hover>&a,
 						const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
 {
-
+	//uint64_t t=tool_time::now_to_ms();
+	//ptr=std::make_shared<pos_area>(t);
+	c->set_area_info(a->mapid(),a->scale(),a->id(),a->m_enter_time,0);
 }
 
-void area_business_post_area::on_hover(const std::shared_ptr<area_hover>&a, \
+void area_business_post_area::on_hover(const std::shared_ptr<area_hover>&a,
 						const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
-
+	//std::shared_ptr<pos_area> pa = std::dynamic_pointer_cast<pos_area>(ptr);
+	//uint64_t t = pa->m_enter_time;
+	c->set_area_info(0,0,a->id(),a->m_enter_time,1);
 }
 
 //从人员数据中清除区域信息
 void area_business_post_area::on_leave(const std::shared_ptr<area_hover>&a,
 						const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
-
+	c->set_area_info(0,0,a->id(),0,2);
 }
 
 

+ 6 - 6
module_service/area_business_work_rate.cpp

@@ -29,12 +29,12 @@ void area_business_work_rate::on_enter(const std::shared_ptr<area_hover>&area_ho
     auto card = std::make_shared<card_pos>();
     card->id = card_ptr->m_id;
     card->type = card_ptr->m_type;
-    //card->work_line =
-    //card->identifier_id
+    card->work_line = card_ptr->get_workline();
+    card->identifier_id = card_ptr->m_cid;
 
     auto area = std::make_shared<area_data>();
     area->area_id = area_hover_ptr->id();
-    //area->is_work_area = area_hover_ptr->m_area->
+    area->is_work_area = area_hover_ptr->m_area->m_is_work_area;
     area->enter_time = tool_time::now_to_seconds();
 
     three_rates::get_instance()->enter_area(card, area);
@@ -57,12 +57,12 @@ void area_business_work_rate::on_leave(const std::shared_ptr<area_hover>&area_ho
     auto card = std::make_shared<card_pos>();
     card->id = card_ptr->m_id;
     card->type = card_ptr->m_type;
-    //card->work_line =
-    //card->identifier_id
+    card->work_line = card_ptr->get_workline();
+    card->identifier_id = card_ptr->m_cid;
 
     auto area = std::make_shared<area_data>();
     area->area_id = area_hover_ptr->id();
-    //area->is_work_area = area_hover_ptr->m_area->
+    area->is_work_area = area_hover_ptr->m_area->m_is_work_area;
     area->leave_time = tool_time::now_to_seconds();
 
     three_rates::get_instance()->leave_area(card, area);

+ 9 - 6
net-service.cpp

@@ -45,7 +45,7 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 	is>>skip(2)>>cmd;
 	switch(cmd)
 	{
-		case 0x843b://tof
+		case CHAR_LOCATEDATA_TOF_EXTEND://tof-扩展
 			{
 				uint32_t site_id;
 				uint8_t  power;
@@ -72,6 +72,7 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 					m.load(is,false);
 					m.m_time_stamp=tstamp;
 					m.m_site_id=site_id;
+					//t_site->m_site_data = 0;
 
 					t->m_cmd_code=cmd;
 					t->m_hash_id=m.m_card_id;
@@ -81,7 +82,7 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 				}
 			}
 			break;
-		case 0x863b://tdoa
+		case CHAR_LOCATEDATA_TDOA_EXTEND://tdoa
 			{
 				uint32_t site_id;
 				is>>site_id>>skip(12);
@@ -98,7 +99,7 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 				}
 			}
 			break;
-		case 0xa78d://time sync
+		case CHAR_TDOA_READER_SYNC_TIME://time sync
 			{
 				message_tdoasync m;
 				m.load(is);
@@ -106,10 +107,12 @@ void net_service::on_message(std::shared_ptr<client> clt,const char*data,size_t
 			}
 			//site_message::on_sync(this,t.m_param1);
 			break;
-		case 0x853b://tof his
-		case 0x873b://tdoa his
+		case CHAR_LOCATEDATAHIS_TOF_EXTEND://tof his
+		case CHAR_LOCATEDATAHIS_TDOA_EXTEND://tdoa his
 			break;
-		case 0x804c://ctrl site message
+		case CHAR_CTRL_READER_CMD://ctrl site message
+			break;
+		case CHAR_ADHOC://自组网数据
 			break;
 	}
 }

+ 11 - 11
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/zzj/ya-src/ya-serv/missing --run aclocal-1.12
+ACLOCAL = ${SHELL} /home/lemon/resource/ya-serv/missing --run aclocal-1.12
 AMTAR = $${TAR-tar}
-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
+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
 AWK = gawk
 CC = gcc
 CCDEPMODE = depmode=gcc3
@@ -138,7 +138,7 @@ LDFLAGS =
 LIBOBJS = 
 LIBS = 
 LTLIBOBJS = 
-MAKEINFO = ${SHELL} /home/zzj/ya-src/ya-serv/missing --run makeinfo
+MAKEINFO = ${SHELL} /home/lemon/resource/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/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
+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
 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/zzj/ya-src/ya-serv/install-sh
+install_sh = ${SHELL} /home/lemon/resource/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/zzj/ya-src/ya-serv/websocket/../../dist
+prefix = /home/lemon/resource/ya-serv/websocket/../../dist
 program_transform_name = s,x,x,
 psdir = ${docdir}
 sbindir = ${exec_prefix}/sbin

+ 88 - 20
websocket/jsonBuilder.cpp

@@ -42,7 +42,39 @@ namespace YA
 		value.SetString( szCmd, Allocator );
 		root.AddMember( JSON_ROOT_KEY_CMD, value, Allocator );
 	}
-
+#if 0
+        detail=
+[
+            //0 卡号
+            //1 x坐标
+            //2 y坐标
+            //3 入井时间戳
+            //4 接收时间戳
+            //5 工作时长
+            //6 地图编号
+            //7 部门编号
+            //8 状态
+            //9 运行状态
+            //10 业务状态
+            //11 速度
+            //12 area_info_array
+        ]
+		        
+		        area_info_array=[
+				            area_info,
+						    area_info,
+							area_info,
+				            area_info
+							]
+
+				  area_info=[
+              //0 区域编号
+              //1 地标编号
+              //2 地标方向
+			//3 距离地标的距离
+			//4 进入区域时间戳
+		]
+#endif
 	bool jsonBuilder::__BuildDetail( const _CARD_POS_ & CardPos, rapidjson::Document::AllocatorType& Allocator, rapidjson::Value & DetailItem )
 	{
 		rapidjson::Value Array( rapidjson::kArrayType );
@@ -69,8 +101,8 @@ namespace YA
 		Array.PushBack( tmp_object, Allocator );
 
 		//5 最后接收时间戳
-		tmp_object.SetDouble( CardPos.rec_time );
-		Array.PushBack( tmp_object, Allocator );
+		//tmp_object.SetDouble( CardPos.rec_time );
+		//Array.PushBack( tmp_object, Allocator );
 
 		//6 工作时长
 		tmp_object.SetDouble( CardPos.work_time );
@@ -81,8 +113,8 @@ namespace YA
 		Array.PushBack( tmp_object, Allocator );
 
 		//8 区域编号
-		tmp_object.SetInt( CardPos.area_id );
-		Array.PushBack( tmp_object, Allocator );
+		//tmp_object.SetInt( CardPos.area_id );
+		//Array.PushBack( tmp_object, Allocator );
 
 		//9 部门编号
 		tmp_object.SetInt( CardPos.dept_id );
@@ -105,16 +137,16 @@ namespace YA
 		Array.PushBack( tmp_object, Allocator );
 
 		//14 地标编号
-		tmp_object.SetInt( CardPos.landmark_id );
-		Array.PushBack( tmp_object, Allocator );
+		//tmp_object.SetInt( CardPos.landmark_id );
+		//Array.PushBack( tmp_object, Allocator );
 
 		//15 地标方向
-		tmp_object.SetInt( CardPos.lm_direction );
-		Array.PushBack( tmp_object, Allocator );
+		//tmp_object.SetInt( CardPos.lm_direction );
+		//Array.PushBack( tmp_object, Allocator );
 
 		//16 距离地标的距离
-		tmp_object.SetDouble( CardPos.landmark_dis );
-		Array.PushBack( tmp_object, Allocator );
+		//tmp_object.SetDouble( CardPos.landmark_dis );
+		//Array.PushBack( tmp_object, Allocator );
 
 		//17 级别编号
 		tmp_object.SetInt( CardPos.level_id );
@@ -124,6 +156,38 @@ namespace YA
 		tmp_object.SetInt( CardPos.is_on_duty );
 		Array.PushBack( tmp_object, Allocator );
 
+		rapidjson::Value Array_1( rapidjson::kArrayType );
+		for(const auto &a:CardPos.area_info)	
+		{
+			rapidjson::Value _DetailItem;
+			rapidjson::Value Array_2( rapidjson::kArrayType );
+			const auto lm = a.second;
+			//8 区域编号
+			tmp_object.SetInt(std::get<0>(lm));
+			Array_2.PushBack( tmp_object, Allocator );
+
+			//14 地标编号
+			tmp_object.SetInt(std::get<1>(lm));
+			Array_2.PushBack( tmp_object, Allocator );
+
+			//15 地标方向
+			tmp_object.SetInt(std::get<2>(lm));
+			Array_2.PushBack( tmp_object, Allocator );
+
+			//16 距离地标的距离
+			tmp_object.SetDouble(std::get<3>(lm));
+			Array_2.PushBack( tmp_object, Allocator );
+
+			//5 最后接收时间戳
+			tmp_object.SetDouble(std::get<4>(lm));
+			Array_2.PushBack( tmp_object, Allocator );
+
+			_DetailItem=Array_2;
+			Array_1.PushBack(_DetailItem, Allocator);
+		}
+		
+		DetailItem = Array_1;
+		Array.PushBack(DetailItem, Allocator );
 		DetailItem = Array;
 		return true;
 	}
@@ -239,7 +303,8 @@ namespace YA
 		{
 			_STAT_DEPT_ITEM_ sdItem;
 			sdItem.DeptID = CardPos.dept_id;
-			sdItem.Area.insert( std::make_pair( CardPos.area_id, 1 ) );
+			for(const auto &a:CardPos.area_info)
+				sdItem.Area.insert( std::make_pair(a.first, 1 ) );
 			sdItem.Dept.insert( std::make_pair( CardPos.dept_id, 1 ) );
 			sdItem.OcptLvl.insert( std::make_pair( CardPos.level_id, 1 ) );
 			sdItem.Sum = 1;
@@ -257,16 +322,19 @@ namespace YA
 		std::map<int, int>::iterator mit_id_sum;
 
 		//area
-		mit_id_sum = DeptItem.Area.find( CardPos.area_id );
-		if ( mit_id_sum == DeptItem.Area.end() )
+		for(const auto &a:CardPos.area_info)
 		{
-			DeptItem.Area.insert( std::make_pair( CardPos.area_id, 1 ) );
-		}
-		else
-		{
-			mit_id_sum->second++;
+			int areaid = a.first;
+			mit_id_sum = DeptItem.Area.find(areaid);
+			if ( mit_id_sum == DeptItem.Area.end() )
+			{
+				DeptItem.Area.insert( std::make_pair(areaid, 1 ) );
+			}
+			else
+			{
+				mit_id_sum->second++;
+			}
 		}
-
 		//Dept
 		mit_id_sum = DeptItem.Dept.find( CardPos.dept_id );
 		if ( mit_id_sum == DeptItem.Dept.end() )

BIN
websocket/libwebsocket.a


+ 1 - 0
websocket/ws_common.h

@@ -93,6 +93,7 @@ namespace YA
 	*/
 	struct _CARD_POS_ : public _BASE_CARD_
 	{
+		std::map<int,std::tuple<int,int,int,double,uint64_t>> area_info;
 		int landmark_id;//地标编号
 		int lm_direction;//地标方向
 		int landmark_dis;//距离地标的距离

+ 2 - 2
worker.cpp

@@ -106,14 +106,14 @@ struct worker_thread: zloop<task*> ,visitor<std::shared_ptr<card_location_base>>
 			case 0x843b://tof
 			case 0x863b://tdoa
 				log_info("card loc message%04X",t.m_cmd_code);
-
 				card_list::instance()->on_message(this,t.body<message_locinfo>(),false);
+
 				//card_message::on_loc_message(this,t.m_param1);
 			break;
 			case 0x853b://tof his
 			case 0x873b://tdoa his
 				log_info("site history message%04X",t.m_cmd_code);
-				card_list::instance()->on_message(this,t.body<message_locinfo>(),true);
+					card_list::instance()->on_message(this,t.body<message_locinfo>(),true);
 				//site_message::on_sync(this,t.m_param1);
 			break;
 

+ 1 - 0
ya_setting.cpp

@@ -27,6 +27,7 @@ bool CYaSetting::Init_sys_setting()
 			log_info("init_setting:%s,%s",N,val.c_str());\
 			K = atoi(val.c_str())*X;}\
 
+
 			D_GetValue(m_sys_setting.over_count_person,"over_count_person",1,"人员井下超员")
 			D_GetValue(m_sys_setting.over_count_vehicle,"over_count_vehicle",1,"车辆井下超员")
 			D_GetValue(m_sys_setting.over_time_person,"over_time_person",60,"人员井下超时")