Browse Source

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

researchman 5 years ago
parent
commit
d46bea496e

+ 6 - 4
ant.h

@@ -313,16 +313,18 @@ struct visit_site_status:visitor<std::shared_ptr<site>>
 };
 struct sit_list:single_base<sit_list,int,std::shared_ptr<site>>
 {
-    void load()
+    void load(const std::string &id)
     {
-        read_sit_list();
-        read_ant_path();
+        int sid=-1;
+        if(!id.empty())sid=std::stoi(id);
+        read_sit_list(sid);
+        read_ant_path(sid);
     }
     ///id=-1为初始化所有
     void load_from_db(const std::string&ids="" )
     {
         init_site(ids);
-        load();
+        load(ids);
     }
     void read_sit_list(int id=-1);
     void read_ant_path(int id=-1);

+ 1 - 35
card_base.cpp

@@ -158,17 +158,6 @@ void card_location_base::on_message(zloop<task*> * loop,const message_locinfo&lo
 		m_message_handle->on_message(loop,loc,is_history);
 	}
 }
-struct ld_1318
-{
-    ld_1318(double a,double b,double c)
-        :x(a)
-        ,y(b)
-        ,speed(c)
-    {}
-    double x;
-    double y;
-    double speed;
-};
 //前端推送位置函数.
 void card_location_base::upt_card_pos(YA::_CARD_POS_&cp, point &pt)
 {
@@ -185,29 +174,6 @@ void card_location_base::upt_card_pos(YA::_CARD_POS_&cp, point &pt)
 	cp.Type=m_type;
 	cp.ID = m_id;
 
-   // if(m_type==4 &&  m_id==1318)
-   // {
-   //     static std::list<ld_1318> list_1318;
-   //     if(list_1318.size()>=60)
-   //     {
-   //         double tx=0,ty=0,ts=0;
-   //         std::for_each(list_1318.begin(),list_1318.end(),[&tx,&ty,&ts](const ld_1318& ld){
-   //                     tx+=ld.x;ty=ld.y;ts+=ld.speed;
-   //                     });
-   //         size_t n=list_1318.size();
-
-   //         tx/=n;ts/=n;
-   //         _p.set(tx,ty,0);
-   //         cp.speed = ts;
-   //         list_1318.pop_front();
-   //         log_info("get_speed:%d (%f,%f), %f",m_id,tx,ty,ts);
-   //     }
-   //     else
-   //         _p=*this;
-   //     double speed = abs((int)(m_speed*10000)/10000.);
-   //     list_1318.emplace_back(x,y,speed);
-   // }
-   // else
 	cp.speed = abs(ceil(m_speed));
 
 	cp.x = tool_other::round(_p.x,3);
@@ -234,7 +200,7 @@ int  card_location_base::get_stat()
 	//盲区>呼救>呼叫>超时>超速>正常
     uint64_t now = time(0)*1000;
     uint64_t tlost=now>m_time?now-m_time:m_time-now;
-    log_info("card_lost:%03d%010d,[%lu-%lu]tlost:%lu---%s",m_type,m_id,now,m_time,tlost,tlost>CARD_LOST_TIME_OUT?"True":"False");
+
     if(tlost>CARD_LOST_TIME_OUT)
     {
         // 人卡盲区: 当人卡丢失信号大于60s,判定人卡进入盲区

+ 1 - 0
card_base.h

@@ -101,6 +101,7 @@ struct card_location_base:card,std::enable_shared_from_this<card_location_base>
     virtual int get_workline(){return -1;}
 	virtual void get_card(bool f)=0;
 	virtual void site_hover(int sid){}
+    virtual void handle_message(uint16_t ct,uint8_t& value){}
 
     void make_his_location(uint64_t t,const point & pt,bool bclose = false);
     void on_message(zloop<task*> * loop,const message_locinfo&loc,bool is_history);

+ 47 - 0
card_person.cpp

@@ -242,3 +242,50 @@ void person::get_card(bool f)
 		return ;
 	mine_business::inst()->fetch_add(m_display);
 }
+#define CHARGE_MASK     0X03
+#define DISCHARGE_MASK  0X0C
+#define POWER_MASK      0X10
+void person::handle_message(uint16_t ct,uint8_t &value)
+{
+    //判断是新卡还是老卡
+    if(m_card_generation==0){
+        uint8_t remainder=ct%5;
+        if(remainder==4){
+            uint8_t v=value>>4;
+            if(v>0)m_card_generation=2;
+            else m_card_generation=1;
+        }
+        //没判定结果之前使用之前的状态
+        value=m_pwr_stat; 
+        return;
+    }
+    //老卡
+    if(m_card_generation==1){
+        value=value&0x03;
+        return;
+    }
+    //新卡继续往下走,获取数据
+    uint16_t cttmp = ct/5;
+    if(m_ctflag != cttmp){
+        if((m_index&CHARGE_MASK) == CHARGE_MASK) 
+            m_charge_value=(m_value[0]<<8)|m_value[1];
+        if((m_index&DISCHARGE_MASK) == DISCHARGE_MASK)
+            m_discharge_value=(m_value[2]<<8)|m_value[3];
+        if((m_index&POWER_MASK) == POWER_MASK)
+            m_power=m_value[4]>>4;
+        logn_info(3,"card_id:%d,充电时间:%u,放电时间:%u,电量%d%",m_id,m_charge_value,m_discharge_value,m_power*10);
+        m_index=0;m_ctflag=cttmp;memset(&m_value,0,sizeof(m_value));
+    }
+    uint8_t remainder=ct%5;
+    m_value[remainder]=value;
+    m_index|=(1<<remainder);
+    logn_info(3,"card_id:%d,ctflag:%u,index:%d,value:%d,,,,%d",m_id,m_ctflag,remainder,value,m_index);
+    if(remainder==4){
+        value>>=4;
+        if(value>=5)value=0;
+        else if(value >2 && value<5) value=1;
+        else value=2;
+    }else{
+        value=m_pwr_stat; 
+    }
+}

+ 8 - 0
card_person.h

@@ -9,12 +9,19 @@ struct person:card_location_base, card_area
     int m_workLine=0;	
 	int m_worktype_id=0;
     int m_thour{-1};
+    uint16_t m_charge_value{0};
+    uint16_t m_discharge_value{0};
+    uint16_t m_ctflag{0};
+    uint8_t m_power{0};
+    uint8_t m_index{0};
+    uint8_t m_card_generation{0};
     time_t m_iris_recognition_timeval = 0;
     static int m_limit_detained_time;
     static int m_auto_up_mine_time;
     static int m_person_cards_flag;
     std::weak_ptr<monkey_person> m_monkeyPerson;
     std::string m_stafferName,m_deptName;
+    std::array<uint8_t,5> m_value;
     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,int workrype_id);
     ~person();
 
