c2.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. struct area
  2. {
  3. uint32_t m_id;
  4. std::string m_name;
  5. std::atomic<int> m_card_count;
  6. int id();
  7. std::string name();
  8. int get_card_count();
  9. double get_limit_speed();
  10. double get_limit_time_second();
  11. double get_limit_card_count();
  12. virtual int type()=0;//site:0,normal:1
  13. void inc_card_count(int deta)
  14. {
  15. }
  16. virtual void on_hover(int card_id,const point&pt)=0;
  17. virtual void on_enter(int card_id,std::shared_ptr<area> prev,const point&pt)=0;
  18. virtual void on_leave(int card_id,std::shared_ptr<area> next,const point&pt)=0;
  19. virtual ~area(){}
  20. };
  21. struct normal_area:area
  22. {
  23. std::vector<point> m_bound;
  24. };
  25. struct site_area:area
  26. {
  27. int32_t m_site_id;
  28. };
  29. struct area_main
  30. {
  31. std::vector<std::shared_ptr<area>> m_normal_list,m_site_list;
  32. std::shared_ptr<area> get_site_area(int site_id);
  33. std::shared_ptr<area> get_normal_area(int id);
  34. std::vector<std::shared_ptr<area>> get_normal_area(const point&pt);
  35. static std::shared_ptr<area_main> instance();
  36. };
  37. struct area_hover
  38. {
  39. std::shared_ptr<area> m_area;
  40. time_t m_enter_time,m_last_time;
  41. void reset()
  42. {
  43. m_last_time=time(0);
  44. }
  45. void reset(std::shared_ptr<area> a, time_t enter_time=0)
  46. {
  47. m_area=a;
  48. if(enter_time)
  49. {
  50. m_enter_time=m_last_time=enter_time;
  51. }
  52. else
  53. {
  54. m_last_time=time(0);
  55. }
  56. }
  57. bool operator == (const area_hover&o)const
  58. {
  59. return m_area->id()==o->m_area->id();
  60. }
  61. bool operator < (const area_hover&o)const
  62. {
  63. return m_area->id()<o->m_area->id();
  64. }
  65. };
  66. struct card_area_tool
  67. {
  68. area_hover m_site;
  69. std::vector<area_hover> m_normal;
  70. point m_last_point;
  71. void on_point(int card_id,int site_id,const point&pt,double speed)
  72. {
  73. //处理分站类型的区域
  74. std::shared_ptr<area> a=area_main::instance()->get_site_area(site_id);
  75. if(pt.empty())//解算前
  76. {
  77. if(m_site==nullptr)
  78. {
  79. a->on_enter(card_id,nullptr);
  80. }
  81. else
  82. {
  83. if(*m_site==*a) { }
  84. else//离开分站范围,进入新的分站范围
  85. {
  86. m_site->on_leave(card_id,a);
  87. a->on_enter(card_id,m_site);
  88. m_site=a;
  89. }
  90. }
  91. return;
  92. }
  93. std::vector<std::shared_ptr<area>> areas=get_normal_area(pt);//找出所有的区域
  94. for(a:m_site-areas)//离开的区域
  95. {
  96. a.on_leave();
  97. area *a=area_main_inst->get_normal_area(pt);
  98. on_site_area_point(a,card_id);
  99. }
  100. }
  101. //插入进入新分站记录 //离开分站时更新记录//本版本只在数据库生成记录
  102. void on_site_area_point(a,card_id,site_id,speed)
  103. {
  104. if(enter) do_att_biz(a,card_id);
  105. }
  106. //人卡考勤
  107. void do_att_biz(a,card_id)
  108. {
  109. }
  110. //生成卡进入区域、在区域活跃和离开区域的调用
  111. void on_normal_area_point(a,card_id,pt,speed)
  112. {
  113. if(hover) do_hover_biz(a,card_id,pt,speed);
  114. if(enter) do_enter_biz(a,card_id,pt,speed);
  115. }
  116. //检测是否超时
  117. void on_timer(card_id)
  118. {
  119. }
  120. void do_hover_biz(a,card_id,pt,speed)
  121. {
  122. //区域超时超时检测
  123. //区域超速检测
  124. //电子围栏检测
  125. }
  126. void do_enter_biz(a,card_id,pt,speed)
  127. {
  128. //当前区域超员检测
  129. //车卡考勤逻辑检测
  130. //电子围栏检测
  131. }
  132. };
  133. struct person_card:card
  134. {
  135. card_area_tool*m_area_tool;
  136. void on_point(int site_id,const point&pt,double speed)
  137. {
  138. m_area_tool->on_point(m_id,site_id,pt,speed);
  139. }
  140. };