123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- struct area
- {
- uint32_t m_id;
- std::string m_name;
- std::atomic<int> m_card_count;
- int id();
- std::string name();
- int get_card_count();
- double get_limit_speed();
- double get_limit_time_second();
- double get_limit_card_count();
- virtual int type()=0;//site:0,normal:1
- void inc_card_count(int deta)
- {
- }
- virtual void on_hover(int card_id,const point&pt)=0;
- virtual void on_enter(int card_id,std::shared_ptr<area> prev,const point&pt)=0;
- virtual void on_leave(int card_id,std::shared_ptr<area> next,const point&pt)=0;
- virtual ~area(){}
- };
- struct normal_area:area
- {
- std::vector<point> m_bound;
- };
- struct site_area:area
- {
- int32_t m_site_id;
- };
- struct area_main
- {
- std::vector<std::shared_ptr<area>> m_normal_list,m_site_list;
- std::shared_ptr<area> get_site_area(int site_id);
- std::shared_ptr<area> get_normal_area(int id);
- std::vector<std::shared_ptr<area>> get_normal_area(const point&pt);
- static std::shared_ptr<area_main> instance();
- };
- struct area_hover
- {
- std::shared_ptr<area> m_area;
- time_t m_enter_time,m_last_time;
- void reset()
- {
- m_last_time=time(0);
- }
- void reset(std::shared_ptr<area> a, time_t enter_time=0)
- {
- m_area=a;
- if(enter_time)
- {
- m_enter_time=m_last_time=enter_time;
- }
- else
- {
- m_last_time=time(0);
- }
- }
- bool operator == (const area_hover&o)const
- {
- return m_area->id()==o->m_area->id();
- }
- bool operator < (const area_hover&o)const
- {
- return m_area->id()<o->m_area->id();
- }
- };
- struct card_area_tool
- {
- area_hover m_site;
- std::vector<area_hover> m_normal;
- point m_last_point;
- void on_point(int card_id,int site_id,const point&pt,double speed)
- {
- //处理分站类型的区域
- std::shared_ptr<area> a=area_main::instance()->get_site_area(site_id);
- if(pt.empty())//解算前
- {
- if(m_site==nullptr)
- {
- a->on_enter(card_id,nullptr);
- }
- else
- {
- if(*m_site==*a) { }
- else//离开分站范围,进入新的分站范围
- {
- m_site->on_leave(card_id,a);
- a->on_enter(card_id,m_site);
- m_site=a;
- }
- }
- return;
- }
- std::vector<std::shared_ptr<area>> areas=get_normal_area(pt);//找出所有的区域
- for(a:m_site-areas)//离开的区域
- {
- a.on_leave();
-
- area *a=area_main_inst->get_normal_area(pt);
- on_site_area_point(a,card_id);
- }
- }
- //插入进入新分站记录 //离开分站时更新记录//本版本只在数据库生成记录
- void on_site_area_point(a,card_id,site_id,speed)
- {
- if(enter) do_att_biz(a,card_id);
- }
- //人卡考勤
- void do_att_biz(a,card_id)
- {
-
-
- }
- //生成卡进入区域、在区域活跃和离开区域的调用
- void on_normal_area_point(a,card_id,pt,speed)
- {
- if(hover) do_hover_biz(a,card_id,pt,speed);
- if(enter) do_enter_biz(a,card_id,pt,speed);
- }
- //检测是否超时
- void on_timer(card_id)
- {
-
- }
- void do_hover_biz(a,card_id,pt,speed)
- {
- //区域超时超时检测
- //区域超速检测
- //电子围栏检测
- }
- void do_enter_biz(a,card_id,pt,speed)
- {
- //当前区域超员检测
- //车卡考勤逻辑检测
- //电子围栏检测
- }
- };
- struct person_card:card
- {
- card_area_tool*m_area_tool;
- void on_point(int site_id,const point&pt,double speed)
- {
- m_area_tool->on_point(m_id,site_id,pt,speed);
- }
- };
|