YAServerDlg.h 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934
  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. #include "carManager.h"
  21. #include "./MysqlConnectPool/CDBConnPool.h"
  22. struct area;
  23. struct point_2;
  24. extern BOOL m_log_sys_status;
  25. //using namespace sio;
  26. using namespace std;
  27. using namespace HostServer;
  28. struct _SLS // system_limit_setting
  29. {
  30. unsigned int over_count_person; // 井下人员超员
  31. unsigned int over_count_vehicle; // 井下车辆超员
  32. unsigned int over_time_person; // 井下人员超时
  33. unsigned int over_time_vehicle; // 井下车辆超时
  34. double over_speed; // 井下车辆超速
  35. // lihongzhen 2017/8/18 考勤偏移时间
  36. int att_starttime_offset_staff;
  37. int att_endtime_offset_staff;
  38. int att_starttime_offset_vehicle;
  39. int att_endtime_offset_vehicle;
  40. uint64_t att_person_thre_hour;
  41. //车辆防追尾配置数据
  42. double rear_end_d;
  43. time_t rear_end_t;
  44. double geofault_warn_dis;
  45. };
  46. struct _DBS // db setting
  47. {
  48. string host;
  49. string user;
  50. string password;
  51. string dbname;
  52. string encoding;
  53. int port;
  54. };
  55. struct ReaderInfo_
  56. {
  57. int state; // 0 连接
  58. DWORD reader_id; // 分站号
  59. DEVICE_TYPE reader_type; // 通信分站、读卡分站
  60. };
  61. struct SpecialCard
  62. {
  63. std::map<int,std::vector<int>> m_map;
  64. void insert(int areaid,int cardid)
  65. {
  66. auto it = m_map.find(areaid);
  67. if (it == m_map.end())
  68. {
  69. std::vector<int> tmp;
  70. tmp.push_back(cardid);
  71. m_map.insert(std::make_pair(areaid,tmp));
  72. }
  73. else
  74. {
  75. auto iter = std::find(it->second.begin(),it->second.end(),cardid);
  76. if (iter == std::end(it->second))
  77. it->second.push_back(cardid);
  78. }
  79. }
  80. bool find(int areaid,int cardid)
  81. {
  82. auto it = m_map.find(areaid);
  83. if (it == m_map.end())
  84. return true;
  85. else
  86. {
  87. auto iter = std::find(it->second.begin(),it->second.end(),cardid);
  88. if (iter == std::end(it->second))
  89. return false;
  90. }
  91. return true;
  92. }
  93. std::string to_str()
  94. {
  95. std::stringstream ss;
  96. for(const auto s:m_map)
  97. {
  98. ss<<"areaId:"<<s.first<<'{';
  99. for (const auto x:s.second)
  100. {
  101. ss<<x<<",";
  102. }
  103. ss<<"}";
  104. }
  105. return std::move(ss.str());
  106. }
  107. };
  108. struct _SOCK
  109. {
  110. CString sip;
  111. CONNID dwConnID;
  112. //int state; // 0 连接
  113. //DWORD reader_id; // 分站号
  114. //DEVICE_TYPE reader_type; // 通信分站、读卡分站
  115. std::list<ReaderInfo_> m_reader;
  116. bool findReader(DWORD readerId)
  117. {
  118. bool b = false;
  119. for (const auto & r :m_reader)
  120. {
  121. if (r.reader_id == readerId)
  122. {
  123. b = true;
  124. break;
  125. }
  126. }
  127. return b;
  128. }
  129. ReaderInfo_ & get(DWORD readerId)
  130. {
  131. auto it = std::find_if(m_reader.begin(),m_reader.end(),[readerId](const ReaderInfo_ & r){
  132. if (r.reader_id == readerId)
  133. return true;
  134. else
  135. {
  136. return false;
  137. }
  138. });
  139. return *it;
  140. }
  141. };
  142. struct _SOCKET_BUFFER
  143. {
  144. CONNID dwConnID;
  145. BYTE pData[LENGTH_MSG_1M];
  146. WORD wLen;
  147. WORD wReadLen;
  148. _SOCKET_BUFFER(){
  149. dwConnID = 0;
  150. wLen = 0;
  151. wReadLen = 0;
  152. memset(pData,0,LENGTH_MSG_1M*sizeof(BYTE));
  153. }
  154. };
  155. //extern DWORD WINAPI _exec_sql(LPVOID lparam);
  156. extern DWORD WINAPI _exec_sql(const char* lparam);
  157. // CYAServerDlg 对话框
  158. class CYAServerDlg : public CDialogEx, public CTcpServerListener
  159. {
  160. typedef map<string, std::shared_ptr<Card>> CardMap;
  161. typedef map<CString, std::shared_ptr<_SOCK>> SocketMap;
  162. typedef map<CString, std::shared_ptr<_SOCKET_BUFFER>> SocketBufferMap;
  163. typedef map<INT64, std::shared_ptr<YaEvent>> EventMap;
  164. typedef map<int, std::shared_ptr<LightCallInfo>> LightCallMap;
  165. typedef map<int, std::shared_ptr<area>> Area_Map; //lemon 2017/11/20
  166. struct LogMsg
  167. {
  168. CString strFile;
  169. CString strLog;
  170. bool isNeedTime;
  171. };
  172. struct DataMsg
  173. {
  174. CONNID dwConnID;
  175. int iLength;
  176. BYTE* pData;
  177. };
  178. // 构造
  179. public:
  180. CYAServerDlg(CWnd* pParent = NULL); // 标准构造函数
  181. ~CYAServerDlg();
  182. // 对话框数据
  183. enum { IDD = IDD_YASERVER_DIALOG };
  184. void uwb_alarm(std::map<uint64_t,std::string>&m2,bool flag,std::shared_ptr<NAMESPACE_POINT::card_interface>c);
  185. void uwb_putDb(std::vector<std::string> &v);
  186. void record_staff_count(int num);
  187. protected:
  188. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
  189. private:
  190. //---lemon smooth----
  191. NAMESPACE_POINT::CarManager * m_carmanage;
  192. std::unique_ptr<std::thread> m_Pthread;
  193. void run();
  194. void run_sensor();
  195. bool m_bStop;
  196. time_t time_interval;
  197. SpecialCard m_sc;
  198. struct vInfo
  199. {
  200. vInfo()
  201. {
  202. is_alarm=false;
  203. real_end_start_time=0;
  204. backfired_start_time=0;
  205. }
  206. void push(const std::string & c1, const std::string &c2)
  207. {
  208. m_cid[0]=c1;
  209. m_cid[1]=c2;
  210. std::sort(m_cid.begin(),m_cid.end());
  211. }
  212. std::string getKey() const
  213. {
  214. return m_cid[0]+"&"+m_cid[1];
  215. }
  216. bool is_alarm;
  217. std::array<std::string,2> m_cid;
  218. time_t real_end_start_time ;
  219. time_t backfired_start_time;
  220. };
  221. std::map<std::string,vInfo> m_CloserVehicle;
  222. //---lemon smooth----
  223. virtual EnHandleResult OnPrepareListen(ITcpServer* pSender, SOCKET soListen);
  224. virtual EnHandleResult OnAccept(ITcpServer* pSender, CONNID dwConnID, SOCKET soClient);
  225. virtual EnHandleResult OnSend(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
  226. virtual EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength);
  227. virtual EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode);
  228. virtual EnHandleResult OnShutdown(ITcpServer* pSender);
  229. virtual void OnReConnect(unsigned, unsigned);
  230. // 实现
  231. protected:
  232. HICON m_hIcon;
  233. // 生成的消息映射函数
  234. virtual BOOL OnInitDialog();
  235. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  236. afx_msg void OnPaint();
  237. afx_msg HCURSOR OnQueryDragIcon();
  238. DECLARE_MESSAGE_MAP()
  239. public:
  240. CButton m_btStart;
  241. CButton m_btStop;
  242. CMenu m_mnMain;
  243. afx_msg LRESULT on_monitor(WPARAM wParam, LPARAM lParam);
  244. afx_msg void OnBnStop();
  245. afx_msg void OnBnStart();
  246. afx_msg void OnBnExit();
  247. afx_msg void OnBnSyncTime();
  248. afx_msg void OnMenuDb();
  249. afx_msg void OnMenuLog();
  250. afx_msg void OnMenuParam();
  251. afx_msg void OnBnCallHisData();
  252. public:
  253. // ui operation
  254. CTcpServer _server; // 启动的socket server,用来接收分站数据
  255. HostServer::SyncManager syncmanager; // 时间同步计算
  256. EnAppState m_enState; // 系统运行状态,用来控制界面按钮禁用状态
  257. CRITICAL_SECTION m_csRemoveSocket;
  258. CRITICAL_SECTION m_csRefreshList;
  259. CRITICAL_SECTION m_csParseDataServer;
  260. CRITICAL_SECTION m_csSyncTime;
  261. CRITICAL_SECTION m_csCallInfo;
  262. CRITICAL_SECTION m_csHandUp;
  263. CRITICAL_SECTION m_csAreaList;
  264. CRITICAL_SECTION m_MC_Lock;
  265. CRITICAL_SECTION m_csCoalDrvingFaceList;
  266. QueueStrManager* m_qsmSQL;
  267. bool is_start_tcp;
  268. void set_app_state(EnAppState eas);
  269. void start_tcp_server();
  270. void stop_tcp_server();
  271. public:
  272. CString m_strConncetion; // 数据库连接字符串
  273. int m_nPort; // 启动端口
  274. int m_nCountClick;
  275. YADB::_DB_POOL_SETTING_ m_DBSetting; //数据库池连接配置
  276. CWinThread* m_thread_monitor; // 与监控程序通信线程
  277. CWinThread* m_thread_timer; // timer的线程,脱离UI线程,不使用ontimer
  278. unsigned int m_uint_state; // 采集状态
  279. // bit 0, 服务状态,运行或者关闭
  280. // bit 1, 采集状态,正常或异常
  281. // bit 2, 分站状态,有中断或没有
  282. // bit 3, websocket状态,连接未连接
  283. // bit 4, 数据库状态,连接未连接
  284. time_t m_time_last_rec; // 最后接收到分站数据的时间
  285. bool is_websocket_ok; // websocket 连接状态
  286. bool is_websocket_login; // websocket登录状态
  287. // 多web变量
  288. bool is_websocket_login_ex;
  289. bool is_websocket_ok_ex;
  290. bool is_server_ok; // tcp server 启动状态
  291. bool is_database_ok; // 数据库连接状态
  292. int m_shift_id; // 当前班次
  293. BOOL m_bUseFilter; // 是否使用滤波
  294. int m_nFilterType; // 滤波类型,当前主要为卡尔曼滤波
  295. int m_nMallocTimes; //
  296. //BOOL m_log_sys_status;
  297. // 日志开关,用来设置是否将日志输出
  298. BOOL m_log_raw_data; // 原始数据16进制
  299. BOOL m_log_parse_data; // 原始数据,解析后的10进制
  300. BOOL m_log_send_package; // 向web端发送的json
  301. BOOL m_log_recv_package; // 接收web端的json
  302. BOOL m_log_locate_data; // 定位数据输出,解析的卡数据、计算出的定位结果、算法过程中的结果
  303. SocketMap mp_socket_list; // 已连接的socket列表,即已连接的分站列表
  304. SocketBufferMap mp_socket_buffer_list; // socket数据包分片缓存列表
  305. ReaderMap mp_reader_list; // 所有分站
  306. ReaderMap mp_ctrl_reader_list; // 所有控制分站
  307. AreaMap mp_area_list; // 所有区域
  308. BigSmallReaderMap mp_bigsmall_reader_list; //保存大小分站的所属关系
  309. DrivingfaceWarningPointMap mp_drivingface_warning_point_list; // 掘进面告警点列表
  310. DrivingfaceWarningPointMapAll mp_drivingface_warning_point_list_all;//掘进面告警全列表
  311. //地质断层告警
  312. WarningPoint_Map m_WarningPoint_list;
  313. SpecilaAreaEntryMap mp_special_area_entry_list; //特殊区域入口
  314. DrivingfaceRenderMap mp_driving_face_render_list; //掘进面分站基点配置信息
  315. DrivingfaceCardMap mp_driving_face_card_list;//掘进面标识卡配置信息 lemon
  316. WorkTypePermissionMap mp_worktype_permission_list;// lemon 2017/07/31
  317. RulesMap m_rules_list; // 车辆考勤规则列表
  318. MapInfoMap mp_map_list; // 所有地图
  319. LandmarkInfoMap mp_landmark_list; // 所有地图地标
  320. MapDirectionInfoMap mp_map_direction_list; //地图坐标系X轴正方向与地理北方的夹角
  321. DeptMap mp_dept_list; // 所有部门
  322. BanShiftMap mp_banshift_list; // 班次信息
  323. OccLevelMap mp_occlevel_list; // 所有职务级别
  324. AlarmTypeMap mp_alarm_type_list; // 告警类型列表
  325. SectionMap mp_section_list; // 路段列表
  326. ChamberMap mp_chamber_list; // 硐室列表
  327. LightMap mp_light_list; // 交通灯列表
  328. LightGroupMap mp_light_group_list; // 交通灯灯组列表
  329. unsigned long long m_Start_time; // 程序启动的时间
  330. CardMap mp_card_list_all; // 所有卡
  331. CardMap mp_card_list_down_vehicle; // 井下车辆
  332. CardMap mp_card_list_down_person; // 井下人员
  333. CardMap mp_card_list_up_person; // 升井人员
  334. CardMap mp_card_list_down_adhoc; //井下自组网卡
  335. PatrolTaskCheckMap mp_card_task_list; // 巡检任务
  336. LeaderArrangeMap mp_leaderarrange_list; // 领导带班
  337. VehicleTypeAttRuleMap mp_att_area_list; // 考勤区域列表,不同车辆类型,区域可能不同
  338. MeetingInfoMap mp_meetinginfo_list; // 会车相关车辆信息
  339. AreaMap mp_workingface_area_list; //工作面区域
  340. CoalMiningRegularCycleMap m_coalmining_regularcycle_list;//挖煤机正规循环率计算中间值
  341. CoalWorkfaceVehicleMap m_coalWorkfaceVehicleMap; // 采煤机工作面与车卡ID绑定表
  342. CoalMiningAreaMap m_coalmining_area_list;//综采面计算挖煤机正规循环率的参数
  343. CoalDrvingfaceCardMap mp_coaldringface_card_list; // 采煤机/掘进机卡列表
  344. CardVehicleMap m_card_vehicle; // 车卡对应车卡ID
  345. CardWorkfaceMap m_card_workface; // 车卡对应工作面
  346. VehicleDriverPosMap m_vehicleDriverPosMap;//车辆和司机位置的平均位置//
  347. DeptVehicleDriverMap m_deptVehicleDriverMap;//部门与车辆和司机对应表//
  348. WorkfaceDriverAlarmMap m_WorkfaceDriverAlarmMap;//工作面车辆与报警参数对应表
  349. std::shared_ptr<ReaderPathMap> mp_reader_path_list_tof; //当前地图的所有分站的覆盖范围
  350. std::shared_ptr<TDOAReaderPathMap> mp_reader_path_list_tdoa;
  351. std::shared_ptr<CardMap> mp_card_list_over_time_person; // 超时人员
  352. std::shared_ptr<CardMap> mp_card_list_forbidden_person; // 进入限制区域人员
  353. std::shared_ptr<CardMap> mp_card_list_help; // 呼救人员
  354. std::shared_ptr<CardMap> mp_card_list_area_over_time_person; // 区域超时是人员
  355. std::shared_ptr<CardMap> mp_card_list_forbidden_vehicle; // 进入限制区域车辆
  356. std::shared_ptr<CardMap> mp_card_list_over_time_vehicle; // 超时车辆
  357. std::shared_ptr<CardMap> mp_card_list_over_speed_vehicle; // 超速车辆
  358. std::shared_ptr<CardMap> mp_card_list_area_over_time_vehicle; // 区域超时车辆
  359. std::shared_ptr<CardMap> mp_card_list_over_count_person; // 人员超员
  360. std::shared_ptr<CardMap> mp_card_list_over_count_vehicle; //车辆超员
  361. std::shared_ptr<AreaMap> mp_area_over_count_person; // 人员超员区域
  362. std::shared_ptr<AreaMap> mp_area_over_time_person; // 人员超时区域
  363. std::shared_ptr<AreaMap> mp_area_forbidden_person; // 有人限制区域
  364. std::shared_ptr<AreaMap> mp_area_over_count_vehicle; // 车辆超员区域
  365. std::shared_ptr<AreaMap> mp_area_over_time_vehicle; // 车辆超时区域
  366. std::shared_ptr<AreaMap> mp_area_forbidden_vehicle; // 有车限制区域
  367. std::shared_ptr<CardMap> mp_card_warning_point_alarm;//lemon
  368. std::shared_ptr<CardMap> mp_card_geofault_alarm;//lemon
  369. std::shared_ptr<CardMap> mp_card_list_motionless;
  370. std::shared_ptr<CardMap> mp_card_drivingface_eara_alarm;//lemon 20017/07/31 人员进入掘进机告警区域
  371. std::shared_ptr<EventMap> mp_event_list; // 事件列表
  372. std::shared_ptr<LightCallMap> mp_light_call_list; // 控制红绿等命令列表
  373. std::shared_ptr<CalDataMap> mp_ins_cal_data_list;
  374. std::shared_ptr<HandUpVehicleMap> mp_card_hand_up_list;//wangsiping 2017/10/11 手动拖动过的车辆card list
  375. std::shared_ptr<MovingReaderMap> mp_moving_reader_list; //add by zhuyf 2017/10/18 人卡上车功能实现
  376. std::vector<DrivinfaceReaderTopology> vt_drivingface_reader_topology; //存放掘进面的大小分站拓扑关系
  377. unordered_map<unsigned long long, unsigned short> umpRootSyncNum; // 每个root的同步序号
  378. std::shared_ptr<Area_Map> mp_area_list_;
  379. CallInfoUserMap mp_user_call_info; // 用户呼叫信息
  380. _SLS sls_setting; // 系统参数配置
  381. _DBS m_db_setting; // 数据库参数配置
  382. _DBS m_db_setting_bk; // 备份库参数配置
  383. string m_ws_url; // web服务器url
  384. string m_ws_url_ex; // 多服务器url
  385. CString m_tcp_host; // 本机接收分站数据的ip
  386. double m_reader_interval_time;
  387. INT64 m_event_list[MINE_EVENT_COUNT];
  388. int cur_shift_id;
  389. time_t cur_shift_start_time;
  390. // 采集启动标记
  391. bool m_bYAserverBoot;
  392. // 零点处理标记
  393. bool m_bZero;
  394. public:
  395. void init_ui(); // 初始化界面
  396. void init_param(); // 初始化运行参数
  397. void init_queuestring(); // 初始化数据库缓存队列
  398. void load_param_from_ini(); // 加载配置文件中参数
  399. void database_connect(); // 连接数据库
  400. void stop_and_exit(); // 停止并退出程序
  401. void set_run_state(); // 修改界面按钮状态
  402. // 从数据库中初始化数据
  403. void init_base_data(); //
  404. int init_setting(); // 系统配置
  405. int init_alarm_type(); // 报警类型
  406. int init_shift(); // 载入班次信息
  407. int init_dept(); // 部门列表
  408. int init_level(); // 级别
  409. int init_card(string card_id = "");
  410. int init_special_card(string name = "");
  411. int init_staffer(string staff_id = "", bool is_card = false); // 人员
  412. int init_vehicle(string vehicle_id = "", bool is_card = false); // 车辆
  413. int init_adhoc(string adhoc_id = "",bool is_card = false); // 自组网卡
  414. int init_map(int map_id = 0); // 地图
  415. int init_landmark(void); //路标信息
  416. int init_map_direction(void);//地图坐标系X轴正方向与地理坐标系北方的夹角
  417. int init_area(int area_id = 0); // 区域
  418. int init_special_area_entry(void); // 特殊区域入口
  419. int init_drivingface_card(void);//lemon init drivingface_card..
  420. int init_sensor();
  421. int init_coalface_driver_warningparam();
  422. int init_drivingface_permission_card(void);//lemon 2017/07/31
  423. int init_drivingface_ref_points(); //zhuyf 2018/12/14
  424. int init_reader(int reader_id = 0); // 分站
  425. int init_ctrl_reader(int reader_id = 0); // 控制分站
  426. int init_antenna(int reader_id = 0); // 天线
  427. int init_dev_adhoc(int reader_id = 0); // 自组网坐标
  428. int init_antenna_sync(); // 初始化分站间距离,组装时间同步所需数据
  429. int init_all_readers_coverage(int reader_id = 0); //从数据库读取地图集覆盖范围,初始化所有分站的地图集
  430. int init_tof_all_readers_coverage(int reader_id = 0); //从数据库读取地图集覆盖范围,初始化所有分站的地图集
  431. int init_tdoa_all_readers_coverage(int reader_id = 0); //从数据库读取地图集覆盖范围,初始化所有分站的地图集
  432. int init_traffic_lights(int light_id = 0); //初始化红绿灯
  433. int init_chamber(int chamber_id = 0); //初始化硐室
  434. int init_section(int section_id = 0); //初始化路段
  435. int init_light_group(int group_id = 0); //初始化红绿灯组
  436. int init_light_state(CONNID dwConnID,std::string strIp);
  437. int init_rules(int rule_id = 0); // 初始化规则表 2017/08/01
  438. int init_leader_arrange(); // 领导排班
  439. int init_smart_pointer_var();
  440. int init_reader_boundary_area(int reader_id = 0); // 从数据库中读取边界信息初始化分站的边界
  441. int init_moving_reader(int reader_id = 0); // 从数据库中读取移动分站配置信息
  442. void clear_leader_arrange(); // 清空列表
  443. void clear_att_area();
  444. int init_handup_vehicle();//初始化手动车辆list,web界面手动拖动车辆图标功能
  445. int is_in_handup_area(double real_x, double real_y, double list_x, double list_y);//车辆定位是否在手动拖动后的坐标附近
  446. void erase_handup_vehicle(std::string card_id);//擦除hand_up数据库中的对应记录
  447. int refresh_handup_list(string cardid);//刷新hand_up list
  448. void deal_card_msg_handup( std::shared_ptr<Card> card );//手动拖车走业务
  449. void deal_card_dept_changed(std::shared_ptr<Card> card, int dept_id); //
  450. int init_data_coalminingface_RegularCycle();//初始化综采面中计算正规循环率的参数
  451. int init_data_coalmining_RegularCycle();//初始化采煤机中间计算变量值
  452. int init_data_pre_coalmining_RegularCycle();//初始化采煤机有关正规循环率计算的先前参数
  453. int init_restart_halfcoalmining_regularcycle();//初始化半刀未完成的正规循环率情况
  454. int store_data_coalmining_Regular_cycle(std::shared_ptr<CoalminingRegularCycleDetail> ReguilarCycle );//存储挖煤机每刀开始数据
  455. int store_halfknife_coalmining_Regular_cycle(std::shared_ptr<CoalminingRegularCycleDetail> reguilarCycle );//存储挖煤机前半刀开始数据
  456. int Update_data_coalmining_Regular_cycle(std::shared_ptr<CoalminingRegularCycleDetail> reguilarCycle );//存储挖煤机每刀结束数据
  457. int update_halfknife_coalmining_Regular_cycle(std::shared_ptr<CoalminingRegularCycleDetail> reguilarCycle ); //完成半刀,更新刀数值
  458. int get_data_coalmining_scheduletimes(int workface_id,double& scheduletimes);//获取综采面的计划刀数
  459. void find_regularcyclerate_startpoint(CoalFaceStartPos &pos, std::shared_ptr<Card> card,std::shared_ptr<CoalMiningArea> area, int tagNum, std::shared_ptr<CoalMiningRegularCycle> coal); // 查找采煤机起到位置
  460. //lemon monkey car 2017/09/27
  461. //void init_monkeycar_info();
  462. void init_monkeycar_base_info();
  463. void init_coordinate_string2vec(string str,vector<point_2>&tmp);
  464. //int init_patrol_info(int task_id = 0); // 加载巡检任务及巡检路线/
  465. int init_patrol_info(std::string card_id);
  466. int delete_patrol_info(std::string card_id);
  467. int get_help_card_nums();
  468. int init_att_area(); // 载入考勤区域信息
  469. // 载入历史数据
  470. void load_his_data();
  471. void load_his_area(); // 所在区域
  472. void load_his_event_data(); // 分站状态
  473. void load_his_card_postion_vehicle(); // 所在位置
  474. void load_his_card_postion_staff();
  475. void load_his_driving_face_card_postion(); // 所在位置
  476. void load_his_driving_face_card_state(); // 载入掘进面卡状态
  477. void init_drivingface_warning_point();
  478. void init_geological_fault();
  479. void load_his_card_state(); // 加载卡状态
  480. void load_drivingface_card_curshift_position();//从历史数据中加载掘进机的初始状态。当前班次的开始值
  481. float get_drivingface_warning_point_dis(std::shared_ptr<Card> card);
  482. // 载入报警数据
  483. void load_alarm_reader();
  484. MYSQL_RES* getMysqlRes(const char* sql);
  485. // 接口数据解析,为前端发送过来的数据
  486. void parse_edit_map(int map_id);
  487. void parse_edit_area(int area_id);
  488. void parse_edit_reader(int reader_id);
  489. void parse_edit_card(string card_id);
  490. void parse_edit_staffer(string staffer_id);
  491. void parse_edit_vehicle(string vehicle_id);
  492. void parse_edit_path(int path_id);
  493. void parse_set_limit_value();
  494. void parse_call_card();
  495. void parse_clear_card();
  496. void parse_deal_help();
  497. // 初始化websocket
  498. void ws_init(); // 初始化全局变量
  499. void ws_open(); // 连接
  500. void ws_close(); // 关闭
  501. void ws_login(); // 登录
  502. void ws_logout(); // 退出
  503. void ws_init_ex();
  504. void ws_open_ex();
  505. void ws_login_ex();
  506. void ws_logout_ex();
  507. void clear_listener(); // 程序退出后清空socket连接
  508. void clear_all_list(); // 程序退出后清空所有缓存列表
  509. // socket接收数据
  510. // 数据包结构为: 数据长度 + 特征字 + 分站数据区 + 标识卡数据区(卡数据 * N) + CRC校验码
  511. void parse_data_server(const BYTE * pData, int nLen, CONNID dwConnId); // 解析socket接收到的数据包,可能有粘包
  512. void parse_package_data(BYTE* DataBuffer, int nLen, CONNID dwConnID); // 解析分站发送的单个数据包
  513. // 解析定位数据
  514. void parse_data_locate_reader(BYTE * DataBuffer, int& nCurPos, int nLen, CONNID dwConnID, int& reader_id); // 分站数据区
  515. void parse_data_ctrl_reader(BYTE * DataBuffer, int& nCurPos, int nLen, CONNID dwConnID, int& reader_id); // 控制分站数据区
  516. void parse_data_signal_lamp(BYTE * DataBuffer, int& nCurPos, int nLen, CONNID dwConnID); //信号灯数据区
  517. int parse_inav_msg(INAVLocateMsg* msgPtr); // 解析惯导数据
  518. void deal_inav_locate_msg(INAVLocateMsg* msgPtr, int card_num); // 解析惯导定位数据
  519. INAV_STATUS calculate_inav_state(INAVLocateData* cardData); // 计算惯导数据
  520. void calculate_inav_locate_by_magic(std::shared_ptr<Card> card, INAVLocateData* cardData); // 根据地磁数据计算位置
  521. void write_inav_locate_magic_data(std::shared_ptr<Card> card, INAVLocateData* cardData); // 存储地磁数据计算结果
  522. void log_card_inav_state(INAV_STATUS card_state, string card_id); // 将惯导数据写入到日志中
  523. void parse_data_lights_state(BYTE* DataBuffer, int& nCurPos, int reader_id, unsigned short wChr); // 解析交通灯数据
  524. //int parse_data_locate_card(BYTE* DataBuffer, int& nCurPos, int reader_id, unsigned short wChr);
  525. int parse_data_moving_reader(BYTE * DataBuffer, int& nCurPos, int nLen, CONNID dwConnID, int& reader_id); // 解析移动分站
  526. int parse_data_moving_reader_card(BYTE* DataBuffer, int& nCurPos, int reader_id); // 解析分站上传的移动分站卡数据
  527. unsigned long long parse_data_locate_card(BYTE* DataBuffer, int& nCurPos, int reader_id, unsigned short wChr, unsigned long long ct_time = 0,int pos = 0); // 解析单个卡数据
  528. int get_locate_msg_type(BYTE* DataBuffer); // 获取卡数据定位方式,用来区域tof和tdoa
  529. std::shared_ptr<Card> parse_tof_locate_msg(TofLocateMsg* DataBuffer, int cardNum); // 解析tof数据
  530. int parse_data_signal_lamp_req_status(BYTE * DataBuffer, int& nCurPos, CONNID dwConnID, uint32_t& id); //解析信号灯请求状态指令
  531. void send_signal_lamp_status(const uint32_t& id); //下发此红绿灯的状态
  532. void get_schedulestartuptime(int cardType, std::string strCard,double &scheduleStartupTime,std::string strDate); // 更新开机表字段
  533. std::string get_json_vehicle_state(); // 构造车卡状态JSON
  534. void open_machine(std::shared_ptr<Card> card); // 开机
  535. void close_machine(std::shared_ptr<Card> card, bool bTimeOut=true); // 关机
  536. int restart_update_unprocess_record(); // 重启处理未更新关机时间的记录
  537. int bind_card_vehicle(); // 绑定车卡与卡号
  538. int bind_card_workface(); // 绑定车卡与工作面
  539. void get_shakethrethold(std::shared_ptr<Card> card, int &threshold); // 取震动阈值,临时方案,linux版再修正
  540. int zero_update_unprocess_record(time_t tCurTime); // 零点时关机再开机
  541. int store_machine_state(std::shared_ptr<Card> card); // 存储采煤机/掘进机开关机状态的时间段到数据库
  542. void parse_data_locate_card_vehicle(BYTE* DataBuffer, int& nCurPos, std::shared_ptr<Card> card, unsigned short wChr); // 解析单个卡数据,包括tof和toda
  543. // 根据协议解析分站缓存的历史数据
  544. void parse_data_locate_reader_his(BYTE * DataBuffer, int nLen, int& nCurPos, int& reader_id, int& nTick, CString& strtime, unsigned short wChr);
  545. void parse_data_locate_card_his(BYTE* DataBuffer, int& nCurPos, int reader_id, DWORD wTickCount, CString strTime, unsigned short wChr);
  546. void parse_data_locate_card_his_tdoa(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime);
  547. void parse_data_locate_card_his_tdoa_package(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime);
  548. void parse_data_locate_card_his_tof_card(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime);
  549. void parse_data_locate_card_his_tdoa_card(BYTE* DataBuffer, int nLen, int reader_id, DWORD wTickCount, CString strTime, CString strHistTime);
  550. void parse_data_locate_card_his_sync_time(BYTE* DataBuffer, int nLen, CString strTime, CString strHistTime, WORD wChr);
  551. // 解析自组网数据
  552. void parse_data_adhoc(BYTE* DataBuffer, int& nCurPos, int reader_id);
  553. // 解析分站时间同步
  554. void parse_data_reader_synctime(BYTE *DataBuffer, int nLen, int& nCurPos, WORD wChr);
  555. std::shared_ptr<_SOCK> get_socket_by_Id(CONNID dwConnID); // 从列表中通过connid获取socket
  556. void add_socket_to_list(CONNID dwConnID, DWORD reader_id, DEVICE_TYPE rt); //
  557. int add_socket_to_list(CONNID dwConnID, DWORD reader_id, DEVICE_TYPE rt,BOOL refresh); // 将新连接的socket添加到列表
  558. string get_ip_by_id(const CONNID& dwConnID); //从连接id获得ip地址
  559. void remove_socket(CONNID dwConnID); // socket连接中断后,从列表中删除
  560. // 向分站发送数据
  561. BOOL SendData(CONNID dwConnID, WORD wCharacterWord, int wLength, BYTE* DataBuffer);
  562. // 将设置的灯添加到列表,同一个灯的状态会覆盖,使用最后一个状态控制
  563. 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); // 将控制等指令加入到指令列表
  564. void send_call_light(); // 发送控制等指令
  565. void send_call_light(BYTE ctrl_cmd, int light_id, int ctrl_type, int ctrl_color,int light_shape); //
  566. void send_call_light(int light_id,int color,std::string ip);
  567. void send_call_light(const int& light_id,const bool& postive,const int& color,const std::string& ip);
  568. void send_call_light(const int& light_id,const uint8_t& p_color,const uint8_t& n_color,const std::string& ip,bool b);
  569. LIGHT_SHAPE get_light_sharp(const op::LIGHT_COLOUR& color);
  570. // 获取json串
  571. string get_json_login(); // websocket登录接口
  572. string get_json_logout(); // websocket退出接口
  573. bool need_display_verification(std::shared_ptr<Card> card); //是否需要推送 false 不需要 true 继续执行
  574. string get_json_down_and_up(std::shared_ptr<Card> card); // 升入井接口,当有升井、入井数据时发送
  575. string get_json_special_area_process(std::shared_ptr<Card> card); // 进入特殊区域接口,当车辆标识卡信号丢失,根据特殊区域业务,判断车辆进入相应特殊区域时发送
  576. string get_json_all_special_area_data(); // 所有在特殊区域的车辆,用于前端登录时,发送全部数据
  577. string get_json_drivingface_card_position(std::shared_ptr<Card> card); // 掘进机状态接口,发送给web端
  578. int insert_data(int index, int key, StatisticDataStr** header); // 用来分组计数,给前端实时数据时使用
  579. void delete_memory(StatisticDataStr *header); // 释放局部变量
  580. //int get_json_statistic_vehicle_data(Json::Value& vehicle_data);
  581. Json::Value get_json_statistic_vehicle_data(Json::Value& vehicle_data);
  582. Json::Value get_json_statistic_staff_data(Json::Value& staff_data);
  583. Json::Value get_json_statistic_data(StatisticDataStr* header); // 每秒发送统计数据,里面包含了所有卡的位置信息,包括人员、车辆 == 处理链表中的数据成json
  584. int get_json_node_position(std::shared_ptr<Card> card,Json::Value& detailNode);
  585. string get_json_card_statistic();//所有实时位置信息 handle get_json_statistic_vehicle_data get_json_statistic_staff_data
  586. string get_json_all_data(); // 前端有用户登录时,发送
  587. string get_json_device_state(); // 分站状态信息
  588. string get_json_help(); //求救json
  589. string get_json_event(bool bAll = false);
  590. string get_json_all_traffic_lights();//lemon 2018/05/15
  591. void get_json_all_traffic_lights(std::shared_ptr<op::TrafficLightGroup>);//lemon 2018/05/15
  592. string get_json_call_list(); // 呼叫列表 not handle
  593. string get_json_new_device_state(); // 分站状态信息
  594. string get_json_count_area(); //统计区域人数 not handle
  595. string get_json_leader_arrange(); // 领导带班情况
  596. Json::Value get_section_json_alarm(); // 路段告警
  597. Json::Value get_light_json_alarm(); // 红绿灯告警
  598. Json::Value get_red_light_json_alarm(); // 闯红灯告警
  599. void send_json_data(string cmd, string data, bool is_login = false); // 向web端发送json数据
  600. // 业务处理
  601. void deal_readers(); // 统计分站连接状态信息
  602. void deal_readers_event(EVENT_TYPE et,bool falg,const std::shared_ptr<Reader> &r);
  603. void deal_lamp_light_event(EVENT_TYPE et,bool flag,const std::shared_ptr<op::TrafficLight>& ptl);
  604. void deal_areas(); // 统计区域状态信息,如超员
  605. void set_card_pos_state(std::shared_ptr<Card> card); //设置标识卡考勤状态
  606. void deal_card_msg(std::shared_ptr<Card> card, bool is_hist = false); // 根据标识卡位置,处理相关业务
  607. int store_data_run_red_light(std::shared_ptr<Card> card,std::shared_ptr<RunRedLight> runredlight);
  608. void deal_run_red_light_alarm(std::shared_ptr<RunRedLight> runredlight, bool is_red_light);
  609. void deal_run_red_light_alarm(std::shared_ptr<Card> card,std::shared_ptr<RunRedLight> runredlight);
  610. void Calc_CoalMining_RegularCycleRate(std::shared_ptr<Card> card);//计算挖煤机的正规循环率
  611. int store_data_coalmining_Pos(int workface_id, std::string dis_record);//间隔60s上报挖煤机的位置
  612. void cal_card_position_by_msg(std::shared_ptr<Card> card); // 根据接收到的底层数据计算标识卡位置
  613. void deal_hist_card_postion(); // 根据加载历史标识卡位置,设置标识卡所在区域等信息
  614. void deal_his_card_list(std::shared_ptr<Card> card); // 设置加载历史标识卡的状态
  615. void card_enter_mine(std::shared_ptr<Card> card); // 升入井判断,根据井上井下状态判断升入井
  616. void card_enter_mine(std::shared_ptr<Card> card, POS_DEVICE_TYPE pdt); // 升入井操作,根据pdt区域升井、入井
  617. void card_down_mine(std::shared_ptr<Card> card); // 入井业务处理,1、通知前端,2、入库,3
  618. void card_up_mine(std::shared_ptr<Card> card); // 标识卡升井后的处理,1、通知前端,2、入库,3、结束相关告警,4、重置列表与状态
  619. void card_enter_map(std::shared_ptr<Card> card); // 标识卡位置切换地图,根据分站所在地图判断
  620. void card_enter_area(std::shared_ptr<Card> card); // 标识卡切换区域,
  621. //lemon monkey car
  622. void handle_reverse_alarm(std::shared_ptr<Card> card,int16_t antid,uint32_t ct,double d);
  623. //lemon 2017/11/20
  624. void card_deal_other_business(std::shared_ptr<Card> card);
  625. bool determine_Save_Point_Or_Not(std::shared_ptr<Card> card);
  626. void deal_alarm_card_motionless(std::shared_ptr<NAMESPACE_POINT::card_interface> ci,bool flag);
  627. void iksdk_db(const std::shared_ptr<Card> card);
  628. void card_enter_special_area(std::shared_ptr<Card> card, int area_id); // 标识卡进入特殊区域
  629. void card_leave_area(std::shared_ptr<Card> card, std::shared_ptr<Area> area); // 标识卡离开区域处理,包括补全离开时间、结束相关告警
  630. void deal_card_state(std::shared_ptr<Card> card); // 标识卡状态处理,主要为低电量和呼救状态
  631. void deal_card_drivingface_permission(std::shared_ptr<Card> card); // 根据工种类型判断,靠近掘进机告警业务
  632. void deal_card_drivingface_permission(std::shared_ptr<Card> card,int id); // 根据距离判断,靠近掘进机告警业务,已弃用
  633. void deal_alarm_card(std::shared_ptr<Card> card, std::shared_ptr<CardMap> dest_card_list, bool is_alarm, ALARM_FLAG tag); // 处理标识卡报警信息,包括超时、超速等
  634. void deal_drivingface_alarm(std::shared_ptr<Card> card, bool is_alarm, ALARM_FLAG tag);// 掘进机告警记录存储到数据库
  635. void deal_drivingface_alarm_all(std::shared_ptr<Card> card,std::shared_ptr<DrivingfaceCard> drivingface_card); // 掘进面告警,主要为危险点告警
  636. void deal_alarm_area(std::shared_ptr<Area> area, std::shared_ptr<AreaMap> dest_area_list, bool is_alarm, ALARM_FLAG tag,int tyep); // 区域告警业务逻辑
  637. void deal_warning_point_alarm(uint64_t key,const std::shared_ptr<Card>&card);
  638. void deal_card_lost_state(); // 标识卡信号丢失业务判断
  639. int get_special_area_id(shared_ptr<Card> card); // 车辆丢失信号后,通过车辆所在位置,判断车辆进入的盲区
  640. int deal_traffic_lights(std::shared_ptr<Card> card); // 根据卡位置、车辆级别控制交通灯
  641. void deal_alarm_vehicle(const std::string & cid,std::shared_ptr<Card> c1=nullptr);
  642. int get_drivingface_area_id(const std::string& card_id); //根据id去获得区域信息
  643. int deal_over_speed(std::shared_ptr<Card> card); //处理超速
  644. int deal_area_over_speed(std::shared_ptr<Card> card); //处理区域超速
  645. int deal_relationship_between_person_and_vehicle(std::shared_ptr<MovingReader> pReader); // 人上车业务判断
  646. int deal_relationship_between_person_and_vehicle(std::shared_ptr<Card> card); // 人上车业务判断
  647. int card_enter_chamber(std::shared_ptr<Card> card,std::shared_ptr<Section> section); // 车辆进入避车硐室,未启用
  648. int select_pos_output(std::shared_ptr<Card> card); // 通过车辆行驶方向选择偏移后的位置坐标,暂未启用
  649. void cal_distance_of_card(); // 循环遍历,比较车辆两两之间的距离,更新车辆会车状态
  650. void reset_vehicle_meeting_state(); // 设置车辆会车状态
  651. void reset_map_card(); // 清除地图中缓存的标识卡列表, 暂未使用
  652. bool is_in_rectangle(_point p, double dblleft, double dbltop, double dblright, double dblbottom); // 判断点是否在矩形空间内
  653. bool is_in_circle(_point p1, _point p2, double r, double scale); // 判断点是否在圆内
  654. // save to database
  655. void execute_sql(const char* sql); // 执行sql语句,保存到数据库
  656. void deal_card_drivingface_real(std::shared_ptr<Card> card,std::shared_ptr<DrivingfaceCard> drivingface_card); // 处理掘进机实时数据
  657. void calculate_card_postion_by_tof(std::shared_ptr<Card> card); // 保存卡位置
  658. void process_driving_face_start_service(std::shared_ptr<Card> card); // 处理采掘面
  659. void send_drivingface_card_position_json(bool approve = false); // 向前端发送掘进机进度及状态信息
  660. void write_drivingface_shift_start_data(std::shared_ptr<Card> card); // 添加新的掘进机开关机记录
  661. void driving_face_shift_start(); // 判断新的掘进机班次进度记录
  662. void process_driving_face_end_service(std::shared_ptr<Card> card); // 掘进机停机后补全掘进机开关机记录
  663. void store_driving_face_data(std::shared_ptr<Card> card); // 添加新的掘进机班次进度
  664. void update_driving_face_data(std::shared_ptr<Card> card);// 更新掘进机班次进度
  665. void write_his_drivingface_real(std::shared_ptr<Card> card); // 保存掘进机实时位置信息,只保存距离最大的数据
  666. void save_card_postion(std::shared_ptr<Card> card); // 保存卡历史位置
  667. void save_raw_data_card_tof(std::shared_ptr<Card> card); // 保存tof实时数据信息,用来保存掘进机数据信息
  668. void save_card_postion_ex(std::shared_ptr<Card> card); // 补录卡数据
  669. bool IsInLine(_point p1, _point p2, _point p3); // 判断三点是否在同一直线上
  670. void store_data_card(std::shared_ptr<Card> card, int tag); // 根据tag保存与卡相关的数据,主要为位置、考勤、区域记录
  671. void store_data_event(std::shared_ptr<YaEvent> ev); // 保存告警事件记录
  672. void save_patrol_data(std::shared_ptr<PatrolTask> pTask, std::shared_ptr<PatrolPoint> pPoint); // 保存巡检任务状态记录
  673. int store_data_light(std::shared_ptr<Light> light,int tag); // 存储交通灯状态信息
  674. int store_data_traffic_red_light(std::shared_ptr<Light> light,std::shared_ptr<Card> card); //存储闯红灯数据
  675. int store_data_section(std::shared_ptr<Section> section,time_t cur_time,int tag); // 存储路段状态
  676. // 打包数据
  677. void package_data(); // 打包位置数据json发送给前端
  678. // 通用方法
  679. int API_TimeToString(string &strDateStr,const time_t &timeData); // 时间转字符串
  680. int API_StringToTime(const string &strDateStr,time_t &timeData); // 字符串转时间
  681. //void formatByteArray(CString &strBuf, BYTE * buf, int nLen);
  682. time_t formatByteArray(std::string &strBuf, BYTE * buf, int nLen); // 将接收到的字节数组,格式化为16进制字符串
  683. time_t formatByteArray_s(std::string &strBuf, std::string ip,BYTE * buf, int nLen); // 将接收到的字节数组,格式化为16进制字符串
  684. void show_log( LPCTSTR szlog, BOOL bSave = true); // 显示信息到主窗体
  685. void AddItem(CString strvalue, int readerid, BOOL is_closed, DEVICE_TYPE rt); // 在主窗体中显示已连接的分站列表
  686. void AddItem(std::shared_ptr<_SOCK> &s);
  687. // 响应web接口
  688. void parse_json_data_set_limit_value(const char* sz); // 响应web端发送的系统设置指令
  689. int parse_json_data_hand_up(string card_id); // 响应web端发送的移动静止的车辆图标指令
  690. void parse_json_data_call_card_cancel(sio::message::ptr const& data); // 响应web端发送的取消呼叫指令
  691. void parse_json_data_call_card(sio::message::ptr const& data); // 响应web端发送的呼叫指令
  692. void parse_json_data_clear_card(sio::message::ptr const& data); // 响应web端发送的清除盲区卡指令
  693. void parse_json_data_deal_help(sio::message::ptr const& data); // 响应web端发送的处理呼救指令
  694. int parse_json_data_set_light_color(sio::message::ptr const& data); // 响应web端发送的控制交通灯指令
  695. int parse_json_data_request_counts_info(sio::message::ptr const& data); // 响应web端发送的请求统计计数指令
  696. int parse_json_data_reader_pos_change(sio::message::ptr const& data); // 响应web端发送的分站位置改变指令
  697. string parse_json_data_person_on_car(sio::message::ptr const& data); // 响应web端发送的根据用户请求人上车状态指令
  698. void deal_call_edit_map(int id, EDIT_TYPE_ID edit_type_id); // 前端编辑地图后,通知采集,采集重新载入
  699. void deal_call_edit_area(int id, EDIT_TYPE_ID edit_type_id); // 前端编辑区域后,通知采集,采集重新载入
  700. void deal_call_edit_reader(int id, EDIT_TYPE_ID edit_type_id); // 前端编辑分站后,通知采集,采集重新载入
  701. void deal_call_edit_card(string id, EDIT_TYPE_ID edit_type_id); // 前端编辑标识卡后,通知采集,采集重新载入
  702. void deal_call_edit_staff(string id, EDIT_TYPE_ID edit_type_id); // 前端编辑人员后,通知采集,采集重新载入
  703. void deal_call_edit_vehicle(string id, EDIT_TYPE_ID edit_type_id); // 前端编辑车辆后,通知采集,采集重新载入
  704. void deal_call_edit_adhoc(string id, EDIT_TYPE_ID edit_type_id); // 前端编辑自组网卡后,通知采集,采集重新载入
  705. int deal_call_edit_section(int id,EDIT_TYPE_ID edit_type_id); //web端编辑路段信息
  706. int deal_call_edit_light(int id,EDIT_TYPE_ID edit_type_id); //web端编辑灯信息
  707. int deal_call_edit_light_group(int id,EDIT_TYPE_ID edit_type_id); //web端编辑红绿灯组信息
  708. int deal_call_edit_chamber(int id,EDIT_TYPE_ID edit_type_id); //web端编辑硐室信息
  709. void deal_call_edit_rules(int id,EDIT_TYPE_ID edit_type_id);//lemon 2017/08/01
  710. int get_ins_cal_list(); //获得惯导校准数据列表
  711. std::string get_json_person_on_car(); //生成人上车json数据map<string,OnVehicleData> real_on_card_data;
  712. std::string get_json_person_on_car(map<string,OnVehicleData>& real_on_card_data); //生成人上车json数据;
  713. std::string get_json_all_person_on_car(std::string val); //生成所有人是否在车上的状态列表
  714. Json::Value get_json_all_person_on_car(); //生成所有人是否在车上的状态列表
  715. void deal_call_edit_patrol_task(string id, EDIT_TYPE_ID edit_type_id); // 前端编辑巡检任务时,通知采集重新载入
  716. void remove_card(string card_id); // 从列表中删除标识卡记录,主要用在前端编辑卡信息,执行删除操作
  717. void clear_card_from_list(std::shared_ptr<Card> card); // 从缓存列表中删除标识卡,升井时使用
  718. void add_event(std::shared_ptr<YaEvent> ev); // 将报警事件添加到全局缓存列表,一是产生新的告警,而是更新告警信息
  719. void remove_event(std::shared_ptr<YaEvent> ev); // 从报警事件缓存列表删除,结束报警时使用
  720. void check_patrol(); // 巡检状态判断,系统定时检测巡检状态
  721. void send_call_info(); // 向分站下发呼叫命令,分站收到后,把指令发送给标识卡
  722. void send_call_his_data(); // 向分站下发请求历史数据命令,分站接收到后,发送缓存的历史数据,历史数据最大包4M
  723. void send_sync_reader(); // 向分站下发校时命令,用来校准分站时间,精确到秒
  724. int send_heart_package(); // 与控制分站之间发送心跳数据包,控制分站会给响应,用来检测是否连接正常
  725. void clear_call_info(); // 根据呼叫状态、呼叫时长清除呼叫列表,即清除呼叫成功的卡、清除达到呼叫时长的卡
  726. void clear_call_card_by_user(std::string user_name); // 根据用户名清除呼叫列表
  727. int get_card_id_len(int card_type); // 通过卡类型获取卡号长度,自组网卡卡号只有一个字节
  728. int modify_card_speed(int val); // 校正标识卡运行速度
  729. int send_ins_data(); //发送惯导校准数据
  730. int send_change_reader_to_card(); //向大分站下发,请求小分站切换为卡工作模式
  731. void set_reader_simulate_status(const int& reader_id,bool status);
  732. void check_reader_simulate_status(); //检查分站模拟卡的状态,如果超过5分钟,则允许其切卡
  733. void send_light_auto_control_param(const uint32_t& id,const uint16_t& value,const std::string& ip); //给红绿灯下发断网后自动控制的间隔时间
  734. void deal_light_auto_control_param(const uint32_t& id,CONNID dwConnID); //处理设置红绿灯自动控制的间隔时间
  735. void deal_simulate_card(std::shared_ptr<Card> pCard); //处理模拟卡
  736. bool need_drivingface_algo(std::shared_ptr<Card> pCard); //此卡是否需要调用掘进机算法
  737. void deal_drivingface_regular_cycle(std::shared_ptr<Card> pCard,const op::point& p); //处理正规循环率
  738. void deal_drivingface_regular_cycle(); //超时处理正规循环率
  739. void deal_drivingface_services(std::shared_ptr<Card> pCard); //处理掘进面的业务:1.正规循环率;2.每天当中每一时刻的掘进距离
  740. void deal_drivingface_real_distance(std::shared_ptr<Card> pCard); //处理掘进面每一时刻的掘进距离;
  741. void deal_drivingface_real_distance(); //超时处理掘进距离;
  742. void init_drivingface_recently_info(std::shared_ptr<Card> pCard); //初始化掘进机最新位置和距离信息
  743. void save_drivingface_regular_cycle_data(std::shared_ptr<Card> pCard,std::shared_ptr<DrivingfaceCard> pDrivingfaceCard,const op::point& p); //计算并保存正规循环率数据
  744. op::point get_drivingface_base_point(std::shared_ptr<Card> pCard); //获得掘进面的基准点位置信息
  745. void smooth_row_spacing(double& value,const double& sv); //平滑排距信息
  746. int get_forbidden_area_id(const _point& p); //获得区域id
  747. int auto_call_person(std::shared_ptr<CardMap>& person_list); //呼叫人员
  748. int cancel_call(const std::string& card_id); //取消指定卡的呼叫
  749. bool is_has_chamber(int section_id); //路段内存在可用的硐室
  750. bool isInMainTunel(std::shared_ptr<Card> pCard); //此卡是否在主巷道
  751. int getTunelProperty(std::shared_ptr<Card> pCard); //获得卡的巷道值
  752. void AnalysisAlgoFailedData(int interval = 60000 /*std::shared_ptr<Card> pCard*/);
  753. int GetLandmarkID(std::shared_ptr<Card> card); // 获取与当前位置最近的地标信息
  754. double GetDistance(_point p1, _point p2); // 获取两点间的距离,用来计算位置与地标间的距离
  755. time_t GetCurShiftStartTime(int& shift_id); // 获取当前班次开始时间
  756. time_t GetCurShiftEndTime(); // 获取当前班次结束时间
  757. time_t GetLastShiftStartTime(int& shift_id); // 获取掘进机最后一次开机所在班次开始时间
  758. int GetCurShiftId(struct tm* current_time, int shift_type = 1); // 获取当前班次编号
  759. void GetLandmarkInfo(std::shared_ptr<Card> card); // 通过标识卡的地标信息,用来描述标识卡位置
  760. DIRECTION_TYPE GetDirectionType(_point card_point, _point landmark_point, int map_id); // 获取坐标点在地标的哪个方向
  761. POS_DEVICE_TYPE GetPosDownAndUp(int vehicle_type_id, int area_id); // 根据车辆类型和区域编号,通过考勤区域设置规则,获取当前区域是否为考勤区域
  762. int get_parent_anchor_id(const int& id); //查找anchor_id所属带ip的大分站
  763. int get_parent_anchor_id(const std::string& id);
  764. uint64_t get_drivingface_schedule_value(const uint64_t& id,const uint8_t& type); //根据掘进面或综采面id和类型查询其指定的掘进计划数
  765. void reader_power_battery_alarm(const uint64_t& id,const uint8_t& status); //电池供电需要发送告警
  766. void deal_lamp_light_alarm();
  767. void deal_vehicle_driver_alarm(std::shared_ptr<Card> card);//检查工作面司机与车卡告警距离
  768. int get_vehicle_driverlist(int dept_id, int worktype_id, std::vector<int>& driverList);//获取挖煤机或掘进机对应的司机列表
  769. void Init_data_vehicle_meanpos(std::shared_ptr<Card> card);//初始化采煤机和挖掘机与司机的对应关系,初始化平均坐标
  770. void remove_vehicle_meanpos(std::shared_ptr<Card> card);//去除某个车相关的工作面司机与车卡告警信息
  771. void remove_person_meanpos(std::shared_ptr<Card> card);//去除某个人相关的工作面司机与车卡告警信息
  772. void add_person_meanpos(std::shared_ptr<Card> card);//增加某个人相关的工作面司机与车卡告警信息
  773. void deal_vehicle_driver_changed(std::shared_ptr<Card> card,bool isCalc=false);//处理工作面车和司机告警发生变化(车的开关机和到了检查告警时间)
  774. void start_end_vehicle_driver_alarm(std::shared_ptr<Card> card,bool isStart,double limitdis=0.0,double realdis=0.0);//开始或结束工作面司机与车卡告警
  775. bool calc_vehicle_driver_distance( double mean_vx,double mean_vy,double& distance, std::shared_ptr<VehicleDriverPos> driverPos);//计算司机与车的距离
  776. void reset_vehicle_driver_pos(std::shared_ptr<VehicleDriverPos> Pos);//重置某个平均坐标
  777. public:
  778. int init_workingface_area(int area_id = 0);
  779. public:
  780. //测试函数
  781. void ReadTdoaDistFile(); // 从dist文件中读取信息,计算坐标
  782. int ReadTofDistFile(); // 从TOF数据文件中读取数据,计算坐标
  783. int TestGenerateAllDataJson(); // 测试登录请求所有数据接口
  784. int TestPersonOnCardJson(); // 测试人上车接口
  785. void TestLandmarkRequirement(); // 测试地标信息
  786. void TestCallCard(); // 测试呼叫接口,向分站发送
  787. void TestParseCallCard(); // 测试呼叫接口,接收前端指令
  788. void TestFitData(); // 测试拟合数据
  789. void TestMultSql(); // 测试向多个库写入数据
  790. void TestCardPosition(); // 测试卡靠右行驶
  791. void TestClock(); //测试高精度时钟
  792. string get_json_call_test(); // 组装呼叫测试json
  793. void package_data_test(); // 组装位置数据json
  794. public:
  795. std::unique_ptr<sio::client> _io;
  796. CListBox m_list_log;
  797. CReportCtrl m_listctrl_reader;
  798. // websocket相关
  799. void OnPushMessage(); // 向前端发送数据
  800. // 接收前端发送的json消息
  801. void OnCallMessage(string const& name, sio::message::ptr const& data, bool isAck,sio::message::list &ack_resp);
  802. // 响应登录操作
  803. void OnLogin(string const& name, sio::message::ptr const& data, bool isAck, sio::message::list &ack_resp);
  804. // websocket 连接成功触发的事件
  805. void OnConnected();
  806. // websocket 连接关闭触发的事件
  807. void OnClosed(sio::client::close_reason const& reason);
  808. // websocket 连接失败触发的时间
  809. void OnFailed();
  810. // 向多个Web服务器发送数据
  811. std::unique_ptr<sio::client> _io_ex;
  812. void OnLoginEx(string const& name, sio::message::ptr const& data, bool isAck, sio::message::list &ack_resp);
  813. void OnConnectedEx();
  814. void OnClosedEx(sio::client::close_reason const& reason);
  815. void OnFailedEx();
  816. std::string time_t2string_date(const time_t& t);//由time_t获取日期
  817. // 向指定socket连接发送校准时间 add by zhuyf
  818. int send_sync_reader(CONNID dwConnID);
  819. protected:
  820. afx_msg LRESULT OnRemoveSocket(WPARAM wParam, LPARAM lParam);
  821. afx_msg LRESULT OnMsgRefreshIpList(WPARAM wParam, LPARAM lParam);
  822. public:
  823. UINT m_reader_id_hist;
  824. afx_msg void OnEnUpdateEditReaderid();
  825. afx_msg void OnAbout();
  826. afx_msg void OnBnTest();
  827. public:
  828. /*
  829. *@brief
  830. 出区域时间合理性判断
  831. *param [in] enter_time 进区域时间
  832. *param [in] cur_time 当前出区域时间
  833. *param [in] area_id 当前区域id
  834. *param [in] tag 出区域标识
  835. *param [in] staff_id 员工ID
  836. *param [out] current_leave_time 出区域时间
  837. */
  838. void GetCurrentLeaveAreaTime(const char* enter_time,const char* cur_time,int area_id,string &current_leave_time,int staff_id,int tag = HIS_AREA_LOCATION_LEAVE);
  839. //工时利用率
  840. void store_worktime_detail(std::shared_ptr<Card> card,int tag,const char* cur_time);
  841. bool GetStartWorkTime(int id, char* start_work_time);
  842. //启动时加载未进出区域的卡
  843. int Init_worktime_detail();
  844. };
  845. typedef struct {
  846. CYAServerDlg* handle;
  847. int len;
  848. CONNID dwConnID;
  849. BYTE buf[LENGTH_MSG_4K];
  850. }ParseData;
  851. typedef struct
  852. {
  853. CYAServerDlg* handle;
  854. bool useTime;
  855. char* path;
  856. char* strLog;
  857. }LogInfo;