123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- #include "module_web.h"
- #include "module_call_help.h"
- #include "module_call.h"
- #include "area_business_person_attendance.h"
- #include "module_meta_data_changed.h"
- #include "common_tool.h"
- #include "event.h"
- #include "log.h"
- #include "module_traffic_light_manager.h"
- #include "websocket/wsTimerThread.h"
- #include "load_raw.h"
- #include "sys_setting.h"
- #include <thread>
- static std::string s_file_path;
- // 只支持记录导入,不补报警等信息。
- void *callback(void* arg)
- {
- load_raw loader;
- loader.load_file(s_file_path.c_str());
- swsTimerThrd.upt_load_history_completed();
- return NULL;
- }
- /*
- * @brief 处理请求端的请求类型,根据不同请求类型调用不同的业务模块处理
- * @param int ID 回调函数id
- * @param std::string const& name 请求命令字
- * @param sio::message::ptr const& data json数据字符串
- * @param bool need_ack 是否响应
- * @param sio::message::list& ack_resp 响应状态
- * @return 无
- * @note
- * @warning
- * @bug
- * */
- void module_web::accept( int ID, std::string const& name,
- sio::message::ptr const& data, bool need_ack, sio::message::list &ack_resp )
- {
- try
- {
- if (data->get_flag() != sio::message::flag_object)
- {
- log_error("web发来的数据不是对象");
- return;
- }
- log_info("web_data:%s", data->to_string().c_str());
- std::string cmd = "";
- if (!tool_map::try_get_value(cmd, JSON_ROOT_KEY_CMD, data) || cmd.empty())
- {
- log_error("web发来的数据cmd字段为空");
- return;
- }
- log_info("web发来的数据 cmd=%s", cmd.c_str());
- if (JSON_CMD_VALUE_CLEAR_CARD == cmd)
- {
- // 手动升井
- area_business_person_attendance::handle_up_mine(data);
- }
- else if (JSON_CMD_VALUE_REQUEST_ALL_DATA == cmd)
- {
- // web登录请求所有信息
- module_web::instance()->response_login();
- }
- else if (JSON_CMD_REQ_ALL_PERSON_ON_CAR == cmd)
- {
- // 人上车数据
- }
- else if (JSON_CMD_VALUE_LIGHTS_CTRL_REQUEST == cmd) {
- // 红绿灯手动控制
- traffic_light_manager::instance()->manual_ctrl(data);
- }
- else if (JSON_CMD_VALUE_LOAD_HISTORY_REQUEST == cmd) {
- // 导入历史数据
- std::map<std::string, sio::message::ptr> mp = data->get_map()[JSON_ROOT_KEY_DATA]->get_map();
- log_info("[load_history] map's size=%d", mp.size());
- s_file_path = mp["file_path"]->get_string();
- pthread_t tid;
- pthread_create(&tid, NULL, callback, NULL); //callback 是一个回调函数
- }
- else if (JSON_KEY_NAME_SETTING == cmd) {
- std::this_thread::sleep_for(std::chrono::milliseconds(300));
- CYaSetting::Init_sys_setting();
- }
- else
- {
- sio::message::ptr data_value;
- if (!tool_map::try_get_value(data_value, JSON_ROOT_KEY_DATA, data))
- {
- log_error("web发来的 %s 数据data字段格式不对, 不是map", cmd.c_str());
- return;
- }
- if (JSON_CMD_VALUE_META_DATA_CHANGED == cmd)///基础数据
- {
- module_meta_data_changed::instance()->accept(data_value);
- }
- else if (JSON_CMD_VALUE_DEAL_HELP == cmd) // 处理呼救信息
- {
- module_call_help::instance()->accept_web_deal_help(data_value);
- }
- else if (JSON_CMD_VALUE_CALL_CARD_REQUEST == cmd)//呼叫
- {
- module_call::instance()->accept_call(data_value);
- }
- else if (JSON_CMD_VALUE_CALL_CARD_CANCEL_REQUEST == cmd)//取消呼叫
- {
- module_call::instance()->accept_cancel(data_value);
- }
- }
- }
- catch (...)
- {
- log_error("web发来的数据data字段格式不对");
- }
- }
- /*
- * @brief 客户端发起请求所有数据请求,采集构造相关事件数据并发送给请求端
- * @param 无
- * @return 无
- * @note
- * 1.增加红绿灯告警 2021/03/05
- * 2.增加人车防碰撞告警 2021/03/16
- * @warning
- * @bug
- * */
- void module_web::response_login()
- {
- rapidjson::Document doc(rapidjson::kObjectType);
- auto& allocator = doc.GetAllocator();
- rapidjson::Value nodes(rapidjson::kArrayType);
- //所有的呼叫信息
- std::string str=module_call::instance()->accept_login();
- if(!str.empty())
- {
- tool_json::push_back(nodes, str, allocator);
- }
- //所有告警
- std::vector<std::shared_ptr<ya_event>> arr;
- _get_all_events(arr);
- if(!arr.empty())
- {
- tool_json::push_back(nodes, event_list::evs_to_json(arr), allocator);
- tool_json::push_back(nodes, event_list::evs_to_json_v(arr), allocator);
- }
- //所有红绿灯信息
- /*str = traffic_light_manager::instance()->get_light_state();
- if(!str.empty()){
- tool_json::push_back(nodes, str, allocator);
- }*/
- // 防碰撞告警
- /*str = module_call::instance()->get_json_anti_collision();
- if(!str.empty()){
- tool_json::push_back(nodes, str, allocator);
- }*/
- if(nodes.Size()>0)
- {
- doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_RESPONSE_ALL_DATA, allocator);
- doc.AddMember(JSON_ROOT_KEY_VERSION, INTERFACE_VERSION, allocator);
- doc.AddMember(JSON_ROOT_KEY_DATA, nodes, allocator);
- swsClientMgr.send(JSON_CMD_VALUE_PUSH, tool_json::doc_to_json(doc));
- }
- }
- /*
- * @brief 构造事件列表,并发送给web端
- * 将所有事件包括:红绿灯失联、基站失联、超速、人车防碰撞告警发送给web端
- * @param 无
- * @return 无
- * @note
- * @warning
- * @bug
- * */
- void module_web::run()
- {
- std::vector<std::shared_ptr<ya_event>> arr;
- _get_all_events(arr);
- if(!arr.empty())//发送给web端
- {
- _delete_end(arr);
- std::string tmp = event_list::evs_to_json(arr);
- swsClientMgr.send(JSON_CMD_VALUE_PUSH, tmp);
- tmp = event_list::evs_to_json_v(arr);
- swsClientMgr.send(JSON_CMD_VALUE_PUSH, tmp);
- }
- // 向web端发送呼救数据
- /*std::string help = module_call_help::get_json_help();
- if(!help.empty())
- {
- swsClientMgr.send(JSON_CMD_VALUE_PUSH, help);
- }*/
- }
- /*
- * @brief 获得所有未发送的系统事件
- * @param [in] std::vector<std::shared_ptr<ya_event>>& arr 事件数组
- * @param [in] bool f 是否需要加入事件列表标志
- * @return 无
- * @note
- * @warning
- * @bug
- * */
- void module_web::_get_all_events(std::vector<std::shared_ptr<ya_event>>& arr,bool f)
- {
- auto _map = event_list::instance()->m_map;
- auto it_map = _map.begin();
- for(;it_map!=_map.end();++it_map)
- {
- //if(f && it_map->second->m_is_sent && !it_map->second->is_end())
- if(f && !it_map->second->is_end())
- continue;
- else
- it_map->second->m_is_sent=true;
- arr.push_back(it_map->second);
- }
- }
- /*
- * @brief 在全局列表中删除已经处理或结束了的告警
- * @param std::vector<std::shared_ptr<ya_event>>& arr 事件数组
- * @return 无
- * @note
- * @warning
- * @bug
- * */
- void module_web::_delete_end(std::vector<std::shared_ptr<ya_event>>& arr)
- {
- std::vector<uint64_t> todelete;
- auto arr_iter = arr.begin();
- for(;arr_iter!=arr.end();++arr_iter)
- if((*arr_iter)->is_end())//删除掉已经处理的
- todelete.push_back((*arr_iter)->get_list_id());
- if(!todelete.empty())
- event_list::instance()->remove(todelete);
- }
|