monitor_communication.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. using NNanomsg;
  2. using NNanomsg.Protocols;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. using Google.Protobuf;
  10. using Message;
  11. using tool;
  12. using Newtonsoft.Json.Linq;
  13. using System.Runtime.InteropServices;
  14. using communication_base;
  15. namespace monitor_main_windows
  16. {
  17. class Monitor_communication : communication_base.Communication_socket_base
  18. {
  19. //由于C#不能多继承 就只能直接写成单例模式了
  20. /// <summary>
  21. /// 单例
  22. /// </summary>
  23. class Nested
  24. {
  25. // 创建模板类实例,参数2设为true表示支持私有构造函数
  26. internal static readonly Monitor_communication instance = Activator.CreateInstance(typeof(Monitor_communication), true) as Monitor_communication;
  27. }
  28. private static Monitor_communication instance = null;
  29. public static Monitor_communication Instance
  30. {
  31. get
  32. {
  33. return Nested.instance;
  34. }
  35. }
  36. // 各类消息委托,收到对应消息即调用对应委托/回调
  37. public delegate void parkspaceStatusDelegate(Parkspace_allocation_data_msg parkspace_status);
  38. public delegate void parkspaceForceUpdateResponseDelegate(Parkspace_force_update_response_msg response);
  39. public delegate void parkspace_manual_search_ResponseDelegate(Parkspace_manual_search_response_msg response);
  40. //停车流程进度消息
  41. public delegate void storing_process_statu_msgDelegate(Storing_process_statu_msg response);
  42. //取车流程进度消息
  43. public delegate void picking_process_statu_msgDelegate(Picking_process_statu_msg response);
  44. // 对应委托/回调句柄
  45. private parkspaceStatusDelegate m_parkspaceStatusCallback;
  46. private parkspaceForceUpdateResponseDelegate m_parkspaceForceUpdateResponseCallback;
  47. private parkspace_manual_search_ResponseDelegate m_parkspacemanual_search_Callback;
  48. private storing_process_statu_msgDelegate m_storing_process_statu_Callback;
  49. private picking_process_statu_msgDelegate m_picking_process_statu_Callback;
  50. // 对应委托/回调句柄设置函数
  51. public void SetParkspaceStatusDelegate(parkspaceStatusDelegate callback)
  52. {
  53. m_parkspaceStatusCallback = callback;
  54. }
  55. public void SetParkspaceForceUpdateResponseDelegate(parkspaceForceUpdateResponseDelegate callback)
  56. {
  57. m_parkspaceForceUpdateResponseCallback = callback;
  58. }
  59. public void SetParkspace_manual_search_ResponseDelegate(parkspace_manual_search_ResponseDelegate callback)
  60. {
  61. m_parkspacemanual_search_Callback = callback;
  62. }
  63. public void SetStoring_process_statu_msgDelegate(storing_process_statu_msgDelegate callback)
  64. {
  65. m_storing_process_statu_Callback = callback;
  66. }
  67. public void SetPicking_process_statu_msgDelegate(picking_process_statu_msgDelegate callback)
  68. {
  69. m_picking_process_statu_Callback = callback;
  70. }
  71. private Monitor_communication()
  72. {
  73. m_parkspace_status_access_lock = new object();
  74. // 设置车位状态回调
  75. SetParkspaceStatusDelegate(ParkspaceStatusUpdate);
  76. }
  77. /// <summary>
  78. /// 初始化
  79. /// </summary>
  80. /// <returns></returns>
  81. public void monitor_communication_init()
  82. {
  83. base.communication_init();
  84. }
  85. /// <summary>
  86. /// 反初始化
  87. /// </summary>
  88. /// <returns></returns>
  89. public void monitor_communication_uninit()
  90. {
  91. base.communication_uninit();
  92. }
  93. /// <summary>
  94. /// 车位更新回调内部定义
  95. /// </summary>
  96. /// <param name="parkspace_status"></param>
  97. private void ParkspaceStatusUpdate(Parkspace_allocation_data_msg parkspace_status)
  98. {
  99. lock (m_parkspace_status_access_lock)
  100. {
  101. m_parkspace_data_msg = parkspace_status;
  102. //comm.m_parkspace_current_status.MergeFrom(parkspace_status);
  103. m_last_parkspace_status_time = DateTime.Now;
  104. }
  105. }
  106. /// <summary>
  107. /// 获取当前车位状态
  108. /// </summary>
  109. public bool Get_parkspace_status(ref Parkspace_allocation_data_msg msg)
  110. {
  111. lock (m_parkspace_status_access_lock)
  112. {
  113. msg = new Parkspace_allocation_data_msg();
  114. msg.MergeFrom(m_parkspace_data_msg);
  115. }
  116. if ((DateTime.Now - m_last_parkspace_status_time).TotalMilliseconds > m_timeout_milli)
  117. {
  118. return false;
  119. }
  120. else
  121. {
  122. return true;
  123. }
  124. }
  125. //重载检查消息--检查是否给终端的消息
  126. /// <summary>
  127. /// 检查消息
  128. /// </summary>
  129. /// <param name="header"></param>
  130. /// <returns></returns>
  131. public override bool check_msg(ByteString message)
  132. {
  133. return true;
  134. }
  135. /// <summary>
  136. /// 检查执行器状态
  137. /// </summary>
  138. /// <param name="header"></param>
  139. /// <param name="receiveTime"></param>
  140. /// <returns></returns>
  141. public override bool check_executer()
  142. {
  143. return base.check_executer();
  144. }
  145. /// <summary>
  146. /// 检查连接状态
  147. /// </summary>
  148. /// <param name="header"></param>
  149. /// <param name="receiveTime"></param>
  150. /// <returns></returns>
  151. public bool check_connect()
  152. {
  153. if ((DateTime.Now.Ticks / 10000 - m_recv_parkspace_status_time.Ticks / 10000) > m_timeout_milli)
  154. {
  155. return false;
  156. }
  157. else
  158. {
  159. return true;
  160. }
  161. }
  162. /// <summary>
  163. /// 发送消息
  164. /// </summary>
  165. /// <param name="msg"></param>
  166. public override void encapsulate_msg(ByteString msg)
  167. {
  168. base.encapsulate_msg(msg);
  169. }
  170. /// <summary>
  171. /// 定时封装发送消息, 一般为心跳和状态信
  172. /// </summary>
  173. public override void encapsulate_send_data()
  174. {
  175. Parkspace_refresh_request_msg t_refresh_req = new Parkspace_refresh_request_msg();
  176. t_refresh_req.BaseInfo = new Base_info();
  177. t_refresh_req.BaseInfo.MsgType = Message_type.EParkspaceRefreshRequestMsg;
  178. t_refresh_req.BaseInfo.TimeoutMs = 5000;
  179. t_refresh_req.BaseInfo.Sender = Message.Communicator.EEmpty;
  180. t_refresh_req.BaseInfo.Receiver = Message.Communicator.EParkspace;
  181. encapsulate_msg(t_refresh_req.ToByteString());
  182. // Console.WriteLine(terminal_Status_Msg.ToString());
  183. }
  184. //重载处理消息
  185. public override void execute_msg(ByteString messgae)
  186. {
  187. Base_msg base_msg = new Base_msg();
  188. try
  189. {
  190. base_msg = Base_msg.Parser.ParseFrom(messgae);
  191. }
  192. catch (Exception ex)
  193. {
  194. Console.WriteLine("message analysis error ! ");
  195. }
  196. if (base_msg.BaseInfo != null)
  197. {
  198. switch (base_msg.BaseInfo.MsgType)
  199. {
  200. //车位数据反馈消息
  201. case Message_type.EParkspaceAllocationDataResponseMsg:
  202. {
  203. Parkspace_allocation_data_msg parkspace_status_msg = Parkspace_allocation_data_msg.Parser.ParseFrom(messgae);
  204. m_parkspaceStatusCallback?.Invoke(parkspace_status_msg);
  205. }
  206. break;
  207. //手动修改车位反馈消息
  208. case Message_type.EParkspaceForceUpdateResponseMsg:
  209. {
  210. Parkspace_force_update_response_msg parkspace_force_update_msg = Parkspace_force_update_response_msg.Parser.ParseFrom(messgae);
  211. m_parkspaceForceUpdateResponseCallback?.Invoke(parkspace_force_update_msg);
  212. }
  213. break;
  214. //手动查询车位反馈消息
  215. case Message_type.EParkspaceManualSearchResponseMsg:
  216. {
  217. Parkspace_manual_search_response_msg parkspace_Manual_Search_Response_Msg = Parkspace_manual_search_response_msg.Parser.ParseFrom(messgae);
  218. m_parkspacemanual_search_Callback?.Invoke(parkspace_Manual_Search_Response_Msg);
  219. }
  220. break;
  221. //数据库状态消息,包括车位信息
  222. case Message_type.EParkspaceAllocationStatusMsg:
  223. {
  224. m_recv_parkspace_status_time = DateTime.Now;
  225. Parkspace_allocation_data_msg parkspace_allocation_data_msg = Parkspace_allocation_data_msg.Parser.ParseFrom(messgae);
  226. if (parkspace_allocation_data_msg.ErrorManager.ErrorCode == 0)
  227. {
  228. UIMessageData.Instance.DatabaseNodeStatu = UIMessageData.NodeStatu.Normal;
  229. }
  230. else
  231. {
  232. UIMessageData.Instance.DatabaseNodeStatu = UIMessageData.NodeStatu.Error;
  233. }
  234. }
  235. break;
  236. //停车指令进度条消息
  237. case Message_type.EStoringProcessStatuMsg:
  238. {
  239. Storing_process_statu_msg storing_Process_Statu_Msg = Storing_process_statu_msg.Parser.ParseFrom(messgae);
  240. m_storing_process_statu_Callback?.Invoke(storing_Process_Statu_Msg);
  241. }
  242. break;
  243. //取车指令进度条消息
  244. case Message_type.EPickingProcessStatuMsg:
  245. {
  246. Picking_process_statu_msg picking_Process_Statu_Msg = Picking_process_statu_msg.Parser.ParseFrom(messgae);
  247. m_picking_process_statu_Callback?.Invoke(picking_Process_Statu_Msg);
  248. }
  249. break;
  250. //中控系统状态消息
  251. case Message_type.ECentralControllerStatuMsg:
  252. {
  253. UIMessageData.Instance.MainNodeStatu = UIMessageData.NodeStatu.Normal;
  254. }
  255. break;
  256. //出口LED系统状态消息
  257. case Message_type.ENotifyStatusMsg:
  258. {
  259. UIMessageData.Instance.OutputUnnormalNodeStatu = UIMessageData.NodeStatu.Normal;
  260. }
  261. break;
  262. //调度模块硬件状态消息
  263. case Message_type.EDispatchStatusMsg:
  264. {
  265. Dispatch_terminal_status_msg dispatch_Terminal_Status_Msg = Dispatch_terminal_status_msg.Parser.ParseFrom(messgae);
  266. UIMessageData.NodeStatu nodeStatu = UIMessageData.NodeStatu.Error;
  267. if (dispatch_Terminal_Status_Msg.TerminalStatus != Terminal_status.ETerminalFault &&
  268. dispatch_Terminal_Status_Msg.TerminalStatus != Terminal_status.ETerminalUnknow)
  269. {
  270. nodeStatu = UIMessageData.NodeStatu.Normal;
  271. }
  272. else
  273. {
  274. nodeStatu = UIMessageData.NodeStatu.Error;
  275. }
  276. switch (dispatch_Terminal_Status_Msg.IdStruct.UnitId)
  277. {
  278. case 0:
  279. {
  280. UIMessageData.Instance.PLCStatuA = nodeStatu;
  281. }
  282. break;
  283. case 1:
  284. {
  285. UIMessageData.Instance.PLCStatuB = nodeStatu;
  286. }
  287. break;
  288. case 2:
  289. {
  290. UIMessageData.Instance.PLCStatuC = nodeStatu;
  291. }
  292. break;
  293. default:
  294. break;
  295. }
  296. }
  297. break;
  298. //终端状态消息
  299. case Message_type.ETerminalStatusMsg:
  300. {
  301. Terminal_status_msg terminal_Status_Msg = Terminal_status_msg.Parser.ParseFrom(messgae);
  302. //Console.WriteLine(terminal_Status_Msg.ToString());
  303. switch (terminal_Status_Msg.IdStruct.TerminalId)
  304. {
  305. case 0:
  306. {
  307. UIMessageData.Instance.TerminalStatuA1 = UIMessageData.NodeStatu.Normal;
  308. }
  309. break;
  310. case 1:
  311. {
  312. UIMessageData.Instance.TerminalStatuA2 = UIMessageData.NodeStatu.Normal;
  313. }
  314. break;
  315. case 2:
  316. {
  317. UIMessageData.Instance.TerminalStatuB1 = UIMessageData.NodeStatu.Normal;
  318. }
  319. break;
  320. case 3:
  321. {
  322. UIMessageData.Instance.TerminalStatuB2 = UIMessageData.NodeStatu.Normal;
  323. }
  324. break;
  325. case 4:
  326. {
  327. UIMessageData.Instance.TerminalStatuC1 = UIMessageData.NodeStatu.Normal;
  328. }
  329. break;
  330. case 5:
  331. {
  332. UIMessageData.Instance.TerminalStatuC2 = UIMessageData.NodeStatu.Normal;
  333. }
  334. break;
  335. case 6:
  336. {
  337. UIMessageData.Instance.OutputTerminal1Statu = UIMessageData.NodeStatu.Normal;
  338. }
  339. break;
  340. case 7:
  341. {
  342. UIMessageData.Instance.OutputTerminal2Statu = UIMessageData.NodeStatu.Normal;
  343. }
  344. break;
  345. default:
  346. break;
  347. }
  348. }
  349. break;
  350. //地面雷达状态消息
  351. case Message_type.EGroundStatusMsg:
  352. {
  353. Ground_status_msg ground_Statu_Msg = Ground_status_msg.Parser.ParseFrom(messgae);
  354. UIMessageData.NodeStatu nodeStatu = UIMessageData.NodeStatu.Error;
  355. if (ground_Statu_Msg.ErrorManager.ErrorLevel == Error_level.MinorError ||
  356. ground_Statu_Msg.ErrorManager.ErrorLevel == Error_level.NegligibleError ||
  357. ground_Statu_Msg.ErrorManager.ErrorCode == 0)
  358. {
  359. nodeStatu = UIMessageData.NodeStatu.Normal;
  360. }
  361. else
  362. {
  363. nodeStatu = UIMessageData.NodeStatu.Error;
  364. }
  365. switch (ground_Statu_Msg.IdStruct.TerminalId)
  366. {
  367. case 0:
  368. {
  369. UIMessageData.Instance.LidarStatuA1 = nodeStatu;
  370. }
  371. break;
  372. case 1:
  373. {
  374. UIMessageData.Instance.LidarStatuA2 = nodeStatu;
  375. }
  376. break;
  377. case 2:
  378. {
  379. UIMessageData.Instance.LidarStatuB1 = nodeStatu;
  380. }
  381. break;
  382. case 3:
  383. {
  384. UIMessageData.Instance.LidarStatuB2 = nodeStatu;
  385. }
  386. break;
  387. case 4:
  388. {
  389. UIMessageData.Instance.LidarStatuC1 = nodeStatu;
  390. }
  391. break;
  392. case 5:
  393. {
  394. UIMessageData.Instance.LidarStatuC2 = nodeStatu;
  395. }
  396. break;
  397. default:
  398. break;
  399. }
  400. }
  401. break;
  402. default:
  403. //Console.WriteLine("unrecognized message received");
  404. break;
  405. }
  406. }
  407. }
  408. private DateTime m_recv_parkspace_status_time; //接收车位状态时间
  409. private Parkspace_allocation_data_msg m_parkspace_data_msg; //车位数据
  410. /// <summary>
  411. /// 车位状态访问锁
  412. /// </summary>
  413. private object m_parkspace_status_access_lock;
  414. /// <summary>
  415. /// 当前时间
  416. /// </summary>
  417. private DateTime m_last_parkspace_status_time;
  418. public int m_timeout_milli = 3000;
  419. }
  420. }