Browse Source

一人多卡告警,修复一人多卡数据异常bug

lixioayao 6 years ago
parent
commit
ff7c1347ee
6 changed files with 101 additions and 32 deletions
  1. 9 10
      ant.cpp
  2. 70 8
      bindmorecard.cpp
  3. 12 1
      bindmorecard.h
  4. 0 1
      cardMgr.cpp
  5. 3 0
      common.h
  6. 7 12
      event.cpp

+ 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";

+ 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

+ 0 - 1
cardMgr.cpp

@@ -70,7 +70,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())
 		{

+ 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;
 }