#include #include #include "card_base.h" #include "loc_tool.h" #include "message.h" #include "zloop.h" #include "card_message_handle.h" //一张卡一个ct的所有不同天线的信息 struct one_ct_message_handle { static loc_tool_main m_loc_tool; ev::timer *m_min_timer=nullptr,*m_max_timer=nullptr; //loc_message. std::vector m_msg_list; card_location_base*m_card; const algo_config*m_ac=nullptr; int m_ct; ev::dynamic_loop * m_loop = nullptr; one_ct_message_handle(card_location_base*card) { m_card=card; m_ct=-1; } ~one_ct_message_handle() { delete m_min_timer; delete m_max_timer; } void on_min_timer() { if((int)m_msg_list.size()>=m_ac->best_msg_cnt) { m_max_timer->stop(); calc_location(); } } void on_max_timer() { calc_location(); } void set(ev::dynamic_loop * loop) { m_loop=loop; m_min_timer=new ev::timer(*loop); m_min_timer->set(this); m_max_timer=new ev::timer(*loop); m_max_timer->set(this); } void on_message(ev::dynamic_loop *loop,const message_locinfo&loc) { if(loop==nullptr) return; if(m_loop == nullptr) set(loop); if(m_ct==loc.m_card_ct && m_max_timer->remaining()<0) //超过max_timer的点,抛弃 return; if(!m_msg_list.empty() && m_ct!=loc.m_card_ct) //ct已经回绕,重置 { m_msg_list.clear(); } auto sitPtr = sit_list::instance()->get(loc.m_site_id); if(sitPtr==nullptr) { log_warn("分站信息缺失,SitId:%d",loc.m_site_id); return; } auto s=sit_list::instance()->get(loc.m_site_id); //这里构造loc_message 保存数据 m_msg_list.push_back(loc_message(s,loc.m_tof,loc.m_time_stamp,loc.m_card_id, loc.m_card_ct,loc.m_card_type,loc.m_ant_id,loc.m_rav,loc.m_acc, loc.m_sync_ct,loc.m_rssi)); if(m_msg_list.size()==1)//第一个点 { m_ct=loc.m_card_ct; m_ac=&s->config(); //启动本CT的最小、最大两个定时器 m_min_timer->start(m_ac->min_wait_time); m_max_timer->start(m_ac->max_wait_time); return; } if(m_min_timer->remaining()<0 && (int)m_msg_list.size()>=m_ac->best_msg_cnt) { calc_location(); m_max_timer->stop(); } } void calc_location() { auto&v = m_msg_list; if(v.empty()) { return; } log_info("calc_location_begin:card_id=%d,ct=%d,m_ct=%d",m_card->m_id,v[0].m_card_ct,m_ct); std::vector rc=std::move(m_loc_tool.calc_location(v)); log_info("calc_location:%d size:%d",m_card->m_id,rc.size()); if(!rc.empty()) m_card->on_location(std::move(rc),v); m_msg_list.clear(); log_info("calc_location_end:card_id=%d",m_card->m_id); } }; loc_tool_main one_ct_message_handle::m_loc_tool; card_message_handle::card_message_handle(card_location_base*card) { m_card=card; for(size_t i=0;i * loop,const message_locinfo&loc,bool is_history) { #ifndef _RELEASE_ if(m_first_call) { m_first_call=false; m_first_call_thread=std::this_thread::get_id(); } if(m_first_call_thread!=std::this_thread::get_id()) { log_error("%s\n","card_message_handle::on_message 无法支持多线程调用"); assert(false); } #endif if(is_history) { log_warn("%s","当前代码没有处理历史消息记录。"); return; } STATUS_CARD c_status = STATUS_POWER_NOMARL; if(loc.m_batty_status == 2) { c_status = STATUS_POWER_LOWER_SERIOUS; } m_card->do_status(c_status); if(loc.m_callinfo & 0x80) { m_card->do_status(STATUS_HELP); } if((loc.m_callinfo & 0x01) || (loc.m_callinfo & 0x02)) { m_card->do_status(STATUS_CALL); } m_ct_list[loc.m_card_ct&(m_ct_list.size()-1)]->on_message(loop,loc); }