event.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #ifndef __EVENT_HPP__
  2. #define __EVENT_HPP__
  3. #include <memory>
  4. #include <chrono>
  5. #include<map>
  6. #include<rapidjson/document.h>
  7. #include<rapidjson/writer.h>
  8. #include<rapidjson/stringbuffer.h>
  9. #include<rapidjson/prettywriter.h>
  10. #include<write-copy.h>
  11. enum EVENT_STATUS
  12. {
  13. ///事件开始
  14. ES_START = 0,
  15. ///呼救已处理状态
  16. ES_DEAL_HELP = 1,
  17. ///事件结束
  18. ES_END = 100
  19. };
  20. enum OBJECT_TYPE
  21. {
  22. ///矿井
  23. OT_MINE = 1,
  24. ///区域
  25. OT_AREA = 2,
  26. ///分站
  27. OT_DEVICE_READER = 4,
  28. ///标识卡,包括人员、车辆、自组网等
  29. OT_CARD = 9,
  30. };
  31. enum EVENT_TYPE{ // 事件类型
  32. ET_AREA_OVER_COUNT_PERSON = 3, // 区域人员超员
  33. ET_AREA_OVER_COUNT_VEHICLE = 4, // 区域车辆超员
  34. ET_READER_ERROR = 6,
  35. ET_CARD_LOW_POWER_SERIOUS = 12, // 电量极低
  36. ET_CARD_AREA_OVER_TIME_PERSON = 15, // 人员区域超时
  37. ET_CARD_AREA_OVER_TIME_VEHICLE = 16, // 车辆区域超时
  38. ET_CARD_AREA_FORBIDDEN_PERSON = 19, // 人员进入禁止区域
  39. ET_CARD_AREA_FORBIDDEN_VEHICLE = 20, // 车辆进入禁止区域
  40. ET_CARD_OVER_SPEED = 21, // 车辆超速
  41. ET_CARD_AREA_OVER_SPEED = 22, // 车辆区域超速
  42. ET_CARD_HELP = 24, // 人员呼救
  43. ET_CARD_MOTIONLESS=32,//静止不动告警
  44. ET_VEHICLE_NEAR_GEOFAULT=38,//靠近断层告警
  45. CARD_EVENT_COUNT_MAX
  46. };
  47. struct ya_event
  48. {
  49. private:
  50. uint64_t m_ev_id;
  51. public:
  52. ya_event(uint64_t e_id):m_cur_time(std::chrono::system_clock::now())
  53. {
  54. m_ev_id = e_id;
  55. m_obj_id = "";
  56. m_map_id = 0;
  57. m_area_id = 0;
  58. x = 0;
  59. y = 0;
  60. m_limit_value = 0;
  61. m_cur_value = 0;
  62. m_desc = "";
  63. m_landmarkid = 0;
  64. m_landmarkdirect = 0;
  65. m_landmarkdist = 0;
  66. m_status=ES_START;
  67. m_is_display=true;
  68. m_is_sent=false;
  69. }
  70. ~ya_event(){}
  71. public:
  72. ///告警状态,开始、结束
  73. EVENT_STATUS m_status;
  74. ///告警类型
  75. EVENT_TYPE m_ev_type;
  76. ///告警对象类型
  77. OBJECT_TYPE m_obj_type;
  78. /// 告警对象编号,与告警对象类型对应,如告警对象类型为分站,此字段为分站编号
  79. std::string m_obj_id;
  80. ///当前时间,为告警事件的触发时间,如果状态为开始,则表示开始时间,否则为结束时间
  81. std::chrono::system_clock::time_point m_cur_time;
  82. ///告警所在地图
  83. int m_map_id;
  84. ///告警所在区域
  85. int m_area_id;
  86. ///位置
  87. double x;
  88. ///位置
  89. double y;
  90. ///告警阈值
  91. double m_limit_value;
  92. ///当前值
  93. double m_cur_value;
  94. ///描述
  95. std::string m_desc;
  96. /// 地标信息
  97. int m_landmarkid;
  98. /// 与地标的距离
  99. double m_landmarkdist;
  100. /// 所处地标的方向
  101. int m_landmarkdirect;
  102. //是否显示
  103. bool m_is_display;
  104. //是否已经发送 ture bu发送, false推送. 推送完置为true
  105. bool m_is_sent;
  106. bool is_end()
  107. {
  108. return ES_END == m_status;
  109. }
  110. ///作为事件map列表的id,方便查找;
  111. uint64_t get_list_id();
  112. uint64_t get_id()
  113. {
  114. return m_ev_id;
  115. }
  116. };
  117. class Event;
  118. struct event_tool
  119. {
  120. template <class UnaryPredicate>
  121. void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,UnaryPredicate p)
  122. {
  123. handle_event(ot,et,id,limit_value,cur_value,p());
  124. }
  125. void handle_event(OBJECT_TYPE ot,EVENT_TYPE et,uint64_t id,double limit_value,double cur_value,bool f);
  126. static event_tool * instance();
  127. private:
  128. event_tool()
  129. {
  130. make_event_object();
  131. }
  132. void make_event_object();
  133. std::map<OBJECT_TYPE,std::shared_ptr<Event>> m_map;
  134. };
  135. struct event_list:single_base<event_list,uint64_t,std::shared_ptr<ya_event>>
  136. {
  137. public:
  138. static uint64_t to_list_id(EVENT_TYPE ev_type, OBJECT_TYPE obj_type,uint64_t obj_id)
  139. {
  140. return (static_cast<uint64_t>(ev_type)<<48)|(static_cast<uint64_t>(obj_type)<<40)|obj_id;
  141. }
  142. std::shared_ptr<ya_event> get_event_card(uint32_t card_id, int card_type, EVENT_TYPE ev_type);
  143. std::shared_ptr<ya_event> get_event_area(int32_t area_id, EVENT_TYPE ev_type)
  144. {
  145. return base::get(to_list_id(ev_type, OT_AREA, static_cast<uint64_t>(area_id)));
  146. }
  147. std::shared_ptr<ya_event> get_event_reader(int32_t reader_id, EVENT_TYPE ev_type)
  148. {
  149. return base::get(to_list_id(ev_type,OT_DEVICE_READER, static_cast<uint64_t>(reader_id)));
  150. }
  151. static void save_event(std::shared_ptr<ya_event> event_ptr);
  152. void load_his_data_from_db();
  153. ~event_list(){}
  154. static std::string ev_to_json(std::shared_ptr<ya_event> ev_ptr)
  155. {
  156. std::vector<std::shared_ptr<ya_event>> evs;
  157. evs.push_back(ev_ptr);
  158. return evs_to_json(evs);
  159. }
  160. static std::string evs_to_json(std::vector<std::shared_ptr<ya_event>> arr);
  161. private:
  162. static void _ev_to_node(std::shared_ptr<ya_event> ev_ptr,
  163. rapidjson::Document::AllocatorType& allocator,
  164. rapidjson::Value& out_data);
  165. };
  166. #endif