Browse Source

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

zzj 5 years ago
parent
commit
b96614fc12
13 changed files with 143 additions and 41 deletions
  1. 9 10
      ant.cpp
  2. 8 0
      ant.h
  3. 70 8
      bindmorecard.cpp
  4. 12 1
      bindmorecard.h
  5. 1 1
      cardMgr.cpp
  6. 2 1
      card_base.cpp
  7. 7 0
      card_person.cpp
  8. 3 0
      common.h
  9. 7 12
      event.cpp
  10. 1 0
      message.h
  11. 17 6
      net-service.cpp
  12. 5 2
      znet.cpp
  13. 1 0
      znet.h

+ 9 - 10
ant.cpp

@@ -215,16 +215,15 @@ static void test_find_path(card_path&cp,const point&p1,const point&p2)
 		printf("x=%.3lf,y=%.3lf\n",rc[i].x,rc[i].y);
 }
 
-static void test_find_poss_path(const card_path&cp ,const point&from)
-{
-	log_info("\nfind-poss_path:  from=(%.3lf,%.3lf)\n",from.x,from.y);
-	std::vector<line_v> rc=cp.find_possible_path(from,3);
-	for(uint32_t i=0;i<rc.size();i++)
-	{
-		log_info("poss path from=(%.3lf,%.3lf) to=(%.3lf,%.3lf)\n", rc[i][0].x,rc[i][0].y, rc[i][1].x,rc[i][1].y);
-	}
-}
-
+//static void test_find_poss_path(const card_path&cp ,const point&from)
+//{
+//	log_info("\nfind-poss_path:  from=(%.3lf,%.3lf)\n",from.x,from.y);
+//	std::vector<line_v> rc=cp.find_possible_path(from,3);
+//	for(uint32_t i=0;i<rc.size();i++)
+//	{
+//		log_info("poss path from=(%.3lf,%.3lf) to=(%.3lf,%.3lf)\n", rc[i][0].x,rc[i][0].y, rc[i][1].x,rc[i][1].y);
+//	}
+//}
 void sit_list::read_ant_path(int id)
 {
 	std::string sql = "SELECT reader_id,tof_flag,b_x,b_y,b_z,e_x,e_y,e_z,spacing_ratio FROM dat_reader_path_tof_n";

+ 8 - 0
ant.h

@@ -207,6 +207,14 @@ struct site:point,std::enable_shared_from_this<site>
     {
         return READER_TYPE_ID_UP == m_reader_type_id;
     }
+    bool is_abnormal_site()
+    {
+        bool f=false;
+        double d=ant_dist();
+        if(!is_up_site() &&(d<1e-5 && d>-1e-5) )
+            f=true;
+        return f;
+    }
     void create_area();
     const std::shared_ptr<area> &get_area()const{return m_area;}
     point get_dstp(const point pt) const

+ 70 - 8
bindmorecard.cpp

@@ -1,20 +1,82 @@
 #include "bindmorecard.h"
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/classification.hpp>
 #include <config_file.h>
+#include "db_api/CDBSingletonDefine.h"
+#include "event.h"
+#include "db_tool.h"
+#include "common_tool.h"
+#include "tool_time.h"
 
 extern config_file config;
 
 RemoteCardFactory::RemoteCardFactory(cardMgr * owner)
-		:CardFactory(owner)
+:CardFactory(owner)
 {
-	int remote_hours = config.get("BindMoreCard.timeAlarm_remote",1);
-	m_remote_slot =(int)((remote_hours*60 *60*1000)/TIME_WIN_MILLISEC);
-	std_info("remote:%d",m_remote_slot);
+    int remote_hours = config.get("BindMoreCard.timeAlarm_remote",1);
+    m_remote_slot =(int)((remote_hours*60 *60*1000)/TIME_WIN_MILLISEC);
+    std_info("remote:%d",m_remote_slot);
 }
 
 CloserCardFactory::CloserCardFactory(cardMgr * owner)
-		:CardFactory(owner)
+:CardFactory(owner)
 {
-	int closer_hours = config.get("BindMoreCard.timeAlarm_closer",3);
-	m_closer_slot =(int)((closer_hours*60*60*1000)/TIME_WIN_MILLISEC);
-	std_info("closer:%d",m_closer_slot);
+    int closer_hours = config.get("BindMoreCard.timeAlarm_closer",3);
+    m_closer_slot =(int)((closer_hours*60*60*1000)/TIME_WIN_MILLISEC);
+    std_info("closer:%d",m_closer_slot);
+}
+
+void CardFactory::handle_event(std::map<uint64_t,std::string> m)
+{
+    for(const auto &x:m)
+    {
+        std::vector<std::string> vs;
+        boost::split(vs,x.second,boost::is_any_of(","));
+
+        std::uint64_t c1 =std::stoul( vs[0].substr(0,vs[0].find('&')));
+        std::uint64_t c2 =std::stoul(vs[0].substr(vs[0].find('&')+1));
+        std::string card1=tool_other::get_string_cardid(c1);
+        std::string card2=tool_other::get_string_cardid(c2);
+        std::string sc=card1+'&'+card2;
+        std::string s1=card1.substr(3);
+        std::string s2=card2.substr(3);
+        std::string ss=s1>s2?s1+s2:s2+s1;
+        uint32_t uc = std::stoul(ss);
+        //create event;
+        //limit_value === start_time;
+        //cur_value  ===  end_time;
+        write_data(vs,card1,card2);
+        create_event(uc,std::stof(vs[1]),std::stof(vs[2]),sc);
+    }
+}
+
+void CloserCardFactory::create_event(uint32_t key,double lv,double cv,const std::string &desc)
+{
+    log_info("creeat_event_closer:%s--%u,%f,%f",desc.c_str(),key,lv,cv);
+    event_tool::instance()->handle_event(OT_MORE_CARD,ET_UWB_MORE_CARD,key,lv,cv,true,DT_COMMON,desc);
+}
+void RemoteCardFactory::create_event(uint32_t key,double lv,double cv,const std::string &desc)
+{
+    log_info("creeat_event_remote:%s--%u,%f,%f",desc.c_str(),key,lv,cv);
+	event_tool::instance()->handle_event(OT_MORE_CARD,ET_UWB_MORE_CARD,key,lv,cv,false,DT_COMMON,desc);
+}
+void CloserCardFactory::write_data(std::vector<std::string> &v,const std::string & card1,const std::string &card2)
+{
+    std::stringstream ss;
+    ss<<"REPLACE INTO uwb_more_card_info(uwb_cardone,uwb_cardtwo,uwb_timestamp,uwb_totaldis,uwb_ctindex) VALUES ";
+
+    for (auto it = v.begin()+3;it != v.end()-1;it++)
+    {
+        std::vector<std::string> vt;
+        boost::split(vt,*it,boost::is_any_of("&"));
+
+        time_t time_T = atol(vt[0].c_str());
+        std::string strTime = tool_time::to_str(time_T);
+        ss<<"('"<<card1<<"','"<<card2<<"','"<<strTime<<"',"<<vt[1]<<","<<vt[2]<<"),";
+    }
+    std::string sql = ss.str();
+    sql.pop_back();
+    sql+=";";
+    log_info("LemonHash_sql..%s",sql.c_str());
+    db_tool::PushAsync(sql.c_str());
 }

+ 12 - 1
bindmorecard.h

@@ -107,11 +107,14 @@ struct TcardInterface
 					stp = check(std::get<0>(tp),std::get<1>(tp));
 					skip(1);
 				}