@@ -32,6 +39,7 @@ struct person:card_location_base, card_area
     virtual std::shared_ptr<mine_tool> get_mine_tool();
     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 void handle_message(uint16_t ct,uint8_t &value);
     virtual std::shared_ptr<area_tool> get_area_tool()
     {
         return m_area_tool;

+ 19 - 16
db/db_api/CDBConnPool.cpp

@@ -1,5 +1,6 @@
 #include "CDBConnPool.h"
 #include <boost/bind.hpp>
+#include <thread>
 #include <log.h>
 
 namespace YADB
@@ -253,24 +254,26 @@ namespace YADB
 
 	void CDBConnPool::_AsyncThreadFunc( CDBConnPool* pOwner )
 	{
+		//uint64_t cc=0;
 		while( pOwner->__Running )
 		{
-			std::vector<_ASYNC_SQL_*> sql_list;
-			sql_list.reserve(1<<15);
-
-			{
-				std::unique_lock<std::mutex> lock(g_mutex);
-				sql_list.swap(g_sql_list);
-			}
-
-			logn_info(2,"sql_list size=%lld", sql_list.size());
-
-			for(auto pData:sql_list)
-			{
-				ExecAsyncSql(pData);
-			}
-
-			boost::this_thread::sleep_for( boost::chrono::milliseconds( 1 ) );
+            if(!g_sql_list.empty()){
+		    	std::vector<_ASYNC_SQL_*> sql_list;
+		    	sql_list.reserve(1<<15);
+                
+		    	{
+		    		std::unique_lock<std::mutex> lock(g_mutex);
+		    		sql_list.swap(g_sql_list);
+		    	}
+
+                //100ms太理想了。上下井高峰期这个有可能1h都没一条日志
+		    	//if(++cc % 100 == 0)//100ms 输出一次
+		    	logn_info(2,"sql_list size=%lld", sql_list.size());
+                //1条链接处理sql。sql堆积。速度慢 
+		    	for(auto pData:sql_list)
+		    		ExecAsyncSql(pData);
+            }
+			std::this_thread::sleep_for(std::chrono::milliseconds(1));
 		}
 
 		//线程退出

+ 3 - 1
event.cpp

@@ -374,6 +374,8 @@ void event_list::load_his_data_from_db(bool init /*=true*/)
                         }
                     }
                     c->set_event_flag(ev->m_ev_type);
+                    if(event_type_id==ET_CARD_LOW_POWER_SERIOUS)
+                        c->m_pwr_stat=STATUS_POWER_LOWER_SERIOUS;
                 } else {
                     log_warn("load_evnet_history:card_id:%s not exist...",obj_id.c_str());
                     continue;
@@ -419,7 +421,7 @@ std::string event_list::evs_to_json(std::vector<std::shared_ptr<ya_event>> arr)
     doc.AddMember(JSON_ROOT_KEY_DATA,data, allocator);
 
     rapidjson::StringBuffer sb;
-    rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb);
+    rapidjson::Writer<rapidjson::StringBuffer> writer(sb);
     doc.Accept(writer);
 
     return sb.GetString();

