#ifndef MODULE_AREA_OVER_SPEED_H #define MODULE_AREA_OVER_SPEED_H /** *@brief 区域超速模块 * 当某张车卡速度超过某个区域的最大速度时,发出告警 * @author 戴月腾 * @date 2018-08-08 */ #include #include #include #include #include #include "module_const.h" /** * @brief 区域超速类。当某张车卡速度超过某个区域的最大速度时,发出告警, 单例 */ class module_area_over_speed:public singleton_base { private: friend class singleton_base; module_area_over_speed() { } public: void on_enter(std::shared_ptr card_ptr,std::shared_ptr&c,double speed) { card_ptr->m_speed = speed; c->m_vehicle_area_over_speed_count=0; c->m_vehicle_area_normal_speed_count=0; c->m_is_area_over_speed_vehicle=false; auto area_ptr = c->m_area; if(area_ptr->m_limit_speed > speed)//速度正常 { c->m_vehicle_area_normal_speed_count++; } else//超速 { c->m_vehicle_area_over_speed_count++; } } void on_hover(std::shared_ptr card_ptr,std::shared_ptr&c,double speed, std::map>& ev_map) { card_ptr->m_speed = speed; auto area_ptr = c->m_area; if(area_ptr->m_limit_speed > speed)//速度正常 { c->m_vehicle_area_normal_speed_count++; } else//超速 { c->m_vehicle_area_over_speed_count++; } //确定超速 if(global_constant::AREA_SPEED_COUNT_LIMIT <= c->m_vehicle_area_over_speed_count) { c->m_vehicle_area_over_speed_count=global_constant::AREA_SPEED_COUNT_LIMIT; auto ev_ptr = tool_other::find_event(card_ptr->m_id, ET_CARD_AREA_OVER_SPEED, ev_map); if(ev_ptr) { ev_ptr->m_limit_value=area_ptr->m_limit_speed; ev_ptr->m_cur_value=card_ptr->m_speed; } else//从没有告警状态转化为告警状态 { c->m_is_area_over_speed_vehicle=true; c->m_vehicle_area_normal_speed_count=0; auto ev_ptr = tool_other::create_event(OT_CARD, card_ptr->m_id, ET_CARD_AREA_OVER_SPEED); tool_other::copy_event(card_ptr, ev_ptr); ev_ptr->m_limit_value = area_ptr->m_limit_speed; ev_ptr->m_cur_value = card_ptr->m_speed; //保存到数据库 tool_db::save_event(ev_ptr); tool_other::insert_event(ev_ptr, ev_map); } } //确定速度正常 if(global_constant::AREA_SPEED_COUNT_LIMIT <= c->m_vehicle_area_normal_speed_count) { c->m_vehicle_area_normal_speed_count=global_constant::AREA_SPEED_COUNT_LIMIT; if(c->m_is_area_over_speed_vehicle) { c->m_is_area_over_speed_vehicle = false; c->m_vehicle_area_over_speed_count=0; auto ev_ptr = tool_other::find_event(card_ptr->m_id, ET_CARD_AREA_OVER_SPEED, ev_map); if(ev_ptr) { ev_ptr->m_status = ES_END; ev_ptr->m_limit_value = area_ptr->m_limit_speed; ev_ptr->m_cur_value = speed; ev_ptr->m_cur_time = std::chrono::system_clock::now(); //保存到数据库 tool_db::save_event(ev_ptr); } } } } void on_leave(std::shared_ptr card_ptr,std::shared_ptr&c,double speed) { } }; typedef std::shared_ptr module_area_over_speed_ptr; #endif