module_over_speed_vehicle.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #ifndef MODULE_OVER_SPEED_VEHICLE_H
  2. #define MODULE_OVER_SPEED_VEHICLE_H
  3. /**
  4. *@brief 车卡超速模块
  5. * @author 戴月腾
  6. * @date 2018-08-08
  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 "module_const.h"
  14. /**
  15. * @brief 区域超速类。当某张车卡速度超过某个区域的最大速度时,发出告警, 单例
  16. */
  17. class module_over_speed_vehicle:public singleton_base<module_over_speed_vehicle>
  18. {
  19. private:
  20. friend class singleton_base<module_over_speed_vehicle>;
  21. module_over_speed_vehicle()
  22. {
  23. }
  24. public:
  25. void on_hover(std::shared_ptr<card_location_base> card_ptr, int vehicle_category_id)
  26. {
  27. auto mine_tool_ptr = card_ptr->get_mine_tool();
  28. if(is_over_speed(vehicle_category_id, card_ptr->m_speed))//超速
  29. {
  30. mine_tool_ptr->m_over_speed_count++;
  31. }
  32. else//速度正常
  33. {
  34. mine_tool_ptr->m_normal_speed_count++;
  35. }
  36. //确定超速
  37. if(SPEED_COUNT_LIMIT <= mine_tool_ptr->m_over_speed_count)
  38. {
  39. mine_tool_ptr->m_over_speed_count=SPEED_COUNT_LIMIT;
  40. auto ev_ptr = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ET_CARD_OVER_SPEED);
  41. if(ev_ptr)
  42. {
  43. event_list::copy_event(card_ptr, ev_ptr);
  44. ev_ptr->m_limit_value=limit_speed(vehicle_category_id);
  45. ev_ptr->m_cur_value=card_ptr->m_speed;
  46. }
  47. else//从没有告警状态转化为告警状态
  48. {
  49. mine_tool_ptr->m_normal_speed_count=0;
  50. auto ev_ptr = event_list::create_event_card(card_ptr->m_id, card_ptr->m_type, ET_CARD_OVER_SPEED);
  51. event_list::copy_event(card_ptr, ev_ptr);
  52. ev_ptr->m_limit_value = limit_speed(vehicle_category_id);
  53. ev_ptr->m_cur_value = card_ptr->m_speed;
  54. //保存到数据库
  55. event_list::save_event(ev_ptr);
  56. event_list::instance()->add(ev_ptr->get_list_id(),ev_ptr);
  57. log_info("车卡矿井内超速开始:卡id=%d,卡type=%d,卡速=%f,卡category_id=%d,卡速门限=%f",
  58. card_ptr->m_id, card_ptr->m_type,card_ptr->m_speed,vehicle_category_id,
  59. limit_speed(vehicle_category_id));
  60. }
  61. }
  62. //确定速度正常
  63. if(SPEED_COUNT_LIMIT <= mine_tool_ptr->m_normal_speed_count)
  64. {
  65. mine_tool_ptr->m_normal_speed_count=SPEED_COUNT_LIMIT;
  66. auto ev_ptr = event_list::instance()->get_event_card(card_ptr->m_id, card_ptr->m_type, ET_CARD_OVER_SPEED);
  67. if(ev_ptr && !ev_ptr->is_end())
  68. {
  69. mine_tool_ptr->m_over_speed_count=0;
  70. event_list::copy_event(card_ptr, ev_ptr);
  71. ev_ptr->m_limit_value = limit_speed(vehicle_category_id);
  72. ev_ptr->m_cur_value = card_ptr->m_speed;
  73. ev_ptr->m_status = ES_END;
  74. //保存到数据库
  75. event_list::save_event(ev_ptr);
  76. log_info("车卡矿井内超速结束:卡id=%d,卡type=%d,卡速=%f,卡category_id=%d,卡速门限=%f",
  77. card_ptr->m_id, card_ptr->m_type,card_ptr->m_speed,vehicle_category_id,
  78. limit_speed(vehicle_category_id));
  79. }
  80. }
  81. }
  82. void init_vehicle_category_from_db()
  83. {
  84. const char *sql = "SELECT vehicle_category_id, over_speed FROM dat_vehicle_category;";
  85. std::string Error;
  86. YADB::CDBResultSet DBRes;
  87. sDBConnPool.Query(sql,DBRes,Error);
  88. if(!Error.empty())
  89. log_error("init_vehicle_category Error,%s",Error.c_str());
  90. int64_t nCount = DBRes.GetRecordCount( Error );
  91. if (nCount < 1)
  92. {
  93. log_error("错误,init_vehicle_category. The record count=%ld\n", nCount );
  94. return;
  95. }
  96. log_info( "init_vehicle_category. The record count=%ld\n", nCount );
  97. _vehicle_category_map.clear();
  98. while ( DBRes.GetNextRecod(Error) )
  99. {
  100. int vehicle_category_id = 0;
  101. DBRes.GetField( "vehicle_category_id",vehicle_category_id, Error );
  102. double over_speed = 0;
  103. DBRes.GetField( "over_speed",over_speed, Error );
  104. _vehicle_category_map.insert({vehicle_category_id,over_speed});
  105. }
  106. for(const auto &p : _vehicle_category_map)
  107. std_debug("dat_vehicle_category:category_id:%d--over_speed:%.2f",p.first,p.second);
  108. }
  109. private:
  110. bool is_over_speed(int category_id, double speed)
  111. {
  112. auto serch = _vehicle_category_map.find(category_id);
  113. if(serch == _vehicle_category_map.end())
  114. {
  115. return false;
  116. }
  117. return serch->second <= speed;
  118. }
  119. double limit_speed(int category_id) const
  120. {
  121. auto serch = _vehicle_category_map.find(category_id);
  122. if(serch == _vehicle_category_map.end())
  123. {
  124. return 0;
  125. }
  126. return serch->second;
  127. }
  128. private:
  129. std::unordered_map<int,double> _vehicle_category_map;
  130. };
  131. #endif // MODULE_OVER_SPEED_VEHICLE_H