Ver Fonte

Merge branch 'master' of http://local.beijingyongan.com:3000/linux-dev/ya-serv

1、代码合并
2、将net-service.cpp中的定时器线程移动到worker.cpp
3、将websocket的close调用修改为sync_close
zzj há 5 anos atrás
pai
commit
0a08d7de57
18 ficheiros alterados com 304 adições e 120 exclusões
  1. 4 3
      Makefile.am
  2. 2 1
      ant.cpp
  3. 6 2
      area.cpp
  4. 22 2
      card.cpp
  5. 1 0
      card_base.cpp
  6. 3 0
      card_base.h
  7. 4 1
      event.cpp
  8. 21 0
      his_location.cpp
  9. 21 18
      his_location.h
  10. 4 4
      main.cpp
  11. 40 8
      module_service/area_business_count_checker.cpp
  12. 4 16
      net-service.cpp
  13. 23 18
      websocket/wsClient.cpp
  14. 3 2
      websocket/wsClient.h
  15. 6 0
      websocket/wsClientMgr.cpp
  16. 116 44
      worker.cpp
  17. 23 0
      worker.h
  18. 1 1
      znet.cpp

+ 4 - 3
Makefile.am

@@ -17,7 +17,7 @@ SRC_MODULE_SERVICE= module_service/area_business_car_attendance.cpp module_servi
 					module_service/module_other_alarm.cpp 
 
 
-SRC_MAIN= ant.cpp area.cpp base64.cpp bindmorecard.cpp mine_business.cpp card_area.cpp card_base.cpp card_car.cpp \
+SRC_MAIN= ant.cpp area.cpp base64.cpp bindmorecard.cpp mine_business.cpp card_area.cpp card_base.cpp card_car.cpp his_location.cpp\
     	  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  special_area.cpp tdoa_sync.cpp visit.cpp \
@@ -26,7 +26,7 @@ SRC_MAIN= ant.cpp area.cpp base64.cpp bindmorecard.cpp mine_business.cpp card_ar
 
 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  -Imodule_service
+AM_CPPFLAGS=-Wall -pthread -m64 -g  -std=c++11 -I${prefix}/include -I/usr/local/mysql/include -Iwebsocket -Iwebsocket/sio -I./db  -Imodule_service
 
 AM_LDFLAGS=-Wall -pthread -m64 -g  -std=c++11  -L${prefix}/lib  -L/usr/local/mysql/lib
 
@@ -48,7 +48,8 @@ test_SOURCES=test.cpp base64.cpp point.cpp
 test_CPPFLAGS=${AM_CPPFLAGS}
 test_LDFLAGS=${AM_LDFLAGS}  -L. -lzlog -lrt
 
-DEFS= 
+#DEFS= -DSITE_AREA
+DEFS=
 EXTRA_DIST=
 
 

+ 2 - 1
ant.cpp

@@ -538,7 +538,8 @@ void sit_list::init_site(int id)
          DBRes.GetField( "x",x, Error );
          DBRes.GetField( "y",y, Error );
 
-		 log_info ("site-position:site=%d,x=%.2lf,y=%.2lf",reader_id,x,y);
+		 log_info ("site_position:site=%d,x=%.2lf,y=%.2lf,%d",reader_id,x,y,area_id);
+
      }
 }
 

+ 6 - 2
area.cpp

