module_area_timeout.h 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #ifndef MODULE_AREA_TIMEOUT_H
  2. #define MODULE_AREA_TIMEOUT_H
  3. /**
  4. * @brief 区域超时
  5. * @author 戴月腾
  6. * @date 2018-10-10
  7. */
  8. #include <mutex>
  9. #include <map>
  10. #include <chrono>
  11. #include <boost/thread.hpp>
  12. #include <boost/enable_shared_from_this.hpp>
  13. #include "point.h"
  14. #include "module_const.h"
  15. class module_area_timeout:public singleton_base<module_area_timeout>
  16. {
  17. private:
  18. friend class singleton_base<module_area_timeout>;
  19. module_area_timeout()
  20. {
  21. }
  22. public:
  23. void on_enter(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
  24. {
  25. // c->m_enter_time = card_ptr->m_time/1000;
  26. // EVENT_TYPE ev_type = card_ptr->is_person() ? ET_CARD_AREA_OVER_TIME_PERSON : ET_AREA_OVER_COUNT_VEHICLE;
  27. // //中途服务器宕机处理
  28. // if(auto ev_ptr = event_list::instance()->get(card_ptr->m_id, ev_type))
  29. // {
  30. // c->m_enter_time = std::chrono::system_clock::to_time_t(ev_ptr->m_cur_time);
  31. // }
  32. // else
  33. // {
  34. // std::time(&c->m_enter_time);
  35. // }
  36. }
  37. void on_hover(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
  38. {
  39. auto area_ptr = c->m_area;
  40. int limit = area_ptr->m_limit_person_second;
  41. EVENT_TYPE ev_type = ET_CARD_AREA_OVER_TIME_PERSON;
  42. if(card_ptr->is_vehicle())
  43. {
  44. limit = area_ptr->m_limit_vehicle_second;
  45. ev_type = ET_CARD_AREA_OVER_TIME_VEHICLE;
  46. }
  47. int seconds = tool_time::elapse_seconds(c->m_enter_time);
  48. if(seconds > limit)//发生告警
  49. {
  50. auto ev_ptr = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ev_type);
  51. if(ev_ptr)
  52. {
  53. event_list::copy_event(card_ptr, ev_ptr);
  54. ev_ptr->m_limit_value = limit;
  55. ev_ptr->m_cur_value = seconds;
  56. }
  57. else//从没有告警状态转化为告警状态
  58. {
  59. ev_ptr = event_list::create_event_card(card_ptr->m_id, card_ptr->m_type, ev_type);
  60. event_list::copy_event(card_ptr, ev_ptr);
  61. ev_ptr->m_limit_value = limit;
  62. ev_ptr->m_cur_value = seconds;
  63. //保存到数据库
  64. event_list::save_event(ev_ptr);
  65. event_list::instance()->add(ev_ptr->get_list_id(),ev_ptr);
  66. log_info("卡区域超时开始:卡id=%d,卡type=%d,区域id=%d,时间门限=%d,呆的时间长度=%d",
  67. card_ptr->m_id, card_ptr->m_type,
  68. area_ptr->id(), limit, seconds);
  69. }
  70. }
  71. }
  72. void on_leave(std::shared_ptr<card_location_base> card_ptr,std::shared_ptr<area_hover>&c)
  73. {
  74. auto area_ptr = c->m_area;
  75. int limit = area_ptr->m_limit_person_second;
  76. EVENT_TYPE ev_type = ET_CARD_AREA_OVER_TIME_PERSON;
  77. if(card_ptr->is_vehicle())
  78. {
  79. limit = area_ptr->m_limit_vehicle_second;
  80. ev_type = ET_CARD_AREA_OVER_TIME_VEHICLE;
  81. }
  82. auto ev_ptr = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ev_type);
  83. if(ev_ptr && !ev_ptr->is_end())//有超时告警就删除
  84. {
  85. event_list::copy_event(card_ptr, ev_ptr);
  86. ev_ptr->m_limit_value = limit;
  87. ev_ptr->m_cur_value = tool_time::elapse_seconds(c->m_enter_time);
  88. ev_ptr->m_status = ES_END;
  89. //保存到数据库
  90. event_list::save_event(ev_ptr);
  91. log_info("卡区域超时结束:卡id=%d,卡type=%d,区域id=%d,时间门限=%d",
  92. card_ptr->m_id, card_ptr->m_type,
  93. area_ptr->id(), limit);
  94. }
  95. }
  96. };
  97. #endif // MODULE_AREA_TIMEOUT_H