channel_communication.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using chutian_parking_terminal.communication_base;
  7. using chutian_parking_terminal.data_buffer;
  8. using tool;
  9. using chutian_parking_terminal.front_terminal_manager;
  10. using System.Windows.Forms;
  11. using System.Threading;
  12. using Google.Protobuf;
  13. namespace chutian_parking_terminal.communication
  14. {
  15. class Channel_communication : Communication_socket_base
  16. {
  17. //由于C#不能多继承 就只能直接写成单例模式了
  18. /// <summary>
  19. /// 单例
  20. /// </summary>
  21. class Nested
  22. {
  23. // 创建模板类实例,参数2设为true表示支持私有构造函数
  24. internal static readonly Channel_communication instance = Activator.CreateInstance(typeof(Channel_communication), true) as Channel_communication;
  25. }
  26. private static Channel_communication instance = null;
  27. public static Channel_communication Instance
  28. {
  29. get
  30. {
  31. return Nested.instance;
  32. }
  33. }
  34. int terminalId;
  35. //定义委托
  36. public delegate void StoreResponseMsgDelegate(Message.Store_command_response_msg t_store_command_response_msg);
  37. public delegate void PickupResponseMsgDelegate(Message.Pickup_command_response_msg t_pickup_command_response_msg);
  38. public delegate void ParkspaceSearchMsgDelegate(Message.Parkspace_search_response_msg t_parkspace_search_response_msg);
  39. //委托回调句柄
  40. private StoreResponseMsgDelegate m_SetStoreResponseMsgCallBack;
  41. private PickupResponseMsgDelegate m_SetPickupResponseMsgCallBack;
  42. private ParkspaceSearchMsgDelegate m_SetParkspaceSearchMsgCallBack;
  43. //设置回调函数
  44. public void SetStoreResponseMsgDelegate(StoreResponseMsgDelegate callback)
  45. {
  46. m_SetStoreResponseMsgCallBack = callback;
  47. }
  48. public void SetPickupResponseMsgDelegate(PickupResponseMsgDelegate callback)
  49. {
  50. m_SetPickupResponseMsgCallBack = callback;
  51. }
  52. public void SetParkspaceSearchMsgDelegate(ParkspaceSearchMsgDelegate callback)
  53. {
  54. m_SetParkspaceSearchMsgCallBack = callback;
  55. }
  56. private Channel_communication()
  57. {
  58. }
  59. public void channel_communication_init()
  60. {
  61. terminalId = int.Parse(json_file_operation.Instance.read_json_string("ternimalNumber"));
  62. base.communication_init();
  63. m_master_control_connect_status = false;
  64. m_radar_connect_status = false;
  65. m_database_connect_status = false;
  66. m_UnNormalized_module_connect_status = false;
  67. m_event_exit = new EventWaitHandle(false, EventResetMode.ManualReset);
  68. mp_check_connect_thread = new Thread(check_connect_thread);
  69. m_check_connect_condition = true;
  70. mp_check_connect_thread.Start();
  71. }
  72. public void channel_communication_uninit()
  73. {
  74. m_master_control_connect_status = false;
  75. m_radar_connect_status = false;
  76. m_database_connect_status = false;
  77. m_UnNormalized_module_connect_status = false;
  78. m_check_connect_condition = false;
  79. mp_check_connect_thread.Abort();
  80. base.communication_uninit();
  81. }
  82. private void check_connect_thread()
  83. {
  84. while (m_check_connect_condition && !m_event_exit.WaitOne(1))
  85. {
  86. if (m_check_connect_condition)
  87. {
  88. if ((DateTime.Now.Ticks / 10000 - m_master_control_recv_time.Ticks / 10000) < 3000)
  89. {
  90. m_master_control_connect_status = true;
  91. }
  92. else
  93. {
  94. m_master_control_connect_status = false;
  95. }
  96. if ((DateTime.Now.Ticks / 10000 - m_radar_recv_time.Ticks / 10000) < 3000)
  97. {
  98. m_radar_connect_status = true;
  99. }
  100. else
  101. {
  102. m_radar_connect_status = false;
  103. }
  104. if ((DateTime.Now.Ticks / 10000 - m_database_recv_time.Ticks / 10000) < 3000)
  105. {
  106. m_database_connect_status = true;
  107. }
  108. else
  109. {
  110. m_database_connect_status = false;
  111. }
  112. if ((DateTime.Now.Ticks / 10000 - m_UnNormalized_module_recv_time.Ticks / 10000) < 3000)
  113. {
  114. m_UnNormalized_module_connect_status = true;
  115. }
  116. else
  117. {
  118. m_UnNormalized_module_connect_status = false;
  119. }
  120. }
  121. }
  122. }
  123. /// <summary>
  124. /// 检查各个节点连接状态
  125. /// </summary>
  126. /// <returns></returns>
  127. public Message.Error_manager check_statu()
  128. {
  129. Message.Error_manager error = new Message.Error_manager();
  130. if (m_master_control_connect_status &&
  131. m_radar_connect_status &&
  132. m_database_connect_status &&
  133. m_UnNormalized_module_connect_status)
  134. {
  135. error.ErrorCode = 0;
  136. error.ErrorLevel = 0;
  137. return error;
  138. }
  139. else
  140. {
  141. error.ErrorCode = 1;
  142. error.ErrorLevel = Message.Error_level.MinorError;
  143. if (!m_master_control_connect_status)
  144. {
  145. error.ErrorDescription = error.ErrorDescription+"主控未连接!";
  146. }
  147. if (!m_radar_connect_status)
  148. {
  149. error.ErrorDescription = error.ErrorDescription + "雷达未连接!";
  150. }
  151. if (!m_database_connect_status)
  152. {
  153. error.ErrorDescription = error.ErrorDescription + "数据库未连接!";
  154. }
  155. if (!m_UnNormalized_module_connect_status)
  156. {
  157. error.ErrorDescription = error.ErrorDescription + "非标未连接!";
  158. }
  159. else
  160. {
  161. Message.Error_manager unnormalized_module_error_Manager = Front_terminal_manager.Instance.get_unnormalized_module_data_bufferr().get_unnormalized_module_status_msg().StatuCode;
  162. if (unnormalized_module_error_Manager.ErrorCode != 0)
  163. {
  164. error.ErrorDescription = error.ErrorDescription + unnormalized_module_error_Manager.ErrorDescription;
  165. }
  166. }
  167. return error;
  168. }
  169. }
  170. //重载检查消息--检查是否给终端的消息
  171. public override bool check_msg(byte[] msg)
  172. {
  173. return true;
  174. //Message.Base_info base_Info = Message.Base_msg.Parser.ParseFrom(msg).BaseInfo;
  175. //if (base_Info.Receiver == Message.Communicator.ETerminor ||
  176. // base_Info.Receiver == Message.Communicator.EEmpty||
  177. // base_Info.Receiver == Message.Communicator.EMain)//消息类型为空一般表示状态消息
  178. //{
  179. // return true;
  180. //}
  181. //else
  182. //{
  183. // //无效的消息
  184. // return false;
  185. //}
  186. }
  187. //重载检查执行者状态
  188. public override bool check_executer(byte[] msg)
  189. {
  190. return true;
  191. }
  192. //重载处理消息
  193. public override void execute_msg(byte[] msg)
  194. {
  195. Message.Message_type type = Message.Base_msg.Parser.ParseFrom(msg).BaseInfo.MsgType;
  196. switch (type)
  197. {
  198. //终端状态消息
  199. case Message.Message_type.ETerminalStatusMsg:
  200. {
  201. Message.Terminal_status_msg t_terminal_status_msg = Message.Terminal_status_msg.Parser.ParseFrom(msg);
  202. //Console.WriteLine("接收的***:" + t_terminal_status_msg.ToString() + " " + t_terminal_status_msg.SinglechipValidity.ToString() + " " + DateTime.Now.Millisecond);
  203. }
  204. break;
  205. //停车请求回馈消息
  206. case Message.Message_type.EStoreCommandResponseMsg:
  207. {
  208. Message.Store_command_response_msg t_store_command_response_msg = Message.Store_command_response_msg.Parser.ParseFrom(msg);
  209. if (t_store_command_response_msg?.IdStruct.TerminalId == terminalId)
  210. {
  211. m_SetStoreResponseMsgCallBack?.Invoke(t_store_command_response_msg);
  212. }
  213. }
  214. break;
  215. //取车请求回馈消息
  216. case Message.Message_type.EPickupCommandResponseMsg:
  217. {
  218. Message.Pickup_command_response_msg t_pickup_command_response_msg = Message.Pickup_command_response_msg.Parser.ParseFrom(msg);
  219. if (t_pickup_command_response_msg?.IdStruct.TerminalId == terminalId)
  220. {
  221. m_SetPickupResponseMsgCallBack?.Invoke(t_pickup_command_response_msg);
  222. }
  223. }
  224. break;
  225. //数据库查询反馈消息
  226. case Message.Message_type.EParkspaceSearchResponseMsg:
  227. {
  228. Message.Parkspace_search_response_msg t_pickup_search_response_msg = Message.Parkspace_search_response_msg.Parser.ParseFrom(msg);
  229. m_SetParkspaceSearchMsgCallBack?.Invoke(t_pickup_search_response_msg);
  230. }
  231. break;
  232. //取车等候区请求通知
  233. case Message.Message_type.ENotifyRequestMsg:
  234. {
  235. Message.Notify_request_msg t_notify_request_msg = Message.Notify_request_msg.Parser.ParseFrom(msg);
  236. }
  237. break;
  238. //中控状态消息
  239. case Message.Message_type.ECentralControllerStatuMsg:
  240. {
  241. m_master_control_recv_time = DateTime.Now;
  242. }
  243. break;
  244. //数据库状态消息
  245. case Message.Message_type.EParkspaceAllocationStatusMsg:
  246. {
  247. m_database_recv_time = DateTime.Now;
  248. Message.Parkspace_allocation_status_msg t_parkspace_status_msg = Message.Parkspace_allocation_status_msg.Parser.ParseFrom(msg);
  249. Front_terminal_manager.Instance.get_parkspace_status_data_buffer().set_parkspace_status_msg(t_parkspace_status_msg);
  250. }
  251. break;
  252. //雷达状态消息
  253. case Message.Message_type.EGroundStatusMsg:
  254. {
  255. Message.Ground_status_msg t_ground_status_msg = Message.Ground_status_msg.Parser.ParseFrom(msg);
  256. if (t_ground_status_msg?.IdStruct.TerminalId == terminalId)
  257. {
  258. m_radar_recv_time = DateTime.Now;
  259. Front_terminal_manager.Instance.get_ground_radar_data_buffer().set_ground_status_msg(t_ground_status_msg);
  260. }
  261. }
  262. break;
  263. //非标模块状态消息
  264. case Message.Message_type.EUnNormalizedModuleStatuMsg:
  265. {
  266. Message.UnNormalized_module_statu_msg t_UnNormalized_module_status_msg = Message.UnNormalized_module_statu_msg.Parser.ParseFrom(msg);
  267. if(t_UnNormalized_module_status_msg?.IdStruct.TerminalId == terminalId)
  268. {
  269. m_UnNormalized_module_recv_time = DateTime.Now;
  270. Front_terminal_manager.Instance.get_unnormalized_module_data_bufferr().set_unnormalized_module_status_msg(t_UnNormalized_module_status_msg);
  271. }
  272. }
  273. break;
  274. default:
  275. break;
  276. }
  277. }
  278. /// <summary>
  279. /// 发送消息
  280. /// </summary>
  281. /// <param name="msg"></param>
  282. public override void encapsulate_msg(byte[] msg)
  283. {
  284. base.encapsulate_msg(msg);
  285. }
  286. //重载定时封装
  287. public override void encapsulate_send_data()
  288. {
  289. }
  290. private DateTime m_master_control_recv_time; //主控节点消息接收时间
  291. private DateTime m_radar_recv_time; //雷达节点消息接收时间
  292. private DateTime m_database_recv_time; //数据库节消息接收时间
  293. private DateTime m_UnNormalized_module_recv_time; //非标节点消息接收时间
  294. private bool m_master_control_connect_status; //主控节点连接状态
  295. private bool m_radar_connect_status; //雷达节点连接状态
  296. private bool m_database_connect_status; //数据库节点连接状态
  297. private bool m_UnNormalized_module_connect_status; //非标节点连接状态
  298. protected Thread mp_check_connect_thread; //封装的线程
  299. protected bool m_check_connect_condition; //封装的条件变量
  300. protected EventWaitHandle m_event_exit; //防止CPU卡死
  301. }
  302. }