浏览代码

fix anti coll function

zhuyf 4 年之前
父节点
当前提交
adf48dc940
共有 7 个文件被更改,包括 172 次插入66 次删除
  1. 2 4
      card_base.cpp
  2. 51 20
      card_car.cpp
  3. 24 22
      common.h
  4. 83 8
      module_service/module_call.cpp
  5. 1 1
      module_service/module_call.h
  6. 10 10
      module_service/module_web.cpp
  7. 1 1
      websocket/jsonBuilder.cpp

+ 2 - 4
card_base.cpp

@@ -213,7 +213,6 @@ void card_location_base::on_message(zloop<task*>* loop, message_pdoa_locinfo& lo
 //前端推送位置函数.
 void card_location_base::upt_card_pos(YA::_CARD_POS_&cp, point &pt)
 {
-//	YA::_CARD_POS_ cp;
     point _p;
     if(pt.empty())
     {
@@ -222,9 +221,8 @@ void card_location_base::upt_card_pos(YA::_CARD_POS_&cp, point &pt)
     }
     else
          _p=pt;
-	//cp.z = pt.z;
-
-	cp.Type=m_type;
+	
+    cp.Type=m_type;
 	cp.ID = m_id;
 	cp.speed = abs(ceil(m_speed));
 	cp.x = tool_other::round(_p.x,3);

+ 51 - 20
card_car.cpp

@@ -1,4 +1,4 @@
-
+#include <sstream>
 #include "card_car.h"
 #include "card_message_handle.h"
 #include "his_location.h"
@@ -14,6 +14,7 @@
 #include "loc_point.h"
 #include "module_service/module_call.h"
 #include "ya_setting.h"
+#include "event.h"
 
 car::car(const std::string&type,uint32_t cardid,uint16_t needdisplay,int16_t t,int32_t deptid,
 		int32_t categoryid, int type_id,int32_t level_id,uint32_t cid)
@@ -41,7 +42,7 @@ void car::do_business(const std::shared_ptr<site>&site,const point &pt,double ac
 	m_acc=acc;
 	m_area_tool->on_point(shared_from_this(),pt);
 	m_timeval = m_time;
-    log_info("[anti_coll] m_id = %d, m_timeval = %lld", m_id, m_timeval);
+    //log_info("[anti_coll] m_id = %d, m_timeval = %lld", m_id, m_timeval);
 	handle_three_rates(pt);
     handle_traffic_light(pt);
     if(m_enable_anti_collision){
@@ -58,11 +59,14 @@ int car::get_vehicle_type_id()
 
 void car::handle_anti_coll(const point& pt, const int& sid)
 {
-    log_info("[anti_coll] handle anti collision");   
+    //log_info("[anti_coll] handle anti collision");   
     // 车卡下发最紧急的呼叫类型
+    std::map<int, float> cd;    // 人卡与车卡的距离,key为人卡id,value为距离
     std::map<int, call_card> cards;
     auto tmp_cards = card_list::instance()->m_map; 
 
+    double min_d = 9999999.9;
+    double cur_v = 0.0;
     for(auto k : CYaSetting::m_sys_setting.mp_anti_collision){
         log_info("[anti_coll] key=%d, value=%.2f", k.first, k.second);
         for(auto& c : tmp_cards)
@@ -73,9 +77,22 @@ void car::handle_anti_coll(const point& pt, const int& sid)
             bool s = false;
             int d = (c.second->m_timeval >= m_timeval ? (c.second->m_timeval - m_timeval) : (m_timeval - c.second->m_timeval)) / 1000.0;
             s = ((c.second->m_timeval >= m_timeval ? (c.second->m_timeval - m_timeval) : (m_timeval - c.second->m_timeval)) /1000.0 <= 30);
-            if(pt.dist(*c.second) < k.second && s){
+            float dist = pt.dist(*c.second);
+            if(dist < k.second && s){
                 int call_level = 5 - k.first;
-                log_info("[anti_coll] distance=%.3f, level=%d, thre_value=%.3f, time_diff=%d", pt.dist(*c.second), call_level, k.second, d);
+                log_info("[anti_coll] distance=%.3f, level=%d, thre_value=%.3f, time_diff=%d", dist, call_level, k.second, d);
+                
+                if(min_d > k.second){
+                    min_d = k.second;
+                    cur_v = dist;
+                }
+
+                auto itc = cd.find(c.second->m_id);
+                if(itc == cd.end()){
+                    cd.insert(std::make_pair(c.second->m_id, dist));
+                }else{
+                    itc->second = dist;
+                }
 
                 auto it = cards.find(c.second->m_id);
                 if(it != cards.end()){
@@ -89,7 +106,28 @@ void car::handle_anti_coll(const point& pt, const int& sid)
             }
         }
     }
-    
+
+    std::string desc = "";
+    if(cards.size() == 0){
+        // delete event from event_list
+        event_tool::instance()->handle_event(OT_CARD, ET_PERSON_VEHICLE_ANTI_COLLISION, m_id, 0, 0, false);
+    }else{
+        size_t i = 0;
+        for(auto c : cd)
+        {
+            desc += std::to_string(c.first);
+            std::ostringstream buf;
+            buf<<c.second;
+            desc += "," + buf.str();
+            if(i != (cards.size() - 1)){
+                desc += ";";
+            }
+            ++i;
+        }
+        log_info("[anti_coll] the distance's list between person and vehicle : %s", desc.c_str());
+        event_tool::instance()->handle_event(OT_CARD, ET_PERSON_VEHICLE_ANTI_COLLISION, m_id, min_d, cur_v, true, DT_COMMON, desc);
+    }
+
     if(cards.size() > 0){
         // find the best emengency call
         int call_level = 6;
@@ -129,6 +167,7 @@ void car::handle_traffic_light(const point& p)
     cp.x = p.x;
     cp.y = p.y;
     cp.z = p.z;
+    cp.biz_stat = get_stat();
     cp.map_id = m_area_tool->get_mapid();
     cp.vibration = m_acc;
     put_traffic_light(cp);
@@ -155,17 +194,13 @@ void car::make_package()
 {
 	YA::_CARD_POS_ cp;
 	loc_point pt = getSmoothPoint();
-	cp.area_info=m_area_tool->m_area_info;	
-	cp.map_id =m_area_tool->get_mapid();
+	cp.area_info = m_area_tool->m_area_info;	
+	cp.map_id    = m_area_tool->get_mapid();
 
-	int32_t biz_stat=m_biz_stat;
-	cp.biz_stat=biz_stat;
+	cp.biz_stat  = get_stat();
 	cp.down_time = m_mine_tool->get_down_time();
 	cp.work_time = m_mine_tool->get_work_time();
-    uint32_t on_duty=0;
-   // if(m_mine_tool->m_is_attendance)
-    on_duty=m_mine_tool->is_on_duty();
-	cp.is_on_duty=on_duty;
+	cp.is_on_duty= m_mine_tool->is_on_duty();
 	upt_card_pos(cp,pt);
     make_his_location(pt.m_time,pt);
 	uint64_t _now=tool_time::now_to_ms();
@@ -175,18 +210,14 @@ void car::make_package()
 		m_area_tool->on_point(shared_from_this(),pt);
 		m_biz_stat=get_stat();
 	}
-
-//	if(biz_stat==STATUS_LOST && special_id != -1 && m_display==1)
-//	{
-//		cp.area_id = special_id;
-//		swsClientMgr.SendSpecialAreaProcess(cp);
-//	}
 }
+
 void car::get_card(bool f)
 {
     if(f)
 	    mine_business::inst()->put(shared_from_this());
 }
+
 loc_point car::getSmoothPoint()
 {
 	loc_point lp = m_smo_tool->smooth_strategy();

+ 24 - 22
common.h

@@ -115,30 +115,32 @@ enum EVENT_DIS_TYPE
     DT_COMMON=3//全显示
 };
 
-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,	// 区域车辆超员
+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_AREA_OVER_TIME_PERSON = 15, // 人员区域超时
-
-    ET_CARD_AREA_FORBIDDEN_PERSON = 19,  // 人员进入禁止区域
-    ET_CARD_AREA_FORBIDDEN_VEHICLE = 20, // 车辆进入禁止区域
-    ET_CARD_OVER_SPEED = 21, // 车辆超速
-    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,//车辆防追尾告警
-	ET_COALING_DRIVING_DRIVER = 37,//工作面(采煤面和掘进面)司机与车卡告警;
-    ET_VEHICLE_NEAR_GEOFAULT=38,//靠近断层告警
-	ET_READER_LOCATION_REVERSAL=39,//掘进面天线反向告警
+    ET_CARD_LOW_POWER_SERIOUS = 12,         // 电量极低
+    ET_CARD_OVER_TIME_PERSON = 13,          // 人员井下超时
+    ET_CARD_AREA_OVER_TIME_PERSON = 15,     // 人员区域超时
+
+    ET_CARD_AREA_FORBIDDEN_PERSON = 19,     // 人员进入禁止区域
+    ET_CARD_AREA_FORBIDDEN_VEHICLE = 20,    // 车辆进入禁止区域
+    ET_CARD_OVER_SPEED = 21,                // 车辆超速
+    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,                 // 车辆防追尾告警
+	ET_COALING_DRIVING_DRIVER = 37,         // 工作面(采煤面和掘进面)司机与车卡告警;
+    ET_VEHICLE_NEAR_GEOFAULT=38,            // 靠近断层告警
+	ET_READER_LOCATION_REVERSAL=39,         // 掘进面天线反向告警
+    ET_PERSON_VEHICLE_ANTI_COLLISION=40,    // 人车防碰撞
     CARD_EVENT_COUNT_MAX
 };
 

+ 83 - 8
module_service/module_call.cpp

@@ -1,20 +1,22 @@
 #include "module_call.h"
 
 #include <boost/bind.hpp>
+#include <boost/algorithm/string.hpp>
 #include <vector>
 #include <set>
 #include <string>
 #include <chrono>
-#include<algorithm>
-
+#include <algorithm>
 #include <area.h>
-#include"common_tool.h"
-#include"tool_time.h"
-#include"ant.h"
-#include"websocket/constdef.h"
-#include"websocket/wsClientMgr.h"
+#include "common_tool.h"
+#include "tool_time.h"
+#include "ant.h"
+#include "websocket/constdef.h"
+#include "websocket/wsClientMgr.h"
 #include "crc.h"
-#include"mine.h"
+#include "mine.h"
+#include "event.h"
+
 uint64_t call_card::to_id64()
 {
     return tool_other::type_id_to_u64(cardtype, cardid);
@@ -66,6 +68,12 @@ void module_call::run()
     //转发给web
     //swsClientMgr.send(JSON_CMD_VALUE_PUSH, to_call_card_list_json(arr));
 
+    std::string ac = get_json_anti_collision();
+    if(!ac.empty()){
+        log_info("send2web: %s", ac.c_str());
+        swsClientMgr.send(JSON_CMD_VALUE_PUSH, ac);
+    }
+
     //将呼叫命令发送给标识卡终端
     call_site_map site_map;
     get_site_map(arr, site_map);
@@ -770,3 +778,70 @@ void module_call::send_anti_collision(const std::map<int, call_card>& cards)
         send_to_sites(site_map);
     }
 }
+
+std::string module_call::get_json_anti_collision()
+{
+    rapidjson::Document doc(rapidjson::kObjectType);
+    rapidjson::Document::AllocatorType& allocator = doc.GetAllocator();
+    doc.SetObject();
+
+    rapidjson::Value data(rapidjson::kArrayType);
+    auto tmp = event_list::instance()->m_map;
+    for(auto it_ev = tmp.cbegin(); it_ev != tmp.cend(); ++it_ev)
+    {
+        if(ET_PERSON_VEHICLE_ANTI_COLLISION != it_ev->second->m_ev_type)
+        {
+            continue;
+        }
+     
+        rapidjson::Value obj(rapidjson::kObjectType);
+        
+        rapidjson::Value vid(rapidjson::kObjectType); 
+        vid.SetInt(atoi(it_ev->second->m_obj_id.c_str()));
+        obj.AddMember("vid", vid, allocator);
+
+        rapidjson::Value elems(rapidjson::kArrayType);
+        std::string msg = it_ev->second->m_desc;
+        std::vector<std::string> vt_msg;
+        boost::split(vt_msg, msg, boost::is_any_of(";"));
+        for(auto it_elem : vt_msg){
+            std::vector<std::string> vt_cid_d;
+            boost::split(vt_cid_d, it_elem, boost::is_any_of(","));
+
+            if(vt_cid_d.size()<2){
+                continue;
+            }
+
+            rapidjson::Value e(rapidjson::kArrayType);
+            rapidjson::Value o(rapidjson::kObjectType);
+
+            o.SetInt(atoi(vt_cid_d[0].c_str()));
+            e.PushBack(obj, allocator);
+
+            o.SetDouble(atof(vt_cid_d[1].c_str()));
+            e.PushBack(obj, allocator);
+            
+            elems.PushBack(e, allocator);   
+        }
+        obj.AddMember("pid", elems, allocator);
+
+        std::string t = tool_time::to_str(it_ev->second->m_cur_time);
+        tool_json::add_member(obj, "start_time", t, allocator);
+
+        data.PushBack(obj, allocator);
+    }
+
+    if(!data.Size()){
+        return "";
+    }
+
+    doc.AddMember(JSON_ROOT_KEY_CMD, "pv_anti_coll", allocator);
+    doc.AddMember(JSON_ROOT_KEY_VERSION, INTERFACE_VERSION, allocator);
+    doc.AddMember(JSON_ROOT_KEY_DATA, data, allocator);
+
+    rapidjson::StringBuffer sb;
+    rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb);
+    doc.Accept(writer);
+
+    return sb.GetString();
+}

+ 1 - 1
module_service/module_call.h

@@ -196,7 +196,7 @@ public:
     void system_cancel_call_apoint(int card_id,int card_type);
 
     void send_anti_collision(const std::map<int, call_card>& cards);
-
+    std::string get_json_anti_collision();
     /**int card_id,int card_type
      * @brief
      */

+ 10 - 10
module_service/module_web.cpp

@@ -1,12 +1,10 @@
 #include "module_web.h"
-
-#include"module_call_help.h"
-#include"module_call.h"
-#include"area_business_person_attendance.h"
-#include"module_meta_data_changed.h"
-#include"common_tool.h"
-#include"event.h"
-
+#include "module_call_help.h"
+#include "module_call.h"
+#include "area_business_person_attendance.h"
+#include "module_meta_data_changed.h"
+#include "common_tool.h"
+#include "event.h"
 #include"log.h"
 
 void module_web::accept( int ID, std::string const& name,
@@ -124,8 +122,10 @@ void module_web::_get_all_events(std::vector<std::shared_ptr<ya_event>>& arr,boo
     auto it_map = _map.begin();
     for(;it_map!=_map.end();++it_map)
     {
-        if(f && it_map->second->m_is_sent && !it_map->second->is_end())continue;
-        else it_map->second->m_is_sent=true;
+        if(f && it_map->second->m_is_sent && !it_map->second->is_end())
+            continue;
+        else 
+            it_map->second->m_is_sent=true;
         arr.push_back(it_map->second);
     }
 }

+ 1 - 1
websocket/jsonBuilder.cpp

@@ -130,7 +130,7 @@ namespace YA
 
 		//12 业务状态
 		tmp_object.SetInt( CardPos.biz_stat );
-		Array.PushBack( tmp_object, Allocator );
+	    Array.PushBack( tmp_object, Allocator );
 
 		//13 速度
 		tmp_object.SetDouble( CardPos.speed );