1
0

module_web.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. #include "module_web.h"
  2. #include "module_call_help.h"
  3. #include "module_call.h"
  4. #include "area_business_person_attendance.h"
  5. #include "module_meta_data_changed.h"
  6. #include "common_tool.h"
  7. #include "event.h"
  8. #include "log.h"
  9. #include "module_traffic_light_manager.h"
  10. #include "websocket/wsTimerThread.h"
  11. #include "load_raw.h"
  12. #include "sys_setting.h"
  13. #include <thread>
  14. static std::string s_file_path;
  15. // 只支持记录导入,不补报警等信息。
  16. void *callback(void* arg)
  17. {
  18. load_raw loader;
  19. loader.load_file(s_file_path.c_str());
  20. swsTimerThrd.upt_load_history_completed();
  21. return NULL;
  22. }
  23. /*
  24. * @brief 处理请求端的请求类型,根据不同请求类型调用不同的业务模块处理
  25. * @param int ID 回调函数id
  26. * @param std::string const& name 请求命令字
  27. * @param sio::message::ptr const& data json数据字符串
  28. * @param bool need_ack 是否响应
  29. * @param sio::message::list& ack_resp 响应状态
  30. * @return 无
  31. * @note
  32. * @warning
  33. * @bug
  34. * */
  35. void module_web::accept( int ID, std::string const& name,
  36. sio::message::ptr const& data, bool need_ack, sio::message::list &ack_resp )
  37. {
  38. try
  39. {
  40. if (data->get_flag() != sio::message::flag_object)
  41. {
  42. log_error("web发来的数据不是对象");
  43. return;
  44. }
  45. log_info("web_data:%s", data->to_string().c_str());
  46. std::string cmd = "";
  47. if (!tool_map::try_get_value(cmd, JSON_ROOT_KEY_CMD, data) || cmd.empty())
  48. {
  49. log_error("web发来的数据cmd字段为空");
  50. return;
  51. }
  52. log_info("web发来的数据 cmd=%s", cmd.c_str());
  53. if (JSON_CMD_VALUE_CLEAR_CARD == cmd)
  54. {
  55. // 手动升井
  56. area_business_person_attendance::handle_up_mine(data);
  57. }
  58. else if (JSON_CMD_VALUE_REQUEST_ALL_DATA == cmd)
  59. {
  60. // web登录请求所有信息
  61. module_web::instance()->response_login();
  62. }
  63. else if (JSON_CMD_REQ_ALL_PERSON_ON_CAR == cmd)
  64. {
  65. // 人上车数据
  66. }
  67. else if (JSON_CMD_VALUE_LIGHTS_CTRL_REQUEST == cmd) {
  68. // 红绿灯手动控制
  69. traffic_light_manager::instance()->manual_ctrl(data);
  70. }
  71. else if (JSON_CMD_VALUE_LOAD_HISTORY_REQUEST == cmd) {
  72. // 导入历史数据
  73. std::map<std::string, sio::message::ptr> mp = data->get_map()[JSON_ROOT_KEY_DATA]->get_map();
  74. log_info("[load_history] map's size=%d", mp.size());
  75. s_file_path = mp["file_path"]->get_string();
  76. pthread_t tid;
  77. pthread_create(&tid, NULL, callback, NULL); //callback 是一个回调函数
  78. }
  79. else if (JSON_KEY_NAME_SETTING == cmd) {
  80. std::this_thread::sleep_for(std::chrono::milliseconds(300));
  81. CYaSetting::Init_sys_setting();
  82. }
  83. else
  84. {
  85. sio::message::ptr data_value;
  86. if (!tool_map::try_get_value(data_value, JSON_ROOT_KEY_DATA, data))
  87. {
  88. log_error("web发来的 %s 数据data字段格式不对, 不是map", cmd.c_str());
  89. return;
  90. }
  91. if (JSON_CMD_VALUE_META_DATA_CHANGED == cmd)///基础数据
  92. {
  93. module_meta_data_changed::instance()->accept(data_value);
  94. }
  95. else if (JSON_CMD_VALUE_DEAL_HELP == cmd) // 处理呼救信息
  96. {
  97. module_call_help::instance()->accept_web_deal_help(data_value);
  98. }
  99. else if (JSON_CMD_VALUE_CALL_CARD_REQUEST == cmd)//呼叫
  100. {
  101. module_call::instance()->accept_call(data_value);
  102. }
  103. else if (JSON_CMD_VALUE_CALL_CARD_CANCEL_REQUEST == cmd)//取消呼叫
  104. {
  105. module_call::instance()->accept_cancel(data_value);
  106. }
  107. }
  108. }
  109. catch (...)
  110. {
  111. log_error("web发来的数据data字段格式不对");
  112. }
  113. }
  114. /*
  115. * @brief 客户端发起请求所有数据请求,采集构造相关事件数据并发送给请求端
  116. * @param 无
  117. * @return 无
  118. * @note
  119. * 1.增加红绿灯告警 2021/03/05
  120. * 2.增加人车防碰撞告警 2021/03/16
  121. * @warning
  122. * @bug
  123. * */
  124. void module_web::response_login()
  125. {
  126. rapidjson::Document doc(rapidjson::kObjectType);
  127. auto& allocator = doc.GetAllocator();
  128. rapidjson::Value nodes(rapidjson::kArrayType);
  129. //所有的呼叫信息
  130. std::string str=module_call::instance()->accept_login();
  131. if(!str.empty())
  132. {
  133. tool_json::push_back(nodes, str, allocator);
  134. }
  135. //所有告警
  136. std::vector<std::shared_ptr<ya_event>> arr;
  137. _get_all_events(arr);
  138. if(!arr.empty())
  139. {
  140. tool_json::push_back(nodes, event_list::evs_to_json(arr), allocator);
  141. tool_json::push_back(nodes, event_list::evs_to_json_v(arr), allocator);
  142. }
  143. //所有红绿灯信息
  144. /*str = traffic_light_manager::instance()->get_light_state();
  145. if(!str.empty()){
  146. tool_json::push_back(nodes, str, allocator);
  147. }*/
  148. // 防碰撞告警
  149. /*str = module_call::instance()->get_json_anti_collision();
  150. if(!str.empty()){
  151. tool_json::push_back(nodes, str, allocator);
  152. }*/
  153. if(nodes.Size()>0)
  154. {
  155. doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_RESPONSE_ALL_DATA, allocator);
  156. doc.AddMember(JSON_ROOT_KEY_VERSION, INTERFACE_VERSION, allocator);
  157. doc.AddMember(JSON_ROOT_KEY_DATA, nodes, allocator);
  158. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::doc_to_json(doc));
  159. }
  160. }
  161. /*
  162. * @brief 构造事件列表,并发送给web端
  163. * 将所有事件包括:红绿灯失联、基站失联、超速、人车防碰撞告警发送给web端
  164. * @param 无
  165. * @return 无
  166. * @note
  167. * @warning
  168. * @bug
  169. * */
  170. void module_web::run()
  171. {
  172. std::vector<std::shared_ptr<ya_event>> arr;
  173. _get_all_events(arr);
  174. if(!arr.empty())//发送给web端
  175. {
  176. _delete_end(arr);
  177. std::string tmp = event_list::evs_to_json(arr);
  178. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tmp);
  179. tmp = event_list::evs_to_json_v(arr);
  180. swsClientMgr.send(JSON_CMD_VALUE_PUSH, tmp);
  181. }
  182. // 向web端发送呼救数据
  183. /*std::string help = module_call_help::get_json_help();
  184. if(!help.empty())
  185. {
  186. swsClientMgr.send(JSON_CMD_VALUE_PUSH, help);
  187. }*/
  188. }
  189. /*
  190. * @brief 获得所有未发送的系统事件
  191. * @param [in] std::vector<std::shared_ptr<ya_event>>& arr 事件数组
  192. * @param [in] bool f 是否需要加入事件列表标志
  193. * @return 无
  194. * @note
  195. * @warning
  196. * @bug
  197. * */
  198. void module_web::_get_all_events(std::vector<std::shared_ptr<ya_event>>& arr,bool f)
  199. {
  200. auto _map = event_list::instance()->m_map;
  201. auto it_map = _map.begin();
  202. for(;it_map!=_map.end();++it_map)
  203. {
  204. //if(f && it_map->second->m_is_sent && !it_map->second->is_end())
  205. if(f && !it_map->second->is_end())
  206. continue;
  207. else
  208. it_map->second->m_is_sent=true;
  209. arr.push_back(it_map->second);
  210. }
  211. }
  212. /*
  213. * @brief 在全局列表中删除已经处理或结束了的告警
  214. * @param std::vector<std::shared_ptr<ya_event>>& arr 事件数组
  215. * @return 无
  216. * @note
  217. * @warning
  218. * @bug
  219. * */
  220. void module_web::_delete_end(std::vector<std::shared_ptr<ya_event>>& arr)
  221. {
  222. std::vector<uint64_t> todelete;
  223. auto arr_iter = arr.begin();
  224. for(;arr_iter!=arr.end();++arr_iter)
  225. if((*arr_iter)->is_end())//删除掉已经处理的
  226. todelete.push_back((*arr_iter)->get_list_id());
  227. if(!todelete.empty())
  228. event_list::instance()->remove(todelete);
  229. }