YAServerDlg.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  1. // YAServerDlg.h : 头文件
  2. #pragma once
  3. #include "afxwin.h"
  4. #include "resource.h"
  5. #include "structdef.h"
  6. #include "constdef.h"
  7. #include "def_msg.h"
  8. #include "socketdef.h"
  9. #include "ReportCtrl/ReportCtrl.h"
  10. #include <sio_client.h>
  11. #include "../thirdparty/include/iocp/Src/TcpServer.h"
  12. #include "../thirdparty/include/iocp/Global/helper.h"
  13. #include "afxcmn.h"
  14. #include "./SyncTime/SyncManager.h"
  15. #include "classdef.h"
  16. #include "QueueStrManager.h"
  17. #include "uwb_msg_def.h"
  18. #include <json/json.h>
  19. #include "MysqlConnPool.h"
  20. extern BOOL m_log_sys_status;
  21. using namespace sio;
  22. using namespace std;
  23. using namespace HostServer;
  24. struct _SLS // system_limit_setting
  25. {
  26. unsigned int over_count_person;
  27. unsigned int over_count_vehicle;
  28. unsigned int over_time_person;
  29. unsigned int over_time_vehicle;
  30. double over_speed;
  31. };
  32. struct _DBS // db setting
  33. {
  34. string host;
  35. string user;
  36. string password;
  37. string dbname;
  38. string encoding;
  39. int port;
  40. };
  41. struct _SOCK
  42. {
  43. CString sip;
  44. DWORD dwConnID;
  45. int state; // 0 连接
  46. DWORD reader_id; // 分站号
  47. DEVICE_TYPE reader_type; // 通信分站、读卡分站
  48. };
  49. struct _SOCKET_BUFFER
  50. {
  51. DWORD dwConnID;
  52. BYTE pData[LENGTH_MSG_1M];
  53. WORD wLen;
  54. WORD wReadLen;
  55. _SOCKET_BUFFER(){
  56. dwConnID = 0;
  57. wLen = 0;
  58. wReadLen = 0;
  59. memset(pData,0,LENGTH_MSG_1M*sizeof(BYTE));
  60. }
  61. };
  62. //extern DWORD WINAPI _exec_sql(LPVOID lparam);
  63. extern DWORD WINAPI _exec_sql(const char* lparam);
  64. extern DWORD WINAPI _write_error_log(LPVOID lparam);
  65. // CYAServerDlg 对话框
  66. class CYAServerDlg : public CDialogEx, public CTcpServerListener
  67. {
  68. typedef map<string, std::shared_ptr<Card>> CardMap;
  69. typedef map<CString, std::shared_ptr<_SOCK>> SocketMap;
  70. typedef map<CString, std::shared_ptr<_SOCKET_BUFFER>> SocketBufferMap;
  71. typedef map<INT64, std::shared_ptr<YaEvent>> EventMap;
  72. typedef map<int, std::shared_ptr<LightCallInfo>> LightCallMap;
  73. struct LogMsg
  74. {
  75. CString strFile;
  76. CString strLog;
  77. bool isNeedTime;
  78. };
  79. struct DataMsg
  80. {
  81. CONNID dwConnID;
  82. int iLength;
  83. BYTE* pData;
  84. };
  85. // 构造
  86. public:
  87. CYAServerDlg(CWnd* pParent = NULL); // 标准构造函数
  88. ~CYAServerDlg();
  89. // 对话框数据
  90. enum { IDD = IDD_YASERVER_DIALOG };
  91. protected:
  92. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  93. private:
  94. virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen);
  95. virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, SOCKET soClient);
  96. virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
  97. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
  98. virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode);
  99. virtual EnHandleResult OnShutdown(ITcpServer* pSender);
  100. virtual void OnReConnect(unsigned, unsigned);
  101. // 实现
  102. protected:
  103. HICON m_hIcon;
  104. // 生成的消息映射函数
  105. virtual BOOL OnInitDialog();
  106. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  107. afx_msg void OnPaint();
  108. afx_msg HCURSOR OnQueryDragIcon();
  109. DECLARE_MESSAGE_MAP()
  110. public:
  111. CButton m_btStart;
  112. CButton m_btStop;
  113. CMenu m_mnMain;
  114. afx_msg LRESULT on_monitor(WPARAM wParam, LPARAM lParam);
  115. afx_msg void OnBnStop();
  116. afx_msg void OnBnStart();
  117. afx_msg void OnBnExit();
  118. afx_msg void OnBnSyncTime();
  119. afx_msg void OnMenuDb();
  120. afx_msg void OnMenuLog();
  121. afx_msg void OnMenuParam();
  122. afx_msg void OnBnCallHisData();
  123. public:
  124. // ui operation
  125. CTcpServer _server;
  126. HostServer::SyncManager syncmanager;
  127. EnAppState m_enState;
  128. CStdioFile cfErrorLog;
  129. CRITICAL_SECTION m_csWriteLog;
  130. CRITICAL_SECTION m_csRemoveSocket;
  131. CRITICAL_SECTION m_csRefreshList;
  132. CRITICAL_SECTION m_csParseDataServer;
  133. CRITICAL_SECTION m_csSyncTime;
  134. CRITICAL_SECTION m_csCallInfo;
  135. QueueStrManager* m_qsmSQL;
  136. bool is_start_tcp;
  137. void set_app_state(EnAppState eas);
  138. void start_tcp_server();
  139. void stop_tcp_server();
  140. public:
  141. CString m_strConncetion; // 数据库连接字符串
  142. int m_nPort; // 启动端口
  143. int m_nCountClick;
  144. CWinThread* m_thread_monitor; // 与监控程序通信线程
  145. CWinThread* m_thread_timer; // timer的线程,脱离UI线程,不使用ontimer
  146. unsigned int m_uint_state; // 采集状态
  147. // bit 0, 服务状态,运行或者关闭
  148. // bit 1, 采集状态,正常或异常
  149. // bit 2, 分站状态,有中断或没有
  150. // bit 3, websocket状态,连接未连接
  151. // bit 4, 数据库状态,连接未连接
  152. time_t m_time_last_rec; // 最后接收到分站数据的时间
  153. bool is_websocket_ok;
  154. bool is_websocket_login;
  155. // 多web变量
  156. bool is_websocket_login_ex;
  157. bool is_websocket_ok_ex;
  158. bool is_server_ok;
  159. bool is_database_ok;
  160. int m_shift_id;
  161. BOOL m_bUseFilter;
  162. int m_nFilterType;
  163. int m_nMallocTimes;
  164. //BOOL m_log_sys_status;
  165. BOOL m_log_raw_data;
  166. BOOL m_log_parse_data;
  167. BOOL m_log_send_package;
  168. BOOL m_log_recv_package;
  169. BOOL m_log_locate_data;
  170. SocketMap mp_socket_list;
  171. SocketBufferMap mp_socket_buffer_list;
  172. ReaderMap mp_reader_list; // 所有分站
  173. ReaderMap mp_ctrl_reader_list; // 所有控制分站
  174. AreaMap mp_area_list; // 所有区域
  175. DrivingfaceWarningPointMap mp_drivingface_warning_point_list; // 掘进面告警点列表
  176. DrivingfaceWarningPointMapAll mp_drivingface_warning_point_list_all;//掘进面告警全列表
  177. SpecilaAreaEntryMap mp_special_area_entry_list; //特殊区域入口
  178. DrivingfaceRenderMap mp_driving_face_render_list; //掘进面分站基点配置信息
  179. DrivingfaceCardMap mp_driving_face_card_list;//掘进面标识卡配置信息 lemon
  180. WorkTypePermissionMap mp_worktype_permission_list;// lemon 2017/07/31
  181. RulesMap m_rules_list;
  182. MapInfoMap mp_map_list; // 所有地图
  183. LandmarkInfoMap mp_landmark_list; // 所有地图地标
  184. MapDirectionInfoMap mp_map_direction_list; //地图坐标系X轴正方向与地理北方的夹角
  185. DeptMap mp_dept_list; // 所有部门
  186. BanShiftMap mp_banshift_list; // 班次信息
  187. OccLevelMap mp_occlevel_list; // 所有职务级别
  188. AlarmTypeMap mp_alarm_type_list;
  189. SectionMap mp_section_list;
  190. ChamberMap mp_chamber_list;
  191. LightMap mp_light_list;
  192. LightGroupMap mp_light_group_list;
  193. CardMap mp_card_list_all; // 所有卡
  194. CardMap mp_card_list_down_vehicle; // 井下车辆
  195. CardMap mp_card_list_down_person; // 井下人员
  196. CardMap mp_card_list_up_person; // 升井人员
  197. CardMap mp_card_list_down_adhoc; //井下自组网卡
  198. PatrolTaskCheckMap mp_card_task_list; // 巡检任务
  199. LeaderArrangeMap mp_leaderarrange_list; // 领导带班
  200. VehicleTypeAttRuleMap mp_att_area_list; // 考勤区域列表,不同车辆类型,区域可能不同
  201. std::shared_ptr<ReaderPathMap> mp_reader_path_list_tof; //当前地图的所有分站的覆盖范围
  202. std::shared_ptr<TDOAReaderPathMap> mp_reader_path_list_tdoa;
  203. std::shared_ptr<CardMap> mp_card_list_over_time_person; // 超时人员
  204. std::shared_ptr<CardMap> mp_card_list_forbidden_person; // 进入限制区域人员
  205. std::shared_ptr<CardMap> mp_card_list_help; // 呼救人员
  206. std::shared_ptr<CardMap> mp_card_list_area_over_time_person; // 区域超时是人员
  207. std::shared_ptr<CardMap> mp_card_list_forbidden_vehicle; // 进入限制区域车辆
  208. std::shared_ptr<CardMap> mp_card_list_over_time_vehicle; // 超时车辆
  209. std::shared_ptr<CardMap> mp_card_list_over_speed_vehicle; // 超速车辆
  210. std::shared_ptr<CardMap> mp_card_list_area_over_time_vehicle; // 区域超时车辆
  211. std::shared_ptr<CardMap> mp_card_list_over_count_person; // 人员超员
  212. std::shared_ptr<CardMap> mp_card_list_over_count_vehicle; //车辆超员
  213. std::shared_ptr<AreaMap> mp_area_over_count_person; // 人员超员区域
  214. std::shared_ptr<AreaMap> mp_area_over_time_person; // 人员超时区域
  215. std::shared_ptr<AreaMap> mp_area_forbidden_person; // 有人限制区域
  216. std::shared_ptr<AreaMap> mp_area_over_count_vehicle; // 车辆超员区域
  217. std::shared_ptr<AreaMap> mp_area_over_time_vehicle; // 车辆超时区域
  218. std::shared_ptr<AreaMap> mp_area_forbidden_vehicle; // 有车限制区域
  219. std::shared_ptr<CardMap> mp_card_warning_point_alarm;//lemon
  220. std::shared_ptr<CardMap> mp_card_drivingface_eara_alarm;//lemon 20017/07/31 人员进入掘进机告警区域
  221. std::shared_ptr<EventMap> mp_event_list; // 事件列表
  222. std::shared_ptr<LightCallMap> mp_light_call_list; // 控制红绿等命令列表
  223. unordered_map<unsigned long long, unsigned short> umpRootSyncNum; // 每个root的同步序号
  224. CallInfoUserMap mp_user_call_info; // 用户呼叫信息
  225. _SLS sls_setting; // 系统参数配置
  226. _DBS m_db_setting; // 数据库参数配置
  227. _DBS m_db_setting_bk; // 备份库参数配置
  228. string m_ws_url; // web服务器url
  229. string m_ws_url_ex; // 多服务器url
  230. CString m_tcp_host; // 本机接收分站数据的ip
  231. double m_reader_interval_time;
  232. INT64 m_event_list[MINE_EVENT_COUNT];
  233. int cur_shift_id;
  234. time_t cur_shift_start_time;
  235. private:
  236. int init_smart_pointer_var();
  237. private: //lemon
  238. //int m_drivingfaceWarningIdForMinDis;
  239. public:
  240. void init_ui(); // 初始化界面
  241. void init_param(); // 初始化运行参数
  242. void init_queuestring(); // 初始化数据库缓存队列
  243. void load_param_from_ini(); // 加载配置文件中参数
  244. void database_connect(); // 连接数据库
  245. void stop_and_exit(); // 停止并退出程序
  246. void set_run_state(); // 修改界面按钮状态
  247. // 从数据库中初始化数据
  248. void init_base_data(); //
  249. int init_setting(); // 系统配置
  250. int init_alarm_type(); // 报警类型
  251. int init_shift(); // 载入班次信息
  252. int init_dept(); // 部门列表
  253. int init_level(); // 级别
  254. int init_card(string card_id = "");
  255. int init_staffer(string staff_id = "", bool is_card = false); // 人员
  256. int init_vehicle(string vehicle_id = "", bool is_card = false); // 车辆
  257. int init_adhoc(string adhoc_id = "",bool is_card = false); // 自组网卡
  258. int init_map(int map_id = 0); // 地图
  259. int init_landmark(void); //路标信息
  260. int init_map_direction(void);//地图坐标系X轴正方向与地理坐标系北方的夹角
  261. int init_area(int area_id = 0); // 区域
  262. int init_special_area_entry(void); // 特殊区域入口
  263. int init_drivingface_render(void); //掘进面分站基准点配置
  264. int init_drivingface_card(void);//lemon init drivingface_card..
  265. int init_drivingface_permission_card(void);//lemon 2017/07/31
  266. int init_reader(int reader_id = 0); // 分站
  267. int init_ctrl_reader(int reader_id = 0); // 控制分站
  268. int init_antenna(int reader_id = 0); // 天线
  269. int init_dev_adhoc(int reader_id = 0); // 自组网坐标
  270. int init_antenna_sync(); // 初始化分站间距离,组装时间同步所需数据
  271. int init_all_readers_coverage(int reader_id = 0); //从数据库读取地图集覆盖范围,初始化所有分站的地图集
  272. int init_tof_all_readers_coverage(int reader_id = 0); //从数据库读取地图集覆盖范围,初始化所有分站的地图集
  273. int init_tdoa_all_readers_coverage(int reader_id = 0); //从数据库读取地图集覆盖范围,初始化所有分站的地图集
  274. int init_traffic_lights(int light_id = 0); //初始化红绿灯
  275. int init_chamber(int chamber_id = 0); //初始化硐室
  276. int init_section(int section_id = 0); //初始化路段
  277. int init_light_group(int group_id = 0); //初始化红绿灯组
  278. int init_light_state(CONNID dwConnID,std::string strIp);
  279. int init_rules(int rule_id = 0); // 初始化规则表 2017/08/01
  280. int init_leader_arrange(); // 领导排班
  281. void clear_leader_arrange(); // 清空列表
  282. void clear_att_area();
  283. //int init_patrol_info(int task_id = 0); // 加载巡检任务及巡检路线
  284. int init_patrol_info(std::string card_id);
  285. int delete_patrol_info(std::string card_id);
  286. int get_help_card_nums();
  287. int init_att_area(); // 载入考勤区域信息
  288. // 载入历史数据
  289. void load_his_data();
  290. void load_his_area(); // 所在区域
  291. void load_his_reader(); // 分站状态
  292. void load_his_card_postion_vehicle(); // 所在位置
  293. void load_his_card_postion_staff();
  294. void load_his_driving_face_card_postion(); // 所在位置
  295. void load_his_driving_face_card_state(); // 载入掘进面卡状态
  296. void init_drivingface_warning_point();
  297. void load_his_card_state(); // 加载卡状态
  298. void load_drivingface_card_curshift_position();//从历史数据中加载掘进机的初始状态。当前班次的开始值
  299. float get_drivingface_warning_point_dis(std::shared_ptr<Card> card);
  300. // 载入报警数据
  301. void load_alarm_reader();
  302. MYSQL_RES* getMysqlRes(const char* sql);
  303. // 接口数据解析
  304. void parse_edit_map(int map_id);
  305. void parse_edit_area(int area_id);
  306. void parse_edit_reader(int reader_id);
  307. void parse_edit_card(string card_id);
  308. void parse_edit_staffer(string staffer_id);
  309. void parse_edit_vehicle(string vehicle_id);
  310. void parse_edit_path(int path_id);
  311. void parse_set_limit_value();
  312. void parse_call_card();
  313. void parse_clear_card();
  314. void parse_deal_help();
  315. // 初始化websocket
  316. void ws_init();
  317. void ws_open();
  318. void ws_close();
  319. void ws_login();
  320. void ws_logout();
  321. void ws_init_ex();
  322. void ws_open_ex();
  323. void ws_login_ex();
  324. void ws_logout_ex();
  325. void clear_listener();
  326. void clear_all_list();
  327. // socket接收数据
  328. void parse_data_server(const BYTE * pData, int nLen, DWORD dwConnId); // 处理服务器端粘包
  329. void parse_package_data(BYTE* DataBuffer, int nLen, DWORD dwConnID); // 处理客户端粘包
  330. // 解析定位数据
  331. void parse_data_locate_reader(BYTE * DataBuffer, int& nCurPos, int nLen, DWORD dwConnID, int& reader_id);
  332. void parse_data_ctrl_reader(BYTE * DataBuffer, int& nCurPos, int nLen, DWORD dwConnID, int& reader_id);
  333. int parse_inav_msg(INAVLocateMsg* msgPtr);
  334. void deal_inav_locate_msg(INAVLocateMsg* msgPtr, int card_num);
  335. INAV_STATUS calculate_inav_state(INAVLocateData* cardData);
  336. void calculate_inav_locate_by_magic(std::shared_ptr<Card> card, INAVLocateData* cardData);
  337. void write_inav_locate_magic_data(std::shared_ptr<Card> card, INAVLocateData* cardData);
  338. void log_card_inav_state(INAV_STATUS card_state, string card_id);
  339. void parse_data_lights_state(BYTE* DataBuffer, int& nCurPos, int reader_id, unsigned short wChr);
  340. int parse_data_locate_card(BYTE* DataBuffer, int& nCurPos, int reader_id, unsigned short wChr);
  341. int get_locate_msg_type(BYTE* DataBuffer);
  342. std::shared_ptr<Card> parse_tof_locate_msg(TofLocateMsg* DataBuffer, int cardNum);
  343. void parse_data_locate_card_vehicle(BYTE* DataBuffer, int& nCurPos, std::shared_ptr<Card> card, unsigned short wChr);
  344. void parse_data_locate_reader_his(BYTE * DataBuffer, int nLen, int& nCurPos, int& reader_id, int& nTick, CString& strtime, unsigned short wChr);
  345. void parse_data_locate_card_his(BYTE* DataBuffer, int& nCurPos, int reader_id, DWORD wTickCount, CString strTime, unsigned short wChr);
  346. void parse_data_locate_card_his_tdoa(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime);
  347. void parse_data_locate_card_his_tdoa_package(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime);
  348. void parse_data_locate_card_his_tof_card(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime);
  349. void parse_data_locate_card_his_tdoa_card(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime);
  350. void parse_data_locate_card_his_sync_time(BYTE* DataBuffer, int nLen, CString strTime, CString strHistTime, WORD wChr);
  351. // 解析自组网数据
  352. void parse_data_adhoc(BYTE* DataBuffer, int& nCurPos, int reader_id);
  353. // 解析分站时间同步
  354. void parse_data_reader_synctime(BYTE *DataBuffer, int nLen, int& nCurPos, WORD wChr);
  355. std::shared_ptr<_SOCK> get_socket_by_Id(DWORD dwConnID);
  356. void add_socket_to_list(DWORD dwConnID, DWORD reader_id, DEVICE_TYPE rt);
  357. void remove_socket(DWORD dwConnID);
  358. // 发送数据
  359. //void SendData(DWORD dwConnID, WORD wCharacterWord, int wLength, BYTE* DataBuffer);
  360. BOOL SendData(DWORD dwConnID, WORD wCharacterWord, int wLength, BYTE* DataBuffer);
  361. // 将设置的灯添加到列表,同一个灯的状态会覆盖,使用最后一个状态控制
  362. void add_light_to_call_list(LIGHTS_SELECT_TYPE lst, LIGHT_COLOR clr, LIGHT_CTRL_STATE ctrl, int tkid, LIGHT_SHAPE ls,int light_id = 0);
  363. void send_call_light();
  364. void send_call_light(BYTE ctrl_cmd, int light_id, int ctrl_type, int ctrl_color,int light_shape);
  365. // 获取json串
  366. string get_json_login();
  367. string get_json_logout();
  368. bool need_display_verification(std::shared_ptr<Card> card); //是否需要推送 false 不需要 true 继续执行
  369. string get_json_down_and_up(std::shared_ptr<Card> card); // 升入井接口,当有升井、入井数据时发送
  370. string get_json_special_area_process(std::shared_ptr<Card> card); // 进入特殊区域接口,当车辆标识卡信号丢失,根据特殊区域业务,判断车辆进入相应特殊区域时发送
  371. string get_json_all_special_area_data(); // 所有在特殊区域的车辆,用于前端登录时,发送全部数据
  372. string get_json_position(); // 实时位置信息接口,一定间隔主动发送 === 这个函数没处理。。处理get_json_card_statistic
  373. string get_json_drivingface_card_position(std::shared_ptr<Card> card); // done
  374. string get_json_position_all(); // 所有实时位置信息,用于前端有用户登录时,上报所有数据 ==== handle this function : get_json_card_statistic
  375. int insert_data(int index, int key, StatisticDataStr** header); // 用户
  376. void delete_memory(StatisticDataStr *header);
  377. //int get_json_statistic_vehicle_data(Json::Value& vehicle_data);
  378. //刘思平修订的代码Part 11/Sum 11:begin 在:YAServerDlg.h中
  379. //by lsp on 2017.07.10 @山西长治
  380. //刘思平修订的代码Part 10/Sum 10:begin 在:YAServerDlg.h中
  381. //by lsp on 2017.07.09 @山西长治
  382. //int get_json_statistic_vehicle_data(Json::Value& vehicle_data);
  383. //int get_json_statistic_staff_data(Json::Value& person_data);
  384. Json::Value get_json_statistic_vehicle_data(Json::Value& vehicle_data);
  385. Json::Value get_json_statistic_staff_data(Json::Value& staff_data);
  386. Json::Value get_json_statistic_data(StatisticDataStr* header); // 每秒发送统计数据,里面包含了所有卡的位置信息,包括人员、车辆 == 处理链表中的数据成json
  387. int get_json_node_position(std::shared_ptr<Card> card,Json::Value& detailNode);
  388. string get_json_card_statistic();//handle get_json_statistic_vehicle_data get_json_statistic_staff_data
  389. string get_json_all_data(); // 前端有用户登录时,发送
  390. string get_json_device_state(); // 分站状态信息
  391. string get_json_help(); //求救json
  392. string get_json_event(bool bAll = false);
  393. string get_json_call_list(); // 呼叫列表 not handle
  394. string get_json_new_device_state(); // 分站状态信息
  395. string get_json_count_area(); //统计区域人数 not handle
  396. string get_json_leader_arrange(); // 领导带班情况
  397. Json::Value get_section_json_alarm(); // 路段告警
  398. Json::Value get_light_json_alarm(); // 红绿灯告警
  399. Json::Value get_red_light_json_alarm(); // 闯红灯告警
  400. void send_json_data(string cmd, string data, bool is_login = false);
  401. // 业务处理
  402. void deal_readers();
  403. void deal_areas();
  404. void deal_attendace(std::shared_ptr<Card> card);
  405. void deal_card_msg(std::shared_ptr<Card> card, bool is_hist = false);
  406. void cal_card_position_by_msg(std::shared_ptr<Card> card);
  407. void deal_hist_card_postion();
  408. void deal_his_card_list(std::shared_ptr<Card> card);
  409. void card_enter_mine(std::shared_ptr<Card> card);
  410. void card_enter_mine(std::shared_ptr<Card> card, POS_DEVICE_TYPE pdt);
  411. void card_down_mine(std::shared_ptr<Card> card);
  412. void card_up_mine(std::shared_ptr<Card> card);
  413. void card_enter_map(std::shared_ptr<Card> card);
  414. void card_enter_area(std::shared_ptr<Card> card);
  415. void card_enter_special_area(std::shared_ptr<Card> card, int area_id);
  416. void card_leave_area(std::shared_ptr<Card> card, std::shared_ptr<Area> area);
  417. void deal_card_state(std::shared_ptr<Card> card);
  418. void deal_card_drivingface_permission(std::shared_ptr<Card> card);
  419. void deal_alarm_card(std::shared_ptr<Card> card, std::shared_ptr<CardMap> dest_card_list, bool is_alarm, ALARM_FLAG tag);
  420. void deal_drivingface_alarm(std::shared_ptr<Card> card, bool is_alarm, ALARM_FLAG tag);
  421. void deal_drivingface_alarm_all();
  422. void deal_alarm_area(std::shared_ptr<Area> area, std::shared_ptr<AreaMap> dest_area_list, bool is_alarm, ALARM_FLAG tag,int tyep);
  423. void deal_card_lost_state();
  424. int get_special_area_id(shared_ptr<Card> card);
  425. int deal_traffic_lights(std::shared_ptr<Card> card);
  426. int deal_area_over_speed(std::shared_ptr<Card> card); //处理区域超速
  427. int card_enter_chamber(std::shared_ptr<Card> card,std::shared_ptr<Section> section);
  428. int select_pos_output(std::shared_ptr<Card> card);
  429. void reset_map_card();
  430. bool is_in_rectangle(_point p, double dblleft, double dbltop, double dblright, double dblbottom);
  431. bool is_in_circle(_point p1, _point p2, double r, double scale);
  432. // save to database
  433. void execute_sql(const char* sql); // 保存到数据库
  434. void deal_card_drivingface_real(std::shared_ptr<Card> card);
  435. void calculate_card_postion_by_tof(std::shared_ptr<Card> card); // 保存卡位置
  436. void process_driving_face_start_service(std::shared_ptr<Card> card); // 处理采掘面
  437. void send_drivingface_card_position_json();
  438. void write_drivingface_shift_start_data(std::shared_ptr<Card> card);
  439. void write_drivingface_shift_end_data(std::shared_ptr<Card> card);
  440. void driving_face_shift_start();
  441. void driving_face_shift_end();
  442. void process_driving_face_end_service(std::shared_ptr<Card> card);
  443. void store_driving_face_data(std::shared_ptr<Card> card);
  444. void update_driving_face_data(std::shared_ptr<Card> card);//lemon changed..2017/07/29
  445. void write_his_drivingface_real(std::shared_ptr<Card> card);
  446. void save_card_postion(std::shared_ptr<Card> card); // 保存卡位置
  447. void save_raw_data_card_tof(std::shared_ptr<Card> card);
  448. void save_card_postion_ex(std::shared_ptr<Card> card); // 补录卡数据
  449. bool IsInLine(_point p1, _point p2, _point p3);
  450. void store_data_card(std::shared_ptr<Card> card, int tag);
  451. void store_data_event(std::shared_ptr<YaEvent> ev);
  452. void save_patrol_data(std::shared_ptr<PatrolTask> pTask, std::shared_ptr<PatrolPoint> pPoint);
  453. int store_data_light(std::shared_ptr<Light> light,int tag);
  454. int store_data_traffic_red_light(std::shared_ptr<Light> light,std::shared_ptr<Card> card); //存储闯红灯数据
  455. int store_data_section(std::shared_ptr<Section> section,time_t cur_time,int tag);
  456. // 打包数据
  457. void package_data();
  458. // 通用方法
  459. int API_TimeToString(string &strDateStr,const time_t &timeData);
  460. int API_StringToTime(const string &strDateStr,time_t &timeData);
  461. //void formatByteArray(CString &strBuf, BYTE * buf, int nLen);
  462. void formatByteArray(std::string &strBuf, BYTE * buf, int nLen);
  463. void writeErrorLog(const CString strFile, const CString strErr ,bool bTime = true);
  464. void writeErrorLogEx(const CString strFile, const CString strErr ,bool bTime = true);
  465. void writeErrorLogEx(const char* strFile, const char* strErr ,bool bTime = true);
  466. BOOL openLogFile(const CString strFile);
  467. BOOL openLogFile(const char* strFile);
  468. void show_log( LPCTSTR szlog, BOOL bSave = true);
  469. void AddItem(CString strvalue, int readerid, BOOL is_closed, DEVICE_TYPE rt);
  470. // 响应接口
  471. void parse_json_data_set_limit_value(const char* sz);
  472. void parse_json_data_call_card_cancel(message::ptr const& data);
  473. void parse_json_data_call_card(message::ptr const& data);//(const char* sz);
  474. void parse_json_data_clear_card(message::ptr const& data);
  475. void parse_json_data_deal_help(const char* sz);
  476. int parse_json_data_set_light_color(message::ptr const& data);
  477. int parse_json_data_request_counts_info(message::ptr const& data);
  478. int parse_json_data_reader_pos_change(message::ptr const& data);
  479. void deal_call_edit_map(int id, EDIT_TYPE_ID edit_type_id);
  480. void deal_call_edit_area(int id, EDIT_TYPE_ID edit_type_id);
  481. void deal_call_edit_reader(int id, EDIT_TYPE_ID edit_type_id);
  482. void deal_call_edit_card(string id, EDIT_TYPE_ID edit_type_id);
  483. void deal_call_edit_staff(string id, EDIT_TYPE_ID edit_type_id);
  484. void deal_call_edit_vehicle(string id, EDIT_TYPE_ID edit_type_id);
  485. void deal_call_edit_adhoc(string id, EDIT_TYPE_ID edit_type_id);
  486. int deal_call_edit_section(int id,EDIT_TYPE_ID edit_type_id); //web端编辑路段信息
  487. int deal_call_edit_light(int id,EDIT_TYPE_ID edit_type_id); //web端编辑灯信息
  488. int deal_call_edit_chamber(int id,EDIT_TYPE_ID edit_type_id); //web端编辑硐室信息
  489. void deal_call_edit_rules(int id,EDIT_TYPE_ID edit_type_id);//lemon 2017/08/01
  490. void deal_call_edit_patrol_task(string id, EDIT_TYPE_ID edit_type_id);
  491. void remove_card(string card_id);
  492. void clear_card_from_list(std::shared_ptr<Card> card);
  493. void add_event(std::shared_ptr<YaEvent> ev);
  494. void remove_event(std::shared_ptr<YaEvent> ev);
  495. void check_patrol();
  496. void send_call_info();
  497. void send_call_his_data();
  498. void send_sync_reader();
  499. int send_heart_package();
  500. void clear_call_info();
  501. int get_card_id_len(int card_type);
  502. int modify_card_speed(int val);
  503. bool is_has_chamber(int section_id); //路段内存在可用的硐室
  504. bool isInMainTunel(std::shared_ptr<Card> pCard); //此卡是否在主巷道
  505. int getTunelProperty(std::shared_ptr<Card> pCard); //获得卡的巷道值
  506. void AnalysisAlgoFailedData(int interval = 60000 /*std::shared_ptr<Card> pCard*/);
  507. int GetLandmarkID(_point card_point);
  508. double GetDistance(_point p1, _point p2);
  509. time_t GetCurShiftStartTime(int& shift_id);
  510. time_t GetCurShiftEndTime();
  511. time_t GetLastShiftStartTime(int& shift_id);
  512. int GetCurShiftId(struct tm* current_time, int shift_type = 1);
  513. DIRECTION_TYPE GetDirectionType(_point card_point, _point landmark_point, int map_id);
  514. POS_DEVICE_TYPE GetPosDownAndUp(int vehicle_type_id, int area_id);
  515. public:
  516. //测试函数
  517. void TestReadFile(); // 从dist文件中读取信息,计算坐标
  518. int ReadTofDistFile(); // 从TOF数据文件中读取数据,计算坐标
  519. int TestGenerateAllDataJson(); // 测试登录请求所有数据接口
  520. void TestLandmarkRequirement(); // 测试地标信息
  521. void TestCallCard(); // 测试呼叫接口,向分站发送
  522. void TestParseCallCard(); // 测试呼叫接口,接收前端指令
  523. void TestFitData(); // 测试拟合数据
  524. void TestMultSql(); // 测试向多个库写入数据
  525. void TestCardPosition(); // 测试卡靠右行驶
  526. string get_json_call_test();
  527. void package_data_test();
  528. public:
  529. std::unique_ptr<client> _io;
  530. CListBox m_list_log;
  531. CReportCtrl m_listctrl_reader;
  532. void OnPushMessage();
  533. void OnCallMessage(string const& name, message::ptr const& data, bool isAck,message::list &ack_resp);
  534. void OnLogin(string const& name, message::ptr const& data, bool isAck, message::list &ack_resp);
  535. void OnConnected();
  536. void OnClosed(client::close_reason const& reason);
  537. void OnFailed();
  538. // 向多个Web服务器发送数据
  539. std::unique_ptr<client> _io_ex;
  540. void OnLoginEx(string const& name, message::ptr const& data, bool isAck, message::list &ack_resp);
  541. void OnConnectedEx();
  542. void OnClosedEx(client::close_reason const& reason);
  543. void OnFailedEx();
  544. protected:
  545. afx_msg LRESULT OnRemoveSocket(WPARAM wParam, LPARAM lParam);
  546. afx_msg LRESULT OnMsgRefreshIpList(WPARAM wParam, LPARAM lParam);
  547. afx_msg LRESULT OnWriteErrorLog(WPARAM wParam, LPARAM lParam);
  548. public:
  549. UINT m_reader_id_hist;
  550. afx_msg void OnEnUpdateEditReaderid();
  551. afx_msg void OnAbout();
  552. afx_msg void OnBnTest();
  553. public:
  554. //格子算法相关
  555. std::shared_ptr<CellPathMap> mpCellPath;
  556. CWinThread* pCellThread; //500ms补充格子线程
  557. CWinThread* pSendCellThread; //发送格子数据的线程
  558. HANDLE hEvent; //格子线程事件
  559. bool bSend;
  560. int init_cell_path_map();
  561. int SaveCellData2DB();
  562. int ModifyCardInfo();
  563. int DivideCell(double width, std::shared_ptr<TDOAReaderPathMap> pTdoaReaderPathMap);
  564. int InitCellBranch();
  565. };
  566. typedef struct {
  567. CYAServerDlg* handle;
  568. int len;
  569. DWORD dwConnID;
  570. BYTE buf[LENGTH_MSG_4K];
  571. }ParseData;
  572. typedef struct
  573. {
  574. CYAServerDlg* handle;
  575. bool useTime;
  576. char* path;
  577. char* strLog;
  578. }LogInfo;