@@ -188,7 +188,9 @@ void area::on_leave(const std::shared_ptr<area_hover>&a,const std::shared_ptr<ca
 }
 bool area::in_area(const std::shared_ptr<site>&s,const std::shared_ptr<card_location_base>&c, const point & p,int & sarid)
 {
+#ifdef SITE_AREA
     return false;
+#endif
 	if(m_bound.empty())
 	  return false;
 	int counter = 0;
@@ -538,9 +540,11 @@ std::vector<std::shared_ptr<area>> area_list::get_area(const std::shared_ptr<sit
 			ret.push_back(a.second);
     if(s){
         ret.push_back(s->get_area());
+#ifdef SITE_AREA
         int area_id=s->m_area_id;
-		if(auto area_=area_list::instance()->get(area_id))
-            ret.push_back(area_);
+        if(auto area_=area_list::instance()->get(area_id))
+        ret.push_back(area_);
+#endif
     }
 	//区域覆盖不完全地图,很多车辆人行驶在地图外,如何确认.
 	return std::move(ret);

+ 22 - 2
card.cpp

@@ -16,9 +16,21 @@
 #include "area.h"
 #include "card.h"
 #include "mine_business.h"
+#include "worker.h"
 
 extern config_file config;
 int three_rates_flag=0;
+static void request(uint64_t id,uint32_t hash_id,uint16_t dis)
+{
+     task * t  = task::alloc<message_change_card_display>();
+	 auto&mcb=t->body<message_change_card_display>();
+     t->m_hash_id=hash_id;
+     t->m_cmd_code=0x10002;
+     mcb.m_card_id=id;
+     mcb.m_display=dis;
+     worker::instance()->request(t);
+
+}
 void card_list::init_staffer(const std::string & lszId64)
 {
     std::string strategy = config.get("person.strategy","PS_1");
@@ -53,11 +65,15 @@ void card_list::init_staffer(const std::string & lszId64)
             //group_id
             //occ_id
             tmp_ptr->m_level_id = db_person_ptr->m_level_id;
-            tmp_ptr->m_display = db_person_ptr->m_display;
+    //        tmp_ptr->m_display = db_person_ptr->m_display;
             tmp_ptr->m_workLine = db_person_ptr->m_workLine;
             tmp_ptr->m_stafferName = db_person_ptr->m_stafferName;
             tmp_ptr->m_deptName = db_person_ptr->m_deptName;
             tmp_ptr->m_worktype_id = db_person_ptr->m_worktype_id;
+            if(db_person_ptr->m_display!=tmp_ptr->m_display){
+                request(id64,tmp_ptr->m_id,db_person_ptr->m_display);
+            }
+            
 		}
 		else
 		{
@@ -94,11 +110,15 @@ void card_list::init_vehicle(const std::string & lszId64)
 		if(card_ptr)
 		{
 			car* tmp_ptr= static_cast<car*>(card_ptr.get());
-			tmp_ptr->m_display = static_cast<uint16_t>(db_car->m_display);
+			//tmp_ptr->m_display = static_cast<uint16_t>(db_car->m_display);
 			tmp_ptr->m_deptid = db_car->m_deptid;
 			tmp_ptr->m_vehicle_category_id = db_car->m_vehicle_category_id;
 			tmp_ptr->m_vehicle_type_id = db_car->m_vehicle_type_id;
 			tmp_ptr->m_level_id = db_car->m_level_id;
+            if(db_car->m_display!=tmp_ptr->m_display){
+                request(id64,tmp_ptr->m_id,db_car->m_display);
+            }
+
 		}
 		else
 		{

+ 1 - 0
card_base.cpp

@@ -22,6 +22,7 @@
 extern config_file config;
 card_location_base::card_location_base(const std::string&type,uint32_t id,uint16_t dis,int16_t t,int32_t deptid,int32_t level_id,uint32_t cid)
 	:card(id,dis,t,deptid,level_id,cid)
+    ,m_display_old(dis)
 {
     select_tool_manage::instance()->create_tool(type,m_sel_tool,m_smo_tool);
 	m_his_location_card.reset(new location_card(m_id,m_type,cid));

+ 3 - 0
card_base.h

@@ -65,6 +65,9 @@ struct card:point
 struct card_location_base:card,std::enable_shared_from_this<card_location_base>
 {
 	uint64_t m_timeval=0;
+	uint16_t m_display_old{0};			//1显示0不显示,往前端推送
+    void update_display(){m_display_old=m_display;}
+    bool eq_display(){return m_display_old==m_display;}
     std::uint8_t m_event[CARD_EVENT_COUNT_MAX]{0};
     std::unique_ptr<select_tool> m_sel_tool;
     std::unique_ptr<smooth_tool> m_smo_tool;

+ 4 - 1
event.cpp

@@ -347,7 +347,10 @@ void event_list::load_his_data_from_db()
                 uint64_t c_id= tool_other::card_id_to_u64(ev->m_obj_id);
                 if(auto c=card_list::instance()->get(c_id))
                     c->set_event_flag(ev->m_ev_type);
-            }  
+            } 
+            if(ev->m_ev_type==ET_READER_POWER_BY_BATTERY)
+                if(auto r=sit_list::instance()->get(std::stoi(obj_id)))
+                    r->m_power_ac_down=true;
             
             map.insert(std::make_pair(id, ev));
             log_info("event_list %lld,%lld,%d,%d,%d,%s,%d,%d,%d,%.2f,%.2f,%.2f,%.2f,%s"

+ 21 - 0
his_location.cpp

@@ -0,0 +1,21 @@
+#include "his_location.h"
+
+#include <config_file.h>
+extern config_file config;
+uint32_t  location_card::m_difftime=0;
+int  location_card::m_distance=-1;
+
+location_card::location_card(uint32_t id,uint64_t type,uint32_t objid)
+:m_cardid(id)
+,m_type(type)
+    ,m_objid(objid)
+{
+    init();
+    if(location_card::m_distance==-1)
+    {
+        location_card::m_difftime=config.get("service.difftime",300);
+        location_card::m_distance=config.get("service.distance",30);
+        log_info("his_location_init:%u,%d",m_difftime,m_distance);
+    }
+}
+

+ 21 - 18
his_location.h

@@ -13,13 +13,7 @@
 //路径变换
 struct location_card
 {
-	location_card(uint32_t id,uint64_t type,uint32_t objid)
-		:m_cardid(id)
-		,m_type(type)
-		,m_objid(objid)
-	{
-		init();
-	}
+	location_card(uint32_t id,uint64_t type,uint32_t objid);
 	uint32_t    m_cardid;//卡id
 	uint16_t	m_type;//卡类型
 	uint32_t    m_objid;
@@ -30,6 +24,8 @@ struct location_card
 	point		m_p;//入库后的点
     int         m_direct_index;
     uint64_t    last_timestamp;
+    static uint32_t  m_difftime;//进入盲区得时长限制 时长 
+    static int  m_distance;//进入盲区后,第一个点与之前得距离  像素距离
 	struct mini_data
 	{
 		mini_data(const point &p,uint64_t t)
@@ -227,11 +223,11 @@ struct location_card
 		log_info("his_location[%d,%lu]:%s",m_cardid,m_timestamp,nsql);
 		sDBConnPool.PushAsync(nsql);
 	}
-	void update(const point &p,uint64_t timestamp,int flag=0)
+	void update(const point &p,uint64_t timestamp,int flag=0,int dflag=0)
 	{
 		//std::string tabName=getTabName();
 		char nsql[512]={0};
-		const char * sql = "update his_location set last_time='%s',speed=%.2f where obj_id=%d and begin_time='%s' and last_time is null;";
+		const char * sql = "update his_location set last_time='%s',speed=%.3f,direction=%f,location_flag=%d where obj_id=%d and begin_time='%s' and last_time is null;";
 		double dist = m_p.dist(p);
 		double t	= (timestamp - m_timestamp)/1000;
 		double avge_speed= dist/t;
@@ -240,11 +236,11 @@ struct location_card
 		log_info("his_location_time[%d]:%d[%lu,%lu,%lu]",m_cardid,flag,last_timestamp,timestamp,m_timestamp);
         if(last_timestamp != 0) 
         {
-		    const char * ss = "update his_location set last_time='%s',speed=%.2f where obj_id=%d and begin_time='%s' and last_time = '%s';";
-		    snprintf(nsql,512,ss,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_objid,tool_time::to_str(m_timestamp/1000).c_str(),tool_time::to_str(last_timestamp/1000).c_str());
+		    const char * ss = "update his_location set last_time='%s',speed=%.3f,direction=%f,location_flag=%d where obj_id=%d and begin_time='%s' and last_time = '%s';";
+		    snprintf(nsql,512,ss,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_arg,dflag,m_objid,tool_time::to_str(m_timestamp/1000).c_str(),tool_time::to_str(last_timestamp/1000).c_str());
         }
         else
-		    snprintf(nsql,512,sql,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_objid,tool_time::to_str(m_timestamp/1000).c_str());
+		    snprintf(nsql,512,sql,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_arg,dflag,m_objid,tool_time::to_str(m_timestamp/1000).c_str());
         if(flag==1) last_timestamp=timestamp;
         else last_timestamp=0;
 
@@ -292,16 +288,23 @@ struct location_card
 		uint64_t t=timestamp/1000 - m_timestamp/1000;
         if(t==0||dis<0.1)return true;
 		double avge_speed= dis/t;
-
+        //有拐点  盲区时间差 距离
+        uint64_t difftime=t;int dflag=0;
+        if(!m_d.empty()) difftime=timestamp/1000-(m_d.back().time)/1000;
+        if(difftime>=location_card::m_difftime && dis>location_card::m_distance)
+        {
+		    log_info("his_location[%d]:abnormal_line difftime:%lu,ltime:%u,dis:%.2f,limit_dis:%d",m_cardid,difftime,location_card::m_difftime,dis,location_card::m_distance);
+            dflag=1;
+        }
         for(const point & pp:rc)
         {
-            if(flag){
-			    m_arg=make_arg(pp,m_p);insert();
-            }
-		    log_info("his_location:line_changed_x %d point(%.2f,%.2f)--circle point(%.2f,%.2f),speed:%.2f",m_cardid,m_p.x,m_p.y,pp.x,pp.y,avge_speed);
+            m_arg=make_arg(pp,m_p);
+            if(flag)insert();
+
+		    log_info("his_location[%d]:line_changed_x point(%.2f,%.2f)--circle point(%.2f,%.2f),speed:%.2f",m_cardid,m_p.x,m_p.y,pp.x,pp.y,avge_speed);
             double dist=m_p.dist(pp);uint64_t tt=dist/avge_speed*1000;
             uint64_t etime=m_timestamp+tt;
-			update(pp,etime);set(pp,etime);
+			update(pp,etime,0,dflag);set(pp,etime);
             flag=true;
         }
         return false;

+ 4 - 4
main.cpp

@@ -60,13 +60,12 @@ struct Init_Setting
         log_info("数据库线程池创建成功");
 
         std::string url=config.get("service.websocket_url","ws://127.0.0.1:8086");
-        std::string url_1=config.get("service.websocket_url_bak","");
+        std::string url_2=config.get("service.websocket_url_bak","");
         int32_t send_interval =config.get("service.interval_send_json_postion",1);
-        std_info("json_interval:%d",send_interval);
+        std_info("json_interval:%d,[%s]",send_interval,url.c_str());
         std::vector<std::string> url_list;
         url_list.push_back(url);
-        if(!url_1.empty())url_list.push_back(url_1);
-        log_info("websocket:[%s][%s]",url.c_str(),url_1.empty()?"empty":"not empty");
+        if(!url_2.empty())url_list.push_back(url_2);
         if(!wsClientMgr_init(url_list,send_interval))
         {
             std_info("连接webServer[%s] 失败,采集服务器无法启动!",url.c_str());
@@ -206,3 +205,4 @@ int main(int argc ,char * argv[])
 }
 
 
+

+ 40 - 8
module_service/area_business_count_checker.cpp

@@ -57,7 +57,8 @@ void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
             log_warn("on_enter_area_id:%d,limit_person_count is 0.so should not run area_business_count_checker...",aid);
             return;
         }
-		a->m_area->m_person_count ++ ;
+        if(!ptr)
+		    a->m_area->m_person_count ++;
         if(c->m_display)
 		    a->m_area->m_person_show_count ++ ;
         int pc=a->m_area->m_person_count.load();
@@ -85,7 +86,8 @@ void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
             log_warn("on_enter_area_id:%d,limit_vehicle_count is 0.so should not run area_business_count_checker...",aid);
             return;
         }
-		a->m_area->m_vehicle_count ++ ;
+        if(!ptr)
+		    a->m_area->m_vehicle_count ++ ;
         if(c->m_display)
 		    a->m_area->m_vehicle_show_count ++ ;
         int vc=a->m_area->m_vehicle_count.load();
@@ -104,23 +106,48 @@ void area_business_count_checker::on_enter(const std::shared_ptr<area_hover>&a,
 		    log_info("vehicle_count_enter_show:%d,v_count:%d limit:%d",aid,vc_,limit_val);
         }
 	}
+    c->update_display();
 }
 void area_business_count_checker::on_hover(const std::shared_ptr<area_hover>&a,
                                            const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
 {
+    if(!c->eq_display())
+    {
+        ptr=std::make_shared<business_data>();
+        if(c->m_display==1)
+          on_enter(a,c,ptr);
+        else if(c->m_display==0)
+          on_leave(a,c,ptr);
+        c->update_display();
+        ptr=nullptr;
+    }
 }
 
 //减少计数
 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 ;
+	if (nullptr == a->m_area )return ;
+    int flag=c->m_display;
+    if(!ptr){
+        if(!c->eq_display()){
+            c->update_display(); 
+            //从0 变成1 之前是0 m_show_count没加1 这里不需要减一
+            if(c->m_display==1)flag=0;
+            //从1 变成 0 之前是加1了。 这里需要减去
+            if(c->m_display==0)flag=1;
+        }
+    }
 	if (c->is_person())
 	{
-		a->m_area->m_person_count -- ;
-        if(c->m_display)
+        if(ptr)
 		    a->m_area->m_person_show_count -- ;
+        else{
+		    a->m_area->m_person_count -- ;
+            //if(c->m_display)
+            if(flag)
+		        a->m_area->m_person_show_count -- ;
+        }
         int pc=a->m_area->m_person_count.load();
         int pc_=a->m_area->m_person_show_count.load();
         int limit_val=a->m_area->m_limit_person_count;
@@ -141,9 +168,14 @@ void area_business_count_checker::on_leave(const std::shared_ptr<area_hover>&a,
 	}
 	else if (c->is_vehicle())
 	{
-        a->m_area->m_vehicle_count -- ;
-        if(c->m_display)
+        if(ptr)
 		    a->m_area->m_vehicle_show_count -- ;
+        else{
+            a->m_area->m_vehicle_count -- ;
+            //if(c->m_display)
+            if(flag)
+		        a->m_area->m_vehicle_show_count -- ;
+        }
         int pc=a->m_area->m_vehicle_count.load();
         int pc_=a->m_area->m_vehicle_show_count.load();
         int limit_val=a->m_area->m_limit_vehicle_count;

+ 4 - 16
net-service.cpp

@@ -16,8 +16,8 @@
 #include "net-service.h"
 #include "ant.h"
 #include "card.h"
-#include "mine_business.h"
 #include "crc.h"
+#include "mine_business.h"
 
 net_service::net_service()
 {
@@ -33,20 +33,8 @@ net_service::~net_service()
 
 void net_service::on_timer()
 {
-	static int version = -1;
-	visit_site_status vss;
-	sit_list::instance()->accept(vss);
-	int v = card_list::instance()->version();
-	card_list_visit clv;
-	if(v != version)
-	{
-        version=v;
-        clv._flag=true;
-        mine_business::inst()->clear_vehicle();
-	}
-	card_list::instance()->accept(clv);
-	mine_business::inst()->run_business();
 }
+
 void net_service::on_connect(const std::shared_ptr<client>& clt)
 {
      
@@ -91,8 +79,8 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
 					{
 						char timebuf[64]{0};
 						strftime(timebuf,64,"%F %T",&site_tm);
-						logn_info(1,"分站数据信息:%s net=%s,sid=%d,tm=%s,sct=%d",(power&1)==0?"true":"false",
-																	clt->name().c_str(),site_id,timebuf,site_ct);
+						logn_info(1,"分站数据信息:net=%s,sid=%d,tm=%s,sct=%d,power=%s", clt->name().c_str(), site_id,timebuf,
+										site_ct, site_ptr->m_power_check_enable?((power&1)?"ac":"dc"):"unkown");
 
 						time_t site_time=mktime(&site_tm);
 						double diff=difftime(site_time, site_ptr->last_site_time());

+ 23 - 18
websocket/wsClient.cpp

@@ -45,23 +45,6 @@ namespace YA
 		//MsgFuncList.insert( std::make_pair( "beatheart", &web_connect::_beatheart_callback ) );
 
 		__MsgFuncList.insert(std::make_pair("beatheart",&beatheart));
-
-		__wsclient.set_reconnect_attempts( 0 );
-		using std::placeholders::_1;
-		using std::placeholders::_2;
-		using std::placeholders::_3;
-		using std::placeholders::_4;
-		sio::socket::ptr sock = __wsclient.socket();
-		__recv_ping_time = 0;
-		__connet_time = 0;
-		__wsclient.set_open_listener( std::bind( &wsClient::_on_connected, this ) );
-		__wsclient.set_close_listener( std::bind( &wsClient::_on_close, this, std::placeholders::_1 ) );
-		__wsclient.set_reconnect_listener( std::bind( &wsClient::_on_reconnect, this, std::placeholders::_1, std::placeholders::_2 ) );
-		__wsclient.set_fail_listener( std::bind( &wsClient::_on_fail, this ) );
-		__wsclient.set_socket_open_listener( std::bind( &wsClient::_on_socket_opened, this ) );
-
-		sock->on( JSON_CMD_VALUE_CALL, sio::socket::event_listener_aux( std::bind( &wsClient::_OnCallMessage, this, _1, _2, _3, _4 ) ) );
-		sock->on( "code", sio::socket::event_listener_aux( std::bind( &wsClient::_OnLoginResponse, this, _1, _2, _3, _4 ) ) );
 	}
 
 	std::string wsClient::get_uri()
@@ -77,6 +60,27 @@ namespace YA
 			return -1;
 		}
 
+		{
+			__wsclient.set_reconnect_attempts( 0 );
+
+
+			using std::placeholders::_1;
+			using std::placeholders::_2;
+			using std::placeholders::_3;
+			using std::placeholders::_4;
+			sio::socket::ptr sock = __wsclient.socket();
+			__recv_ping_time = 0;
+			__connet_time = 0;
+			__wsclient.set_open_listener( std::bind( &wsClient::_on_connected, this ) );
+			__wsclient.set_close_listener( std::bind( &wsClient::_on_close, this, std::placeholders::_1 ) );
+			__wsclient.set_reconnect_listener( std::bind( &wsClient::_on_reconnect, this, std::placeholders::_1, std::placeholders::_2 ) );
+			__wsclient.set_fail_listener( std::bind( &wsClient::_on_fail, this ) );
+			__wsclient.set_socket_open_listener( std::bind( &wsClient::_on_socket_opened, this ) );
+
+			sock->on( JSON_CMD_VALUE_CALL, sio::socket::event_listener_aux( std::bind( &wsClient::_OnCallMessage, this, _1, _2, _3, _4 ) ) );
+			sock->on( "code", sio::socket::event_listener_aux( std::bind( &wsClient::_OnLoginResponse, this, _1, _2, _3, _4 ) ) );
+		}
+
 		__wsclient.connect( __uri );
 
 		std::cv_status status = std::cv_status::timeout;
@@ -280,7 +284,8 @@ namespace YA
 
 	void wsClient::close()
 	{
-		__wsclient.close();
+		__wsclient.sync_close();
+//		__wsclient.close();
 	}
 
 	std::string wsClient::GetLastError()

+ 3 - 2
websocket/wsClient.h

@@ -45,6 +45,8 @@ namespace YA
 
 	class wsClient
 	{
+	public:
+		std::map<std::string, MSG_HANDLE_FUNC_TYPE> __MsgFuncList;//消息处理函数列表(key是命令,value是处理函数)
 	private:
 		sio::client __wsclient;//websocket客户端
 		int __ID;//唯一标识
@@ -55,7 +57,6 @@ namespace YA
 		std::condition_variable_any __cond;//条件变量
 		std::mutex __lock;//锁(配合__cond)
 		std::string __LastError;//最新错误
-		std::map<std::string, MSG_HANDLE_FUNC_TYPE> __MsgFuncList;//消息处理函数列表(key是命令,value是处理函数)
 		std::recursive_mutex __send_lock;//发送锁
 		jsonBuilder __jsBuilder;//json构造器
 		std::atomic<unsigned int> __connet_time;		//连接时间
@@ -181,4 +182,4 @@ namespace YA
 		*/
 		int GetPingTime() const ;
 	};
-}
+}

+ 6 - 0
websocket/wsClientMgr.cpp

@@ -170,6 +170,12 @@ namespace YA
 		{
 //			std_info("wsClinet Reconnect : id[%d],url[%s]", ws->GetID(), ws->get_uri().c_str());
 			log_info("wsClinet Reconnect : id[%d],url[%s]", ws->GetID(), ws->get_uri().c_str());
+
+			std::shared_ptr<wsClient> pClient = std::make_shared<wsClient>();
+			pClient->init( ws->GetID(), ws->get_uri(), ws->__MsgFuncList );
+
+			ws=pClient;
+
 			if (ws->connect() == 0)
 			{
 				ws->login();

+ 116 - 44
worker.cpp

@@ -15,6 +15,62 @@
 #include "card.h"
 #include "zloop.h"
 #include "area.h"
+#include "clock.h"
+#include "mine_business.h"
+
+loop_thread::loop_thread ()
+{
+	m_thread.reset(new std::thread(std::bind(&loop_thread::run,this)));
+}
+
+void loop_thread::run()
+{
+	loop_init();
+	log_info("worker_thread start....");
+	while(!check_stop_flag())
+	{
+		try
+		{
+			ev::dynamic_loop::run(0);
+		}
+		catch(const std::exception&e)
+		{
+			log_error("捕获到异常:%s",e.what());
+		}
+		catch(...)
+		{
+			log_error("捕获到未知异常");
+		}
+	}
+	log_info("worker_thread exit....");
+}
+
+void loop_thread::on_async(const std::list<task*>&task_list)
+{
+	for(task*t:task_list)
+	{
+		do_task(*t);
+	}
+}
+void loop_thread::loop_init()
+{
+
+}
+
+void loop_thread::join()
+{
+	m_thread->join();
+}
+
+void loop_thread::stop()
+{
+	async_stop();
+}
+
+loop_thread::~loop_thread()
+{
+}
+
 
 struct hash_thread
 {
@@ -31,17 +87,58 @@ struct hash_thread
 	}
 };
 
-hash_thread g_hash;
+struct timer_worker_thread: loop_thread
+{
+	void do_task_0001()
+	{
+		static int version = -1;
+		zclock clock;
+
+		visit_site_status vss;
+		sit_list::instance()->accept(vss);
+		int v = card_list::instance()->version();
+		card_list_visit clv;
+		if(v != version)
+		{
+			version=v;
+			clv._flag=true;
+			mine_business::inst()->clear_vehicle();
+		}
+		card_list::instance()->accept(clv);
+		mine_business::inst()->run_business();
 
-struct worker_thread: zloop<task*> ,visitor<std::shared_ptr<card_location_base>>
+		log_info("timer_worker_thread use time:%ldus", clock.count_us());
+	}
+
+	void on_timeout()
+	{
+		do_task_0001();
+	}
+
+	std::unique_ptr<ev::timer> card_timer_1s;
+	void loop_init()
+	{
+		card_timer_1s.reset(new ev::timer(*this));
+		card_timer_1s->set<timer_worker_thread,&timer_worker_thread::on_timeout>(this);
+		card_timer_1s->start(1,1);
+	}
+
+	void do_task(task&t)
+	{
+		t.destroy();
+	}
+};
+
+std::unique_ptr<timer_worker_thread> m_timer_worker;
+
+hash_thread g_hash;
+struct worker_thread: loop_thread ,visitor<std::shared_ptr<card_location_base>>
 {
-	std::unique_ptr<std::thread> m_thread;
 	int  m_thread_id=0;
 	int  m_card_list_version=-1;
 	std::vector<std::shared_ptr<card_location_base>> m_local_card_list;
 	worker_thread ()
 	{
-		m_thread.reset(new std::thread(std::bind(&worker_thread::run,this)));
 		m_local_card_list.reserve(128);
 	}
 
@@ -50,37 +147,12 @@ struct worker_thread: zloop<task*> ,visitor<std::shared_ptr<card_location_base>>
 		m_thread_id=id;
 	}
 
-	void run()
+	std::unique_ptr<ev::timer> card_timer_1s;
+	void loop_init()
 	{
-		ev::timer card_timer_1s(*this);
-
-		card_timer_1s.set<worker_thread,&worker_thread::on_timeout>(this);
-		card_timer_1s.start(1,1);
-
-		while(!check_stop_flag())
-		{
-			try
-			{
-				ev::dynamic_loop::run(0);
-			}
-			catch(const std::exception&e)
-			{
-				log_error("捕获到异常:%s",e.what());
-			}
-			catch(...)
-			{
-				log_error("捕获到未知异常");
-			}
-		}
-		log_info("worker_thread exit....");
-	}
-
-	virtual void on_async(const std::list<task*>&task_list)
-	{
-		for(task*t:task_list)
-		{
-			do_task(*t);
-		}
+		card_timer_1s.reset(new ev::timer(*this));
+		card_timer_1s->set<worker_thread,&worker_thread::on_timeout>(this);
+		card_timer_1s->start(1,1);
 	}
 
 	void update_local_cards()
@@ -166,19 +238,18 @@ struct worker_thread: zloop<task*> ,visitor<std::shared_ptr<card_location_base>>
 				{
 					t.destroy();
 				}
+                break;
 			}
+			case 0x10002://区域业务类型修改
+            {
+				auto&mcb=t.body<message_change_card_display>();
+                auto c = card_list::instance()->get(mcb.m_card_id);
+                c->m_display=mcb.m_display;
+				t.destroy();
+                break;
+            }
 		}
 	}
-
-	void join()
-	{
-		m_thread->join();
-	}
-
-	void stop()
-	{
-		async_stop();
-	}
 };
 
 struct worker_impl:worker
@@ -252,6 +323,7 @@ worker*worker::instance()
 		log_info("worker thread count=%d",num_thread);
 		g_hash.set_num_thread(num_thread);
 		_worker_impl.init(num_thread);
+		m_timer_worker.reset(new timer_worker_thread);
 	}
 
 	return &_worker_impl;

+ 23 - 0
worker.h

@@ -2,7 +2,9 @@
 #define _WORKER_HPP_
 #include <ev++.h>
 #include <atomic>
+#include <thread>
 #include <vector>
+#include <zloop.h>
 
 struct task
 {
@@ -48,6 +50,11 @@ struct message_change_business:task
 	std::atomic<int> ref_count;
 	std::vector<area_business*> del_list,add_list,new_list;
 };
+struct message_change_card_display:task
+{
+    uint64_t m_card_id;
+    uint16_t m_display;
+};
 
 struct worker
 {
@@ -65,5 +72,21 @@ struct worker
 	static worker*instance();
 };
 
+struct loop_thread:zloop<task*>
+{
+	std::unique_ptr<std::thread> m_thread;
+
+	loop_thread ();
+	~loop_thread();
+
+	void run();
+	void stop();
+	void join();
+
+	void on_async(const std::list<task*>&task_list);
+	virtual void loop_init();
+	virtual void do_task(task&t)=0;
+};
+
 #endif
 

+ 1 - 1
znet.cpp

@@ -391,7 +391,7 @@ struct sock_client:fd_io,client_ex
 			}
 			else if(rc==-1)
 			{
-				logn_warn(1,"hava a error on socket %d(%s)",m_fd,m_name.c_str());
+				logn_errno(1,"hava a error on socket %d(%s)",m_fd,m_name.c_str());
 			}
 			return -1;
 		}