-                log_info("grow(%d)%lu&%lu,%d,%lu",SIZE,m_cardid.first,m_cardid.second,m_arr.size(),tsp);
 				grow(tsp);
 				tmp_tsp_min = back(0).m_timestamp;
 				tmp_tsp_max = back(0).m_timestamp + TIME_WIN_MILLISEC;
 			}
+            else
+            {
+                tsp=tmp_tsp_min;
+            }
 
 		}while(1);
 		return stp;
@@ -241,6 +244,7 @@ struct CardFactory
 
 			}
 		}
+        handle_event(tmpvec);
 		return std::move(tmpvec);
 	}
 
@@ -272,6 +276,7 @@ struct CardFactory
 				tempvec.insert(std::make_pair(id,std::get<1>(sp)));
 			}
 		}
+        handle_event(tempvec);
 		return std::move(tempvec);
 	}
 	void erase(uint64_t id)
@@ -302,6 +307,9 @@ struct CardFactory
 	virtual void backup (uint64_t cid1,uint64_t cid2){}
 	virtual void reset (uint64_t cid){}
 	virtual std::tuple<bool,std::string> checkLast(std::shared_ptr<TcardInterface> &ti)=0;
+    void handle_event(std::map<uint64_t,std::string> m);
+    virtual void create_event(uint32_t key,double lv,double cv,const std::string &desc)=0;
+    virtual void write_data(std::vector<std::string> &v,const std::string & card1,const std::string &card2){}
 	virtual ~CardFactory(){}
 	public:
 	std::unordered_map<uint64_t,std::shared_ptr<TcardInterface>>     m_map;