+ 4 - 2
message.cpp

@@ -4,7 +4,7 @@
 #include "log.h"
 #include "common_tool.h"
 #include "card.h"
-
+//找到一个办法进行兼容
 void message_locinfo::zero_this()
 {
 	m_site_time=
@@ -57,7 +57,7 @@ void message_locinfo::load(zistream&is,bool tdoa)
 	m_card_id &= 0xFFFF; //卡号不会大于65535,分站上传数据的bug
 
 	m_card_type=b;
-	m_batty_status&=0x03;
+	//m_batty_status&=0x03;
 
 	is>>b;
 	if(m_card_type==1)
@@ -72,6 +72,8 @@ void message_locinfo::load(zistream&is,bool tdoa)
 	//加速度
 	is>>b;
     const auto &c=card_list::instance()->get(tool_other::type_id_to_u64(m_card_type,m_card_id));
+    if(m_card_type==1 && c)
+        c->handle_message(m_card_ct,m_batty_status);
 	if(m_card_type == 1 ||(c && tool_other::is_coal_or_driving(m_card_type,c->get_vehicle_type_id())))
 		m_acc=b;
 	else

+ 6 - 3
module_service/area_business_person_attendance.cpp

@@ -127,6 +127,9 @@ void area_business_person_attendance::_to_json_card_up_one(std::shared_ptr<card_
                                                            rapidjson::Value& out_datas, rapidjson::Document::AllocatorType& allocator)
 {
     auto mine_tool_ptr = card_ptr->get_mine_tool();
+    int map_id=0;
+    if(auto area_tool_ptr = card_ptr->get_area_tool())
+        map_id=area_tool_ptr->get_mapid();
 
     rapidjson::Value data(rapidjson::kArrayType);
     //卡号
@@ -151,18 +154,18 @@ void area_business_person_attendance::_to_json_card_up_one(std::shared_ptr<card_
     data.PushBack(t, allocator);
 
     //地图编号
-    data.PushBack(0, allocator);
+    data.PushBack(map_id, allocator);
     //区域编号
     data.PushBack(0, allocator);
     //部门编号
     data.PushBack(card_ptr->m_deptid, allocator);
 
     //状态
-    data.PushBack(0, allocator);
+    data.PushBack(card_ptr->m_pwr_stat, allocator);
     //运行状态
     data.PushBack(card_ptr->m_stat, allocator);
     //业务状态
-    data.PushBack(0, allocator);
+    data.PushBack(card_ptr->m_biz_stat, allocator);
     //速度
     data.PushBack(card_ptr->m_speed, allocator);
 

+ 6 - 2
module_service/module_meta_date_changed.cpp

@@ -223,7 +223,11 @@ void module_meta_date_changed::deal_call_edit_area(const std::string& id,EDIT_TY
 
 void module_meta_date_changed::deal_call_edit_reader(const std::string &ids, EDIT_TYPE_ID edit_type_id)
 {
-    if(ET_INSERT == edit_type_id || ET_UPDATE == edit_type_id){
+    //新增发送的都是单个分站名称,所以
+    if(ET_INSERT == edit_type_id){
+        sit_list::instance()->load_from_db(ids);
+    }
+    else if(ET_UPDATE == edit_type_id){
         sit_list::instance()->init_site(ids);
     }else if(ET_DELETE == edit_type_id){
         int id =std::stoi(ids);
@@ -367,7 +371,7 @@ void module_meta_date_changed::remove_card(std::shared_ptr<card_location_base> c
     {
         return;
     }
-    log_info("基础数据, 在全局列表中删除卡成功, id=%d, type=%d",card_ptr->m_type, card_ptr->m_id);
+    log_info("基础数据, 在全局列表中删除卡成功, type=%d, id=%d",card_ptr->m_type, card_ptr->m_id);
     //    auto area_hover_ptr = card_ptr->get_area_hover();
     //    if(area_hover_ptr && 0!=area_hover_ptr->id() && 0!=area_hover_ptr->mapid())
     //    {

+ 1 - 1
module_service/module_web.cpp

@@ -108,7 +108,7 @@ void module_web::run()
 
         std::string tmp = event_list::evs_to_json(arr);
         swsClientMgr.send(JSON_CMD_VALUE_PUSH, tmp);
-        log_info("发送给web的告警json:%s", tmp.c_str());
+//        log_info("发送给web的告警json:%s", tmp.c_str());
     }
 
     std::string help = module_call_help::get_json_help();

+ 1 - 1
net-service.cpp

@@ -264,7 +264,7 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
                 }
                 break;
 
-
+			case 0x793B: //虚拟推送的心跳测试
 			case CHAR_LOCATEDATAHIS_TOF_EXTEND://tof his
 			case CHAR_LOCATEDATAHIS_TDOA_EXTEND://tdoa his
 			case CHAR_CTRL_READER_CMD://ctrl site message