area_business_person_dwell_checker.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include "area.h"
  2. #include "card_base.h"
  3. #include "event.h"
  4. #include "tool_time.h"
  5. #include "common_tool.h"
  6. #include "log.h"
  7. #include "area_business_person_dwell_checker.h"
  8. /*
  9. 判断当前区域a中的人卡停留时间
  10. 人员进入区域时间存储在area_hover对象中,在当前类on_enter/on_leave中进行更新
  11. 人员&车辆的代码重用,请自行设计
  12. */
  13. struct SPersonDwellChecker : business_data
  14. {
  15. int m_enter_time;
  16. point m_enter_point;
  17. int m_level_time;
  18. point m_level_point;
  19. bool m_send_event; // 是否发生告警
  20. SPersonDwellChecker()
  21. {
  22. m_enter_time = 0;
  23. m_level_time = 0;
  24. m_send_event = false;
  25. }
  26. };
  27. //进入区域,记录进入时间
  28. void area_business_person_dwell_checker::on_enter(const std::shared_ptr<area_hover>&a,
  29. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data>&ptr)
  30. {
  31. if (nullptr == ptr)
  32. {
  33. ptr = std::make_shared<SPersonDwellChecker>();
  34. }
  35. auto ptr_temp = dynamic_cast<SPersonDwellChecker*>(ptr.get());
  36. ptr_temp->m_enter_point.set(c->x,c->y,c->z);
  37. ptr_temp->m_enter_time = tool_time::now_to_seconds();
  38. ptr_temp->m_level_time = 0;
  39. ptr_temp->m_level_point.set(0,0,0);
  40. a->m_data[this->area_business_type()] = ptr;
  41. log_info("area_business_person_dwell_checker::on_enter : In Area=%d Card = %d ",a->m_area->is_mine(),c->m_id);
  42. }
  43. //判断是否超时
  44. void area_business_person_dwell_checker::on_hover(const std::shared_ptr<area_hover>&a,
  45. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
  46. {
  47. auto ptr_temp = dynamic_cast<SPersonDwellChecker*>(ptr.get());
  48. if(nullptr == ptr_temp || ptr_temp->m_enter_time == 0)
  49. {
  50. return ;
  51. }
  52. double limit_val = 0;
  53. double cur_val = ( tool_time::now_to_seconds() - ptr_temp->m_enter_time);
  54. EVENT_TYPE evType = EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
  55. if(c->is_person())
  56. {
  57. if (a->m_area->m_limit_person_second > cur_val)
  58. {
  59. return;
  60. }
  61. ptr_temp->m_send_event = true;
  62. evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
  63. limit_val = a->m_area->m_limit_person_second;
  64. }
  65. else if (c->is_vehicle())
  66. {
  67. return ;
  68. }
  69. else
  70. {
  71. return;
  72. }
  73. uint64_t id = tool_other::type_id_to_u64(c->m_type, c->m_id);
  74. event_tool::instance()->handle_event(OT_CARD,evType,id,limit_val,cur_val,true);
  75. }
  76. //如果有超时告警,取消超时告警
  77. void area_business_person_dwell_checker::on_leave(const std::shared_ptr<area_hover>&a,
  78. const std::shared_ptr<card_location_base>&c,std::shared_ptr<business_data> ptr)
  79. {
  80. auto ptr_temp = dynamic_cast<SPersonDwellChecker*>(ptr.get());
  81. if(nullptr == ptr_temp)
  82. {
  83. return ;
  84. }
  85. ptr_temp->m_level_point.set(c->x,c->y,c->z);
  86. ptr_temp->m_level_time = tool_time::now_to_seconds();
  87. ptr_temp->m_enter_point.set(0,0,0);
  88. ptr_temp->m_enter_time = 0;
  89. ptr_temp->m_send_event = false;
  90. EVENT_TYPE evType = EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
  91. if(c->is_person())
  92. {
  93. evType = a->m_area->is_mine() ? EVENT_TYPE::ET_CARD_OVER_TIME_PERSON : EVENT_TYPE::ET_CARD_AREA_OVER_TIME_PERSON;
  94. }
  95. else
  96. {
  97. return ;
  98. }
  99. uint64_t id = tool_other::type_id_to_u64(c->m_type, c->m_id);
  100. event_tool::instance()->handle_event(OT_CARD,evType,id,0,0,false);
  101. }