@@ -356,6 +364,7 @@ struct CloserCardFactory : CardFactory
 		vec = handlecard(rc,cid);
 		return std::move(vec);
 	}
+    virtual void write_data(std::vector<std::string> &v,const std::string & card1,const std::string &card2);
 	virtual void backup (uint64_t cid1,uint64_t cid2)
 	{
 		m_owner->addVertex(cid1,cid2);
@@ -369,6 +378,7 @@ struct CloserCardFactory : CardFactory
 	{
 		return ti->checkLast();
 	}
+    virtual void create_event(uint32_t key,double lv,double cv,const std::string &desc);
 };
 
 struct RemoteCardFactory : CardFactory
@@ -409,5 +419,6 @@ struct RemoteCardFactory : CardFactory
 	{
 		return std::make_tuple(false,std::string(""));
 	}
+    virtual void create_event(uint32_t key,double lv,double cv,const std::string &desc);
 };
 #endif

+ 1 - 1
cardMgr.cpp

@@ -39,6 +39,7 @@ void cardMgr::clear(uint64_t cardid)
 	auto v = m_cgraph.getcard(cardid);
 	for(const auto & cid:v)
 	{
+        log_info("LemonHash_up_mine:%lu&%lu",cardid,cid);
 		uint64_t id = MyHash{}(cardid,cid);
 		erase(id);
 		m_cgraph.remove_edge(cardid,cid);
@@ -70,7 +71,6 @@ void cardMgr::handleMessage(const Msg &m)
 		{
 			for(const auto x:map2)
 				log_info("---LemonHash_call_event--[%s]%s",i?"Remote":"Closer",x.second.c_str());
-			//m_owner->uwb_alarm(map2,i,c);
 		}
 		if (!rc.empty())
 		{

+ 2 - 1
card_base.cpp

@@ -20,7 +20,7 @@
 #include "area.h"
 #include "cardMgr.h"
 extern config_file config;
-
+const static int three_rates_flag=config.get("service.three_rates_flag",0);
 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)
 {
@@ -216,6 +216,7 @@ void  card_location_base::clear()
 }
 void card_location_base::put_three_rates(card_pos & cp)
 {
+    if(!three_rates_flag)return;
 	cp.rec_time=m_time;cp.type=m_type;cp.id=m_id;
 	cp.identifier_id=m_cid;cp.running_stat=m_stat;cp.final_v=m_speed;
 	cp.dpt_id = m_deptid;

+ 7 - 0
card_person.cpp

@@ -16,6 +16,7 @@
 #include"db/db_tool.h"
 #include "forbid_staff_down_mine.h"
 #include <config_file.h>
+#include "cardMgr.h"
 
 extern config_file config;
 int person::m_limit_detained_time=config.get("service.detained_time",10);
@@ -40,7 +41,9 @@ void person::clear()
 	//m_mine_tool.reset(new mine_tool);
     m_mine_tool->clear();
     m_area_tool->clear();
+    //清除部分信息
 	card_location_base::clear();
+    //清除告警信息
     uint64_t id = tool_other::type_id_to_u64(m_type,m_id);
     for(std::uint8_t i=0;i<CARD_EVENT_COUNT_MAX;i++)
     {
@@ -51,6 +54,10 @@ void person::clear()
             m_event[i]=0;
         }
     }
+    //清除一人多卡功能内存中的人卡相关数据,
+	Msg m;
+	m.cmd=CMD_CLEAR;m.cardid=m_type<<32|m_id;
+	cardMgr::instance()->tryPut(m);
 }
 
 void person::set_area_info(int mapid,double scale,int areaid,uint64_t t,int type)

