// // Created by Administrator on 2019/1/14. // #include "site_message_handle.h" #include "system_basic_info/SystemAnalysis.h" #include "common_tool.h" #include "ant.h" #include "ya_event.h" site_message_handle::site_message_handle() { m_time_last_rec = 0; } /** 解析 分站发送过来的数据中(分站的信息数据)*/ void site_message_handle::parse_data_locate_reader(int msgId,const message_siteinfo &loc ,bool bHistroy) { LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_15); std::shared_ptr pSite = sit_list::instance()->get(loc.m_site_id); //bool isErrorReader = false; if(pSite){ //add_socket_to_list(dwConnID, reader_id, DEVICE_TYPE::DT_CARD_READER); LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_16); }else{ pSite = std::make_shared(); pSite->m_id = loc.m_site_id; LOCATION_SYSTEM_BRANCH(LOCATION_SYSTEM_BRANCH_17); } // 接收数据时间 pSite->m_rec_time = time(NULL); m_time_last_rec = pSite->m_rec_time; // 更新最后信号时间 // 分站时间戳 pSite->m_tick_count = loc.m_time_stamp; // 分站时间 // 7字节 从第一个字节开始,分别表示秒、分、时、天、周、月、年 struct tm reader_time; reader_time.tm_sec = loc.m_sec; reader_time.tm_min = loc.m_min; reader_time.tm_hour = loc.m_hour; reader_time.tm_mday = loc.m_day; reader_time.tm_wday = loc.m_week; reader_time.tm_mon = loc.m_mon - 1; reader_time.tm_year = loc.m_year + 100; // + 2000 - 1900 pSite->m_time = mktime(&reader_time); //改为大小分站信息,最高位第7位表示大小分站,1表示大分站,0表示小分站 //高6位表示分站(大或小)在大分站的左侧或右侧,1代表在大分站的左侧,0表示在大分站的右侧 //高5位预留位,用于区分是读卡分站还是大小分站 uint8_t reader_type = loc.m_site_relation >>7; //大小分站的区别 uint8_t reader_dir = (loc.m_site_relation >>6)&0x01; uint8_t reader_type_locate = (loc.m_site_relation >>5)&0x01; //大小分站与读卡分站的区别 uint8_t relay_counts = loc.m_site_relation&0x0F; pSite->m_reader_dir = reader_dir; pSite->m_relay_counts = relay_counts; reader_power_battery_alarm(loc.m_site_id,loc.m_site_power); log_info("id:%d, n:%d, %.2d-%.2d-%.2d %.2d:%.2d:%.2d, sta: %d,reader_power: %d" ",reader_type: %d,is_big_reader: %d,is_left: %d, counts: %d", loc.m_site_id, loc.m_time_stamp, loc.m_year, loc.m_mon, loc.m_day\ , loc.m_hour, loc.m_min,loc.m_sec\ , loc.m_site_state,loc.m_site_power,reader_type_locate,reader_type,reader_dir,relay_counts);/*tep:%d,*/ } void site_message_handle::reader_power_battery_alarm(unsigned int site_id, int powerType) { std::shared_ptr pSite = sit_list::instance()->get(site_id); if (pSite == nullptr ) { return ; } std::shared_ptr ev_ptr = event_list::instance()->get_event_reader(site_id,ET_READER_POWER_BY_BATTERY); int oldEvState = -1; int usePowerType = powerType; if (!pSite->m_needpower_alarm) { //如果分站不需要电池供电告警,而告警事件列表中存在告警信息,需要发送结束告警事件 if (ev_ptr && ev_ptr->m_status == ES_START) { oldEvState = ES_START; usePowerType = 1; } else { return; } } switch (usePowerType) { case 1 : //交流电 取消警告 { if(nullptr == ev_ptr || oldEvState == ES_END) { return ; //不出在警告并且警告已是取消状态 } event_list::copy_event(pSite,ev_ptr); ev_ptr->m_status = ES_END; ev_ptr->m_cur_time = std::chrono::system_clock::now(); ev_ptr->m_cur_value = usePowerType; ev_ptr->m_is_display = true; event_list::save_event(ev_ptr); log_info("[event warning: restore reader power supply] reader_id: %d.",site_id); } break; case 0: //直流电警告 { if(nullptr != ev_ptr && oldEvState == ES_START) { return ; //已有警告在发送不需要再次添加 } if (nullptr == ev_ptr) { ev_ptr = event_list::create_event_reader(site_id,ET_READER_POWER_BY_BATTERY); event_list::copy_event(pSite,ev_ptr); event_list::instance()->add(ev_ptr->get_list_id(),ev_ptr); } ev_ptr->m_status = ES_START; ev_ptr->m_limit_value = 0; ev_ptr->m_cur_value = usePowerType; event_list::save_event(ev_ptr); log_info("[event warning: reader power supply by battery] reader_id: %d.",site_id); } break; } }