+ 3 - 0
common.h

@@ -95,6 +95,8 @@ enum OBJECT_TYPE
     OT_DEVICE_READER = 4,
     ///标识卡,包括人员、车辆、自组网等
     OT_CARD = 9,
+    //一人多卡
+    OT_MORE_CARD=11
 };
 enum EVENT_DIS_TYPE
 {
@@ -119,6 +121,7 @@ enum EVENT_TYPE{ // 事件类型
     ET_CARD_AREA_OVER_SPEED = 22, // 车辆区域超速
     ET_CARD_HELP = 24, // 人员呼救
     ET_CARD_DRIVINGFACE_WARNING_AREA = 28, //掘进面靠近预警区域告警
+    ET_UWB_MORE_CARD=31,
     ET_CARD_MOTIONLESS=32,//静止不动告警
     ET_READER_POWER_BY_BATTERY=33,//分站电池:1为电池供电,0为交流电供电,当电池供电需要告警
 	ET_VEHICLE_REAR_END=36,//车辆防追尾告警

+ 7 - 12
event.cpp

@@ -33,7 +33,7 @@ struct Event
 struct mine_event:Event
 {
     mine_event()
-        :Event(OT_MINE)
+        :Event(OT_MORE_CARD)
     {}
     virtual std::shared_ptr<ya_event> on_message(EVENT_TYPE et,uint64_t id,bool f);
 };
@@ -66,7 +66,7 @@ event_tool * event_tool::instance()
 }
 void event_tool::make_event_object()
 {
-    m_map[OT_MINE] = std::make_shared<mine_event>();
+    m_map[OT_MORE_CARD] = std::make_shared<mine_event>();
     m_map[OT_AREA] = std::make_shared<area_event>();
     m_map[OT_DEVICE_READER] = std::make_shared<device_reader_event>();
     m_map[OT_CARD] = std::make_shared<card_event>();
@@ -115,6 +115,11 @@ void Event::handle_alarm_event(EVENT_TYPE et,uint64_t id,double limit_value,doub
                 ev_ptr->m_desc=desc;
                 ev_ptr->m_id=eid;
                 ev_ptr->m_dis_type=edt;
+                if(et==ET_UWB_MORE_CARD)
+                {
+                    ev_ptr->m_obj_id=desc;
+                    ev_ptr->m_cur_time=std::chrono::system_clock::time_point(std::chrono::milliseconds((time_t)limit_value * 1000));
+                }
                 //保存告警信息
                 event_list::instance()->add(eid,ev_ptr);
             }
@@ -144,17 +149,7 @@ std::shared_ptr<ya_event> mine_event::on_message(EVENT_TYPE et,uint64_t id,bool
 {
     std::shared_ptr<ya_event> event_ptr=nullptr;
     if(f)
-    {
-        auto area_ptr = area_list::instance()->get(id);
-        if(!area_ptr)
-        {
-            log_error("create_event .can not find area ..%d",id);
-            return event_ptr;
-        }
         event_ptr=create_event(std::to_string(id), et);
-        event_ptr->m_area_id = id;
-        event_ptr->m_map_id = area_ptr->mapid();
-    }
     return event_ptr;
 }
 

+ 1 - 0
message.h

@@ -14,6 +14,7 @@ struct zistream;
 #define CHAR_TDOA_READER_SYNC_TIME 0xa78d			// TDOA分站时间同步
 #define CHAR_ADHOC	0x803b							// 上传自组网数据
 #define CHAR_CTRL_READER_CMD 0x804c					// 向分站发送控制指令,控制分站向上位机发送数据
+#define CHAR_VIRTUAL_DATA_PUSH_CMD 0x699a			//虚拟数据推送
 
 //	分站传上来的卡定位数据,包括tof,tdoa
 struct message_locinfo:task

+ 17 - 6
net-service.cpp

@@ -72,7 +72,11 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
 						logn_error(1,"在全局分站列表中找不到分站:%d", site_id);
 						break;
 					}
-
+                    if(site_ptr->is_abnormal_site())
+                    {
+						logn_error(1,"分站[%d]天线异常", site_id);
+                        break;
+                    }
 					if(!site_ptr->check_timestamp(data+10))
 					{
 						logn_error(1,"分站数据时间戳错误:%s",clt->name().c_str());
@@ -85,10 +89,11 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
 						sprintf(timebuf,"%d-%d %d:%d:%d",*(t+4)+1,*(t+3),*(t+2),*(t+1),*(t+0));
 						logn_info(1,"分站数据信息:%s net=%s,sid=%d,tm=%s,sct=%d",(power&1)==0?"true":"false",clt->name().c_str(),site_id,timebuf,t[-2]*256+t[-1]);
 					}
-
-					site_ptr->set_client(clt);
-					site_ptr->on_power_status((power&1)==0);
-                    //clt->set_site_id(site_id);
+                    if(clt->type()!=2){
+					    site_ptr->set_client(clt);
+					    site_ptr->on_power_status((power&1)==0);
+                        //clt->set_site_id(site_id);
+                    }
 
 					struct timeval tv;
 					gettimeofday(&tv,NULL);
@@ -108,7 +113,7 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
 						t->m_cmd_code=cmd;
 						t->m_hash_id=m.m_card_id;
 						if(m.m_card_type==5)
-						mine_business::inst()->make_reverse_condition(m.m_card_type,m.m_card_id,m.m_ant_id,m.m_card_ct,m.m_tof,m.m_site_id);
+						    mine_business::inst()->make_reverse_condition(m.m_card_type,m.m_card_id,m.m_ant_id,m.m_card_ct,m.m_tof,m.m_site_id);
 						m_loc_worker->request(t);
 					}
 				}
@@ -142,6 +147,12 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
 			case CHAR_LOCATEDATAHIS_TDOA_EXTEND://tdoa his
 			case CHAR_CTRL_READER_CMD://ctrl site message
 			case CHAR_ADHOC://自组网数据
+            case CHAR_VIRTUAL_DATA_PUSH_CMD://虚拟数据链接
+                {
+                    logn_info(1,"接收到虚拟链接:%s",clt->name().c_str());
+                    clt->set(2);
+                }
+                break;
 			default:
 				message_handled=false;
 		}

+ 5 - 2
znet.cpp

@@ -267,7 +267,10 @@ struct sock_client:fd_io,client_ex
 	{
 		return m_type;
 	}
-
+    void set(int t)
+    {
+        m_type=t;
+    }
 	void close()
 	{
 		m_close_flag.store(true);
@@ -414,7 +417,7 @@ struct sock_client:fd_io,client_ex
 					return -1;
 				}
 
-				if(msg_len<=8)
+				if(msg_len<=6)
 				{
 					logn_error(1,"package too small:%d,close socket. site=%s.",msg_len,m_name.c_str());
 					return -1;

+ 1 - 0
znet.h

@@ -10,6 +10,7 @@ struct client:std::enable_shared_from_this<client>
 	virtual std::string name()=0;
 	virtual int type()=0;			//分站:1,模拟客户端:2
 	virtual int handle()=0;
+    virtual void set(int type)=0; //设置分站类型
 
 	virtual void close()=0;
 	virtual void send(std::vector<char>&&b)=0;