MonitorMainWindows.cs 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193
  1. using Google.Protobuf;
  2. using Message;
  3. using parkMonitor.LOG;
  4. using System;
  5. using System.Collections;
  6. using System.Collections.Concurrent;
  7. using System.Collections.Generic;
  8. using System.ComponentModel;
  9. using System.Data;
  10. using System.Drawing;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading;
  14. using System.Threading.Tasks;
  15. using System.Windows.Forms;
  16. using tool;
  17. using Timer = System.Windows.Forms.Timer;
  18. namespace monitor_main_windows
  19. {
  20. public partial class MonitorMainWindows : Form
  21. {
  22. Timer timer = new Timer();
  23. public static int s_spacesInRow = 18;
  24. public static int s_floors = 13;
  25. public static int s_rows = 1;
  26. public static bool s_isClosing;
  27. private static object s_map_update_lock;
  28. private static object s_parkspace_force_update_queue_lock;
  29. private static object s_parkspace_status_lock;
  30. //用于保存step控件
  31. private ConcurrentDictionary<string, StepControl> m_step_map =
  32. new ConcurrentDictionary<string, StepControl>();
  33. /// <summary>
  34. /// 车位id与车位信息映射
  35. /// </summary>
  36. private Dictionary<int, Parkspace_info> m_idPssMap;
  37. /// <summary>
  38. /// 强制更新反馈消息队列,用于处理同时收到多个反馈消息的情况
  39. /// </summary>
  40. private Queue<Parkspace_force_update_response_msg> m_parkspace_force_update_response_queue;
  41. /// <summary>
  42. /// 当前所有车位状态,由界面更新线程主动更新
  43. /// </summary>
  44. Parkspace_allocation_data_msg m_parkspace_status;
  45. Thread m_update_display_thread;
  46. int m_unitid = -1;
  47. public MonitorMainWindows()
  48. {
  49. m_parkspace_status = new Parkspace_allocation_data_msg();
  50. s_map_update_lock = new object();
  51. s_parkspace_force_update_queue_lock = new object();
  52. s_parkspace_status_lock = new object();
  53. m_parkspace_force_update_response_queue = new Queue<Parkspace_force_update_response_msg>();
  54. m_idPssMap = new Dictionary<int, Parkspace_info>();
  55. s_isClosing = false;
  56. InitializeComponent();
  57. json_file_operation.Instance.json_file_operation_init("./settings.json");
  58. Init();
  59. }
  60. public void Init()
  61. {
  62. //初始化json文件操作
  63. Monitor_communication.Instance.monitor_communication_init();
  64. Monitor_communication.Instance.SetParkspaceForceUpdateResponseDelegate(ParkspaceForceUpdateResponseCallback);
  65. Monitor_communication.Instance.SetParkspace_manual_search_ResponseDelegate(ParkspaceManualSeachResponseCallback);
  66. Monitor_communication.Instance.SetStoring_process_statu_msgDelegate(StoringProcessStatuCallback);
  67. Monitor_communication.Instance.SetPicking_process_statu_msgDelegate(PickingProcessStatuCallback);
  68. // 库位显示
  69. m_update_display_thread = new Thread(new ThreadStart(UpdateParkingSpaceView));
  70. m_update_display_thread.Start();
  71. }
  72. public void Uninit()
  73. {
  74. if(!s_isClosing)
  75. Monitor_communication.Instance.monitor_communication_uninit();
  76. s_isClosing = true;
  77. if (m_update_display_thread != null)
  78. {
  79. m_update_display_thread.Abort();
  80. }
  81. }
  82. /// <summary>
  83. /// 接收到强制更新车位反馈消息回调
  84. /// </summary>
  85. /// <param name="response"></param>
  86. void ParkspaceForceUpdateResponseCallback(Parkspace_force_update_response_msg response)
  87. {
  88. lock (s_parkspace_force_update_queue_lock)
  89. {
  90. if (m_parkspace_force_update_response_queue != null)
  91. {
  92. m_parkspace_force_update_response_queue.Enqueue(response);
  93. }
  94. }
  95. }
  96. /// <summary>
  97. /// 手动查询车位反馈
  98. /// </summary>
  99. /// <param name="parkspace_Manual_Search_Response_Msg"></param>
  100. private void ParkspaceManualSeachResponseCallback(Parkspace_manual_search_response_msg parkspace_Manual_Search_Response_Msg)
  101. {
  102. lock (s_parkspace_force_update_queue_lock)
  103. {
  104. if (parkspace_Manual_Search_Response_Msg != null)
  105. {
  106. // MessageBox.Show(parkspace_Manual_Search_Response_Msg.ToString());
  107. //查看反馈结果
  108. if (parkspace_Manual_Search_Response_Msg.ErrorManager.ErrorCode == 0)
  109. {
  110. if (this.InvokeRequired)
  111. {
  112. this.Invoke(new Action(() =>
  113. {
  114. commendkeyBox.Text = parkspace_Manual_Search_Response_Msg.QueryParkspaceInfoEx[0].CarInfo.License;
  115. }));
  116. }
  117. else
  118. {
  119. commendkeyBox.Text = parkspace_Manual_Search_Response_Msg.QueryParkspaceInfoEx[0].CarInfo.License;
  120. }
  121. m_unitid = parkspace_Manual_Search_Response_Msg.QueryParkspaceInfoEx[0].ParkingspaceUnitId;
  122. }
  123. else
  124. {
  125. MessageBox.Show(parkspace_Manual_Search_Response_Msg.ErrorManager.ToString());
  126. }
  127. }
  128. }
  129. }
  130. /// <summary>
  131. /// 接收到停车流程进度
  132. /// </summary>
  133. /// <param name="msg"></param>
  134. void StoringProcessStatuCallback(Storing_process_statu_msg msg)
  135. {
  136. Console.WriteLine(msg.ToString());
  137. UIMessageData.CommandInfo commandInfo = new UIMessageData.CommandInfo();
  138. string[] Steps_alloc = new string[] { "开始", "分配车位" };
  139. string[] Steps_dispatch = new string[] { "开始", "分配车位", "搬运" };
  140. string[] Steps_confirm = new string[] { "开始", "分配车位", "搬运", "确认车位" };
  141. string[] Steps = new string[] { "开始", "分配车位", "搬运", "确认车位", "完成" };
  142. string[] Backsteps_alloc = new string[] { "清除", "异常结束" };
  143. string[] Backsteps_dispatch = new string[] { "PLC复位", "清除", "异常结束" };
  144. string[] Backsteps_confirm = new string[] { "取消车位", "PLC复位", "清除", "异常结束" };
  145. string[] Backsteps = new string[] { };
  146. int StepIndex = -1;
  147. //分配车位
  148. if (msg.AllocSpaceStep?.StepStatu == Step_statu.EWorking)
  149. {
  150. StepIndex = 2;
  151. }
  152. //调度
  153. else if (msg.DispatchStep?.StepStatu == Step_statu.EWorking)
  154. {
  155. StepIndex = 3;
  156. }
  157. //确认车位
  158. else if (msg.ConfirmSpaceStep?.StepStatu == Step_statu.EWorking)
  159. {
  160. StepIndex = 4;
  161. }
  162. //完成
  163. if (msg.Completed)
  164. {
  165. StepIndex = 5;
  166. }
  167. //确认车位回退
  168. if (msg.BackConfirmStep?.StepStatu == Step_statu.EWorking)
  169. {
  170. Steps = Steps_confirm;
  171. Backsteps = Backsteps_confirm;
  172. StepIndex = 5;
  173. }
  174. //调度回退 两种情况 1.是从确认车位回退的 2.是从调度步骤开始回退
  175. if (msg.BackDispatchStep?.StepStatu == Step_statu.EWorking)
  176. {
  177. //1.从确认车位回退
  178. if (msg.BackConfirmStep?.StepStatu == Step_statu.EFinished)
  179. {
  180. Steps = Steps_confirm;
  181. Backsteps = Backsteps_confirm;
  182. StepIndex = 6;
  183. }
  184. else
  185. {
  186. //2.其他状态说明是从调度开始回退
  187. Steps = Steps_dispatch;
  188. Backsteps = Backsteps_dispatch;
  189. StepIndex = 4;
  190. }
  191. }
  192. //分配车位回退 三种情况 1.确认车位步骤开始回退 2.调度步骤开始回退 3.分配步骤开始回退
  193. if (msg.BackAllocSpaceStep?.StepStatu == Step_statu.EWorking)
  194. {
  195. //若调度和确认回退都未处于完成状态 则是从分配步骤开始回退
  196. if (msg.BackConfirmStep?.StepStatu != Step_statu.EFinished &&
  197. msg.BackDispatchStep?.StepStatu != Step_statu.EFinished)
  198. {
  199. Steps = Steps_alloc;
  200. Backsteps = Backsteps_alloc;
  201. StepIndex = 3;
  202. }
  203. //若是从确认开始回退
  204. else if (msg.BackConfirmStep?.StepStatu == Step_statu.EFinished &&
  205. msg.BackDispatchStep?.StepStatu == Step_statu.EFinished)
  206. {
  207. Steps = Steps_confirm;
  208. Backsteps = Backsteps_confirm;
  209. //不是从本身开始回退只需要自加
  210. StepIndex = 7;
  211. }
  212. //若是从调度开始回退
  213. else if (msg.BackConfirmStep?.StepStatu != Step_statu.EFinished &&
  214. msg.BackDispatchStep?.StepStatu == Step_statu.EFinished)
  215. {
  216. Steps = Steps_dispatch;
  217. Backsteps = Backsteps_dispatch;
  218. //不是从本身开始回退只需要自加
  219. StepIndex = 5;
  220. }
  221. }
  222. //异常结束
  223. if (msg.BackCompleted)
  224. {
  225. if (msg.BackAllocSpaceStep?.StepStatu == Step_statu.EFinished)
  226. {
  227. Steps = Steps_alloc;
  228. Backsteps = Backsteps_alloc;
  229. StepIndex = 4;
  230. }
  231. if (msg.BackDispatchStep?.StepStatu == Step_statu.EFinished)
  232. {
  233. Steps = Steps_dispatch;
  234. Backsteps = Backsteps_dispatch;
  235. StepIndex = 6;
  236. }
  237. if (msg.BackConfirmStep?.StepStatu == Step_statu.EFinished)
  238. {
  239. Steps = Steps_confirm;
  240. Backsteps = Backsteps_confirm;
  241. StepIndex = 8;
  242. }
  243. }
  244. //赋值
  245. commandInfo.Steps = Steps;
  246. commandInfo.BackSteps = Backsteps;
  247. commandInfo.StepIndex = StepIndex;
  248. string input_key = "";
  249. switch (msg.IdStruct.TerminalId)
  250. {
  251. case 0:
  252. {
  253. input_key = "input_A1" + "-" + msg.License;
  254. }
  255. break;
  256. case 1:
  257. {
  258. input_key = "input_A2" + "-" + msg.License;
  259. }
  260. break;
  261. case 2:
  262. {
  263. input_key = "input_B1" + "-" + msg.License;
  264. }
  265. break;
  266. case 3:
  267. {
  268. input_key = "input_B2" + "-" + msg.License;
  269. }
  270. break;
  271. case 4:
  272. {
  273. input_key = "input_C1" + "-" + msg.License;
  274. }
  275. break;
  276. case 5:
  277. {
  278. input_key = "input_C2" + "-" + msg.License;
  279. }
  280. break;
  281. default:
  282. break;
  283. }
  284. TimedData<UIMessageData.CommandInfo> timedData = new TimedData<UIMessageData.CommandInfo>(commandInfo);
  285. UIMessageData.Instance.CommandMap.AddOrUpdate(input_key, timedData, (key, value) => timedData);
  286. }
  287. /// <summary>
  288. /// 接收到取车流程进度
  289. /// </summary>
  290. /// <param name="msg"></param>
  291. void PickingProcessStatuCallback(Picking_process_statu_msg msg)
  292. {
  293. Console.WriteLine(msg.ToString());
  294. UIMessageData.CommandInfo commandInfo = new UIMessageData.CommandInfo();
  295. string[] Steps_search = new string[] { "开始", "查询车位" };
  296. string[] Steps_dispatch = new string[] { "开始", "查询车位", "搬运" };
  297. string[] Steps_release = new string[] { "开始", "查询车位", "搬运", "释放车位" };
  298. string[] Steps_waitfor = new string[] { "开始", "查询车位", "搬运", "释放车位", "等待离开" };
  299. string[] Steps = new string[] { "开始", "查询车位", "搬运", "释放车位", "等待离开", "完成" };
  300. string[] Backsteps_search = new string[] { "清除", "异常结束" };
  301. string[] Backsteps_dispatch = new string[] { "PLC复位", "清除", "异常结束" };
  302. string[] Backsteps_waitfor = new string[] { "取消等待", "PLC复位", "清除", "异常结束" };
  303. string[] Backsteps = new string[] { };
  304. int StepIndex = -1;
  305. //查询
  306. if (msg.SearchSpaceStep?.StepStatu == Step_statu.EWorking)
  307. {
  308. StepIndex = 2;
  309. }
  310. //调度
  311. else if (msg.DispatchStep?.StepStatu == Step_statu.EWorking)
  312. {
  313. StepIndex = 3;
  314. }
  315. //释放
  316. else if (msg.ReleaseSpaceStep?.StepStatu == Step_statu.EWorking)
  317. {
  318. StepIndex = 4;
  319. }
  320. //等待离开
  321. else if (msg.WaitforLeaveStep?.StepStatu == Step_statu.EWorking)
  322. {
  323. StepIndex = 5;
  324. }
  325. //完成
  326. if (msg.Completed)
  327. {
  328. StepIndex = 6;
  329. }
  330. //等待车辆离开回退
  331. if (msg.BackWaitforLeaveStep?.StepStatu == Step_statu.EWorking)
  332. {
  333. Steps = Steps_waitfor;
  334. Backsteps = Backsteps_waitfor;
  335. StepIndex = 6;
  336. }
  337. //调度回退 两种情况 1.是从确认车位回退的 2.是从调度步骤开始回退
  338. if (msg.BackDispatchStep?.StepStatu == Step_statu.EWorking)
  339. {
  340. //1.从确认车位回退
  341. if (msg.BackWaitforLeaveStep?.StepStatu == Step_statu.EFinished)
  342. {
  343. Steps = Steps_waitfor;
  344. Backsteps = Backsteps_waitfor;
  345. StepIndex = 7;
  346. }
  347. else
  348. {
  349. //2.其他状态说明是从调度开始回退
  350. Steps = Steps_dispatch;
  351. Backsteps = Backsteps_dispatch;
  352. StepIndex = 4;
  353. }
  354. }
  355. //查询车位回退 三种情况 1.等待车辆步骤开始回退 2.调度步骤开始回退
  356. if (msg.BackSearchSpaceStepStatu?.StepStatu == Step_statu.EWorking)
  357. {
  358. //调度和确认回退都未处于完成状态 则是从分配步骤开始回退
  359. if (msg.BackWaitforLeaveStep?.StepStatu != Step_statu.EFinished &&
  360. msg.BackDispatchStep?.StepStatu != Step_statu.EFinished)
  361. {
  362. Steps = Steps_search;
  363. Backsteps = Backsteps_search;
  364. StepIndex = 3;
  365. }
  366. //从等待开始回退
  367. else if (msg.BackWaitforLeaveStep?.StepStatu == Step_statu.EFinished &&
  368. msg.BackDispatchStep?.StepStatu == Step_statu.EFinished)
  369. {
  370. Steps = Steps_waitfor;
  371. Backsteps = Backsteps_waitfor;
  372. StepIndex = 8;
  373. }
  374. //从调度开始回退
  375. else if (msg.BackWaitforLeaveStep?.StepStatu != Step_statu.EFinished &&
  376. msg.BackDispatchStep?.StepStatu == Step_statu.EFinished)
  377. {
  378. Steps = Steps_dispatch;
  379. Backsteps = Backsteps_dispatch;
  380. StepIndex = 5;
  381. }
  382. }
  383. //异常结束
  384. if (msg.BackCompleted)
  385. {
  386. if (msg.BackSearchSpaceStepStatu?.StepStatu == Step_statu.EFinished)
  387. {
  388. Steps = Steps_search;
  389. Backsteps = Backsteps_search;
  390. StepIndex = 4;
  391. }
  392. if (msg.BackDispatchStep?.StepStatu == Step_statu.EFinished)
  393. {
  394. Steps = Steps_dispatch;
  395. Backsteps = Backsteps_dispatch;
  396. StepIndex = 6;
  397. }
  398. if (msg.BackWaitforLeaveStep?.StepStatu == Step_statu.EFinished)
  399. {
  400. Steps = Steps_waitfor;
  401. Backsteps = Backsteps_waitfor;
  402. StepIndex = 9;
  403. }
  404. }
  405. //赋值
  406. commandInfo.Steps = Steps;
  407. commandInfo.BackSteps = Backsteps;
  408. commandInfo.StepIndex = StepIndex;
  409. string output_key = "";
  410. switch (msg.IdStruct.TerminalId)
  411. {
  412. case 0:
  413. {
  414. output_key = "output_A1" + "-" + msg.License;
  415. }
  416. break;
  417. case 1:
  418. {
  419. output_key = "output_A2" + "-" + msg.License;
  420. }
  421. break;
  422. case 2:
  423. {
  424. output_key = "output_B1" + "-" + msg.License;
  425. }
  426. break;
  427. case 3:
  428. {
  429. output_key = "output_B2" + "-" + msg.License;
  430. }
  431. break;
  432. case 4:
  433. {
  434. output_key = "output_C1" + "-" + msg.License;
  435. }
  436. break;
  437. case 5:
  438. {
  439. output_key = "output_C2" + "-" + msg.License;
  440. }
  441. break;
  442. default:
  443. break;
  444. }
  445. TimedData<UIMessageData.CommandInfo> timedData = new TimedData<UIMessageData.CommandInfo>(commandInfo);
  446. UIMessageData.Instance.CommandMap.AddOrUpdate(output_key, timedData, (key, value) => timedData);
  447. }
  448. /// <summary>
  449. /// 更新立体停车位显示
  450. /// </summary>
  451. private void UpdateParkingSpaceView()
  452. {
  453. while (!s_isClosing)
  454. {
  455. bool needUpdate = false;
  456. List<Parkspace_info> psList = null;
  457. Thread.Sleep(1000);
  458. bool get_status_result = Monitor_communication.Instance.Get_parkspace_status(ref m_parkspace_status);
  459. // bool connect_status = Communicator.Instance.Get_connect_status();
  460. if (!Monitor_communication.Instance.check_connect())
  461. {
  462. MessageBox.Show("数据库未连接,重新连接中!");
  463. }
  464. lock (s_parkspace_status_lock)
  465. {
  466. if (get_status_result && (m_parkspace_status == null || m_parkspace_status.ParkspaceInfoEx == null))
  467. {
  468. get_status_result = false;
  469. }
  470. }
  471. if (!get_status_result)
  472. {
  473. lock (s_map_update_lock)
  474. {
  475. m_idPssMap.Clear();
  476. }
  477. continue;
  478. }
  479. else
  480. {
  481. lock (s_parkspace_status_lock)
  482. {
  483. psList = m_parkspace_status.ParkspaceInfoEx.ToList();
  484. }
  485. }
  486. if (psList == null || psList.Count <= 0)
  487. {
  488. Thread.Sleep(1000);
  489. continue;
  490. }
  491. //更新映射表
  492. try
  493. {
  494. lock (s_map_update_lock)
  495. {
  496. if (m_idPssMap.Count != psList.Count)
  497. {
  498. m_idPssMap.Clear();
  499. for (int i = 0; i < psList.Count; i++)
  500. {
  501. m_idPssMap.Add(psList[i].ParkingspaceIndexId, psList[i]);
  502. }
  503. }
  504. else
  505. {
  506. for (int i = 0; i < psList.Count; i++)
  507. {
  508. m_idPssMap[psList[i].ParkingspaceIndexId] = psList[i];
  509. }
  510. }
  511. }
  512. }
  513. catch (Exception e) { Console.WriteLine(e.StackTrace); /*Log.WriteLog(LogType.process, LogFile.WARNING, "实时更新所有库位异常");*/ }
  514. Action action = () =>
  515. {
  516. List<Parkspace_info> psList_unit_0 = new List<Parkspace_info>();
  517. List<Parkspace_info> psList_unit_1 = new List<Parkspace_info>();
  518. List<Parkspace_info> psList_unit_2 = new List<Parkspace_info>();
  519. for (int i=0; i<psList.Count();++i )
  520. {
  521. if (psList[i].ParkingspaceUnitId == 0)
  522. {
  523. psList_unit_0.Add(psList[i]);
  524. }
  525. if (psList[i].ParkingspaceUnitId == 1)
  526. {
  527. psList_unit_1.Add(psList[i]);
  528. }
  529. if (psList[i].ParkingspaceUnitId == 2)
  530. {
  531. psList_unit_2.Add(psList[i]);
  532. }
  533. }
  534. int blockSize = s_spacesInRow * s_floors * s_rows;
  535. int offset = (s_rows + 1 - ((blockSize / s_spacesInRow) % s_rows)) * s_spacesInRow;
  536. int max_floor = 14;
  537. //创建控件
  538. if (ParkingSpaceMonitorPanel != null && ParkingSpaceMonitorPanel.Controls.Count == 0 || needUpdate)
  539. {
  540. TableLayoutPanel tlp = new TableLayoutPanel();
  541. tlp.Name = "tlp_ParkingSpace";
  542. tlp.ColumnCount = s_rows;
  543. tlp.RowCount = 1;
  544. tlp.Dock = DockStyle.Fill;
  545. tlp.AutoScroll = true;
  546. tlp.BackColor = SystemColors.GradientActiveCaption;
  547. // 之前s_rows存在问题,默认为1,s_spacesInRow*s_floors构成矩形长宽
  548. for (int i = 0; i < s_rows; i++)
  549. {
  550. TableLayoutPanel temp = new TableLayoutPanel();
  551. temp.Name = "tlp_ParkingSpaceSection" + (i + 1).ToString();
  552. temp.RowCount = s_floors;
  553. temp.ColumnCount = s_spacesInRow;
  554. temp.Dock = DockStyle.Fill;
  555. temp.AutoSize = true;
  556. temp.BackColor = SystemColors.GradientActiveCaption;
  557. temp.Margin = new Padding(5, 2, 5, 2);
  558. for (int floor = max_floor; floor >= 0 ;floor--)
  559. {
  560. int num1 = 0;
  561. int num2 = 0;
  562. int num3 = 0;
  563. for (int j = psList_unit_0.Count() - 1 ; j >= 0; j--)
  564. {
  565. if (psList_unit_0[j].ParkingspaceFloorId == floor)
  566. {
  567. Button btn = new Button();
  568. btn.Anchor = (AnchorStyles.Left | AnchorStyles.Top);
  569. btn.AutoSize = true;
  570. btn.Location = new Point(5, 5);
  571. btn.Margin = new Padding(1, 2, 1, 2);
  572. btn.Padding = new Padding(5);
  573. btn.Name = "lb_parkingSpace" + j;
  574. btn.TextAlign = ContentAlignment.MiddleCenter;
  575. btn.MouseDown += new MouseEventHandler(Btnvalue_Click);
  576. btn.MouseHover += new EventHandler(Btnvalue_Mouse_Hover);
  577. if (((j % 18) % 6) == 5)
  578. {
  579. btn.Margin = new Padding(120, 2, 5, 2);
  580. }
  581. int index = j - j % 6 + num1;
  582. num1++;
  583. btn.Text = "A库位:" + psList_unit_0[index].ParkingspaceLabelId + "\n\n楼层:" + psList_unit_0[index].ParkingspaceFloorId;
  584. btn.BackColor = GetPSColor(psList_unit_0[index].ParkingspaceStatus);
  585. temp.Controls.Add(btn);
  586. }
  587. }
  588. for (int j = psList_unit_1.Count() - 1; j >= 0; j--)
  589. {
  590. if (psList_unit_1[j].ParkingspaceFloorId == floor)
  591. {
  592. Button btn = new Button();
  593. btn.Anchor = (AnchorStyles.Right | AnchorStyles.Top);
  594. btn.AutoSize = true;
  595. btn.Location = new Point(5, 5);
  596. btn.Margin = new Padding(1, 2, 1, 2);
  597. btn.Padding = new Padding(5);
  598. btn.Name = "lb_parkingSpace" + j;
  599. btn.TextAlign = ContentAlignment.MiddleCenter;
  600. btn.MouseDown += new MouseEventHandler(Btnvalue_Click);
  601. btn.MouseHover += new EventHandler(Btnvalue_Mouse_Hover);
  602. if (((j % 18) % 6) == 5)
  603. {
  604. btn.Margin = new Padding(120, 2, 5, 2);
  605. }
  606. int index = j - j % 6 + num2;
  607. num2++;
  608. btn.Text = "B库位:" + psList_unit_1[index].ParkingspaceLabelId + "\n\n楼层:" + psList_unit_1[index].ParkingspaceFloorId;
  609. btn.BackColor = GetPSColor(psList_unit_1[index].ParkingspaceStatus);
  610. temp.Controls.Add(btn);
  611. }
  612. }
  613. for (int j = psList_unit_2.Count() - 1; j >= 0; j--)
  614. {
  615. if (psList_unit_2[j].ParkingspaceFloorId == floor)
  616. {
  617. Button btn = new Button();
  618. btn.Anchor = (AnchorStyles.Left | AnchorStyles.Top);
  619. btn.AutoSize = true;
  620. btn.Location = new Point(5, 5);
  621. btn.Margin = new Padding(1, 2, 1, 2);
  622. btn.Padding = new Padding(5);
  623. btn.Name = "lb_parkingSpace" + j;
  624. btn.TextAlign = ContentAlignment.MiddleCenter;
  625. btn.MouseDown += new MouseEventHandler(Btnvalue_Click);
  626. btn.MouseHover += new EventHandler(Btnvalue_Mouse_Hover);
  627. if (((j % 18) % 6) == 5)
  628. {
  629. btn.Margin = new Padding(120, 2, 5, 2);
  630. }
  631. int index = j - j % 6 + num3;
  632. num3++;
  633. btn.Text = "C库位:" + psList_unit_2[index].ParkingspaceLabelId + "\n\n楼层:" + psList_unit_2[index].ParkingspaceFloorId;
  634. btn.BackColor = GetPSColor(psList_unit_2[index].ParkingspaceStatus);
  635. temp.Controls.Add(btn);
  636. }
  637. }
  638. }
  639. tlp.Controls.Add(temp);
  640. //tlpList.Add(temp);
  641. }
  642. ParkingSpaceMonitorPanel.Controls.Clear();
  643. ParkingSpaceMonitorPanel.Controls.Add(tlp);
  644. needUpdate = false;
  645. }
  646. //更新控件
  647. else
  648. { Control.ControlCollection psCC = ParkingSpaceMonitorPanel.Controls;
  649. foreach (Control segment in psCC)
  650. {
  651. Control.ControlCollection segmentCC = segment.Controls;
  652. //Console.WriteLine("seg::"+segmentCC.Count);
  653. foreach (Control spaces in segmentCC)
  654. {
  655. Control.ControlCollection spaceCC = spaces.Controls;
  656. //Console.WriteLine("spaces::"+spaceCC.Count);
  657. foreach (Control space in spaceCC)
  658. {
  659. if (space.GetType() == typeof(Button))
  660. {
  661. int index = -1;
  662. bool result = int.TryParse(System.Text.RegularExpressions.Regex.Match(space.Text, @"\d+(\.\d+)?").Value, out index);
  663. string unit = space.Text.Substring(0,1);
  664. byte[] array = System.Text.Encoding.ASCII.GetBytes(unit);
  665. int asciicode = (int)(array[0]);
  666. index = (asciicode - 'A')*78 +index;
  667. lock (s_map_update_lock)
  668. {
  669. //Console.WriteLine("text is :" + space.Text+", index:"+index);
  670. if (m_idPssMap.ContainsKey(index))
  671. {
  672. //Console.WriteLine("index:" + index+", status:"+ idPssMap[index].spaceStatus);
  673. space.BackColor = GetPSColor(m_idPssMap[index].ParkingspaceStatus);
  674. }
  675. else if (result)
  676. {
  677. needUpdate = true;
  678. //Console.WriteLine("need update:"+index);
  679. break;
  680. }
  681. }
  682. }
  683. }
  684. }
  685. if (needUpdate)
  686. {
  687. break;
  688. }
  689. }
  690. }
  691. };
  692. if (this != null && this.IsHandleCreated)
  693. {
  694. this.Invoke(action);
  695. }
  696. }
  697. }
  698. /// <summary>
  699. /// 按钮点击事件
  700. /// </summary>
  701. /// <param name="sender"></param>
  702. /// <param name="e"></param>
  703. private void Btnvalue_Click(object sender, MouseEventArgs e)
  704. {
  705. if (e.Button != MouseButtons.Right)
  706. return;
  707. Button btn = (Button)sender;
  708. //实例化窗口,选择待修改状态
  709. FormStatusSelect formStatusSelect = new FormStatusSelect(btn);
  710. formStatusSelect.Location = Control.MousePosition;
  711. formStatusSelect.StartPosition = FormStartPosition.Manual;
  712. formStatusSelect.SetCallback(ForceUpdateStatusCallback);
  713. formStatusSelect.ShowDialog();
  714. }
  715. private void Btnvalue_Mouse_Hover(object sender, EventArgs e)
  716. {
  717. Button btn = (Button)sender;
  718. // 创建the ToolTip
  719. ToolTip toolTip_parkspace_info = new ToolTip();
  720. // 设置显示样式
  721. toolTip_parkspace_info.AutoPopDelay = 20000;//提示信息的可见时间
  722. toolTip_parkspace_info.InitialDelay = 500;//事件触发多久后出现提示
  723. toolTip_parkspace_info.ReshowDelay = 1000;//指针从一个控件移向另一个控件时,经过多久才会显示下一个提示框
  724. toolTip_parkspace_info.ShowAlways = false;//是否显示提示框
  725. // 获取车位信息,处理后显示
  726. int parkspaceID = GetParkspaceIdFromButton(btn);
  727. Parkspace_info space_info = null;
  728. lock (s_parkspace_status_lock)
  729. {
  730. if (parkspaceID <= 0 || m_parkspace_status == null || m_parkspace_status.ParkspaceInfoEx == null)
  731. return;
  732. for (int i = 0; i < m_parkspace_status.ParkspaceInfoEx.Count; i++)
  733. {
  734. if (m_parkspace_status.ParkspaceInfoEx[i].ParkingspaceIndexId == parkspaceID)
  735. {
  736. space_info = m_parkspace_status.ParkspaceInfoEx[i];
  737. break;
  738. }
  739. }
  740. }
  741. if (space_info == null)
  742. return;
  743. // 设置伴随的对象
  744. toolTip_parkspace_info.SetToolTip(btn, space_info.ToString().Replace(",", "\n"));//设置提示按钮和提示内容
  745. }
  746. /// <summary>
  747. /// 定义用于发送修改请求,以及修改button状态的回调函数
  748. /// </summary>
  749. /// <param name="status"></param>
  750. private void ForceUpdateStatusCallback(Parkspace_status status, Button btn)
  751. {
  752. int parkspaceID = GetParkspaceIdFromButton(btn);
  753. lock(s_parkspace_status_lock)
  754. {
  755. if (parkspaceID <= 0 || m_parkspace_status == null || m_parkspace_status.ParkspaceInfoEx == null)
  756. {
  757. MessageBox.Show("车位号有误!"+ parkspaceID);
  758. return;
  759. }
  760. }
  761. SendAndReceive(status, parkspaceID);
  762. }
  763. /// <summary>
  764. /// 发送后接收对应反馈消息
  765. /// </summary>
  766. private void SendAndReceive(Parkspace_status status, int parkspaceID)
  767. {
  768. // 遍历强制更新反馈队列,清除对应车位已存在的反馈消息,即将非对应车位的消息放回队列
  769. lock (s_parkspace_force_update_queue_lock)
  770. {
  771. for (int i = 0; i < m_parkspace_force_update_response_queue.Count; i++)
  772. {
  773. Parkspace_force_update_response_msg response = m_parkspace_force_update_response_queue.Dequeue();
  774. if (response.ManualParkspaceInfoEx != null && response.ManualParkspaceInfoEx.Count > 0 && response.ManualParkspaceInfoEx[0].ParkingspaceIndexId != parkspaceID)
  775. {
  776. m_parkspace_force_update_response_queue.Enqueue(response);
  777. }
  778. }
  779. }
  780. // 发送强制更新请求
  781. Parkspace_info space_info = null;
  782. lock (s_parkspace_status_lock)
  783. {
  784. //用于清除所有车位状态的特殊指令
  785. if (parkspaceID == 9999)
  786. {
  787. space_info = new Parkspace_info();
  788. if (m_parkspace_status.ParkspaceInfoEx.Count() > 0)
  789. {
  790. space_info = m_parkspace_status.ParkspaceInfoEx[0];
  791. }
  792. space_info.ParkingspaceIndexId = 9999;
  793. }
  794. else
  795. {
  796. for (int i = 0; i < m_parkspace_status.ParkspaceInfoEx.Count; i++)
  797. {
  798. if (m_parkspace_status.ParkspaceInfoEx[i].ParkingspaceIndexId == parkspaceID)
  799. {
  800. space_info = m_parkspace_status.ParkspaceInfoEx[i];
  801. break;
  802. }
  803. }
  804. }
  805. }
  806. DateTime startTime = DateTime.Now;
  807. string commandKey = startTime.ToString("yyyy-MM-dd_HH:mm:ss:ffff");
  808. try
  809. {
  810. space_info.ParkingspaceStatus = status;
  811. Parkspace_force_update_request_msg parkspace_force_update_request_msg = new Parkspace_force_update_request_msg();
  812. Base_info base_Info = new Base_info();
  813. base_Info.MsgType = Message_type.EParkspaceForceUpdateRequestMsg;
  814. base_Info.TimeoutMs = 2000;
  815. base_Info.Sender = Message.Communicator.EParkspace;
  816. base_Info.Receiver = Message.Communicator.EParkspace;
  817. parkspace_force_update_request_msg.BaseInfo = base_Info;
  818. parkspace_force_update_request_msg.CommandKey = commandKey;
  819. parkspace_force_update_request_msg.ManualParkspaceInfoEx.Add(space_info);
  820. //MessageBox.Show(parkspace_force_update_request_msg.ToString());
  821. Monitor_communication.Instance.encapsulate_msg(parkspace_force_update_request_msg.ToByteString());
  822. }
  823. catch (Exception ex) { Console.WriteLine(ex.StackTrace); }
  824. // 遍历强制更新反馈队列,寻找对应反馈消息
  825. bool get_result = false;
  826. while ((DateTime.Now - startTime).TotalMilliseconds < Monitor_communication.Instance.m_timeout_milli)
  827. {
  828. lock (s_parkspace_force_update_queue_lock)
  829. {
  830. for (int i = 0; i < m_parkspace_force_update_response_queue.Count; i++)
  831. {
  832. Parkspace_force_update_response_msg response = m_parkspace_force_update_response_queue.Dequeue();
  833. if (response.ManualParkspaceInfoEx != null && response.ManualParkspaceInfoEx.Count > 0 && response.CommandKey == commandKey && response.ManualParkspaceInfoEx[0].ParkingspaceIndexId== parkspaceID)
  834. {
  835. get_result = true;
  836. if (response.ErrorManager != null)
  837. {
  838. if (response.ErrorManager.ErrorCode != 0)
  839. {
  840. //btn.BackColor = GetPSColor(status);
  841. Console.WriteLine("force update failed, code: " + response.ErrorManager.ErrorCode + ", description: " + response.ErrorManager.ErrorDescription);
  842. }
  843. }
  844. break;
  845. }
  846. else
  847. {
  848. m_parkspace_force_update_response_queue.Enqueue(response);
  849. }
  850. }
  851. }
  852. if (get_result)
  853. break;
  854. Thread.Sleep(50);
  855. }
  856. if (!get_result && space_info != null)
  857. {
  858. MessageBox.Show("force update get response timeout: " + space_info.ToString());
  859. }
  860. }
  861. /// <summary>
  862. /// 通过按钮信息截取车位id,失败返回-1
  863. /// </summary>
  864. /// <param name="btn"></param>
  865. /// <returns></returns>
  866. private int GetParkspaceIdFromButton(Button btn)
  867. {
  868. if (btn == null || btn.Text.Length < 3)
  869. return -1;
  870. int parkspaceID = -1;
  871. bool parse_result = int.TryParse(System.Text.RegularExpressions.Regex.Match(btn.Text, @"\d+(\.\d+)?").Value, out parkspaceID);
  872. string unit = btn.Text.Substring(0, 1);
  873. byte[] array = System.Text.Encoding.ASCII.GetBytes(unit);
  874. int asciicode = (int)(array[0]);
  875. parkspaceID = (asciicode - 'A') * 78 + parkspaceID;
  876. Console.WriteLine(parkspaceID.ToString());
  877. if (parse_result)
  878. {
  879. return parkspaceID;
  880. }
  881. else
  882. {
  883. return -1;
  884. }
  885. }
  886. /// <summary>
  887. /// 获取状态对应颜色
  888. /// </summary>
  889. /// <param name="status"></param>
  890. /// <returns></returns>
  891. private Color GetPSColor(Parkspace_status status)
  892. {
  893. switch (status)
  894. {
  895. case Parkspace_status.EParkspaceEmpty: return Color.White;
  896. case Parkspace_status.EParkspaceOccupied: return Color.Yellow;
  897. case Parkspace_status.EParkspaceReserved: return Color.SkyBlue;
  898. case Parkspace_status.EParkspaceLocked: return Color.LightGreen;
  899. case Parkspace_status.EParkspaceError: return Color.Red;
  900. default: return Color.Violet;
  901. }
  902. }
  903. private void MonitorMainWindows_FormClosing(object sender, FormClosingEventArgs e)
  904. {
  905. Uninit();
  906. e.Cancel = true;
  907. this.Visible = false;
  908. }
  909. private void MonitorMainWindows_FormClosed(object sender, FormClosedEventArgs e)
  910. {
  911. try
  912. {
  913. if (m_update_display_thread != null)
  914. {
  915. m_update_display_thread.Abort();
  916. }
  917. }
  918. catch { Console.WriteLine("线程退出"); }
  919. //s_isClosing = true;
  920. ////if (m_update_display_thread != null)
  921. ////{
  922. //// m_update_display_thread.Join();
  923. ////}
  924. //Communicator.Instance.Uninit();
  925. }
  926. /// <summary>
  927. /// 一键清除所有号牌,车位全部设置空闲,调试用
  928. /// </summary>
  929. /// <param name="sender"></param>
  930. /// <param name="e"></param>
  931. private void btn_clear_Click(object sender, EventArgs e)
  932. {
  933. SendAndReceive(Parkspace_status.EParkspaceEmpty, 9999);
  934. }
  935. private void MonitorMainWindows_Load(object sender, EventArgs e)
  936. {
  937. timer.Enabled = true;
  938. timer.Interval = 500;
  939. timer.Tick += Timer_Tick;
  940. }
  941. private void button_find_Click(object sender, EventArgs e)
  942. {
  943. string license = licenseBox.Text;
  944. try
  945. {
  946. Message.Parkspace_manual_search_request_msg parkspace_Manual_Search_Request_Msg = new Parkspace_manual_search_request_msg();
  947. Message.Base_info base_Info = new Base_info();
  948. base_Info.MsgType = Message_type.EParkspaceManualSearchRequestMsg;
  949. base_Info.Sender = Message.Communicator.EEmpty;
  950. base_Info.Receiver = Message.Communicator.EParkspace;
  951. base_Info.TimeoutMs = 1000;
  952. Message.Car_info car_Info = new Car_info();
  953. car_Info.CarNumberPlate = license;
  954. parkspace_Manual_Search_Request_Msg.BaseInfo = base_Info;
  955. parkspace_Manual_Search_Request_Msg.CarInfo = car_Info;
  956. parkspace_Manual_Search_Request_Msg.CommandKey = DateTime.Now.ToString("yyyyMMddHHmmssfff");
  957. DateTime dateTime = DateTime.Now;
  958. Monitor_communication.Instance.encapsulate_msg(parkspace_Manual_Search_Request_Msg.ToByteString());
  959. }
  960. catch (Exception ex) { Console.WriteLine(ex.StackTrace); }
  961. }
  962. private void button_pickupcar_Click(object sender, EventArgs e)
  963. {
  964. try
  965. {
  966. //取车请求
  967. Message.Pickup_command_request_msg t_pickup_command_request_msg = new Message.Pickup_command_request_msg();
  968. //消息头
  969. Message.Base_info baseInfo = new Message.Base_info();
  970. baseInfo.MsgType = Message.Message_type.EPickupCommandRequestMsg;
  971. baseInfo.Sender = Message.Communicator.ETerminor;
  972. baseInfo.Receiver = Message.Communicator.EMain;
  973. //车辆信息--只需填充车牌号
  974. Message.Car_info car_Info = new Message.Car_info();
  975. car_Info.License = commendkeyBox.Text;
  976. car_Info.CarNumberPlate = licenseBox.Text;
  977. //填充信息
  978. t_pickup_command_request_msg.BaseInfo = baseInfo;
  979. t_pickup_command_request_msg.IdStruct = new Id_struct();
  980. if (m_unitid != -1)
  981. {
  982. t_pickup_command_request_msg.IdStruct.UnitId = m_unitid;
  983. t_pickup_command_request_msg.CarInfo = car_Info;
  984. //发送取车请求
  985. Monitor_communication.Instance.encapsulate_msg(t_pickup_command_request_msg.ToByteString());
  986. MessageBox.Show("取车指令已发送!" + t_pickup_command_request_msg.ToString());
  987. }
  988. else
  989. {
  990. MessageBox.Show("单元号错误,请重新查询!" );
  991. }
  992. m_unitid = -1;
  993. }
  994. catch (Exception ex) { Console.WriteLine(ex.StackTrace); }
  995. }
  996. private void Timer_Tick(object sender, EventArgs e)
  997. {
  998. led_A_plc.Statu = UIMessageData.Instance.PLCStatuA.IsTimeout() ? LED.LED_Statu.Disconnected :
  999. ( LED.LED_Statu)UIMessageData.Instance.PLCStatuA.Value;
  1000. led_B_plc.Statu = UIMessageData.Instance.PLCStatuB.IsTimeout() ? LED.LED_Statu.Disconnected :
  1001. ( LED.LED_Statu)UIMessageData.Instance.PLCStatuB.Value;
  1002. led_C_plc.Statu = UIMessageData.Instance.PLCStatuC.IsTimeout() ? LED.LED_Statu.Disconnected :
  1003. ( LED.LED_Statu)UIMessageData.Instance.PLCStatuC.Value;
  1004. led_A1_terminal.Statu = UIMessageData.Instance.TerminalStatuA1.IsTimeout() ? LED.LED_Statu.Disconnected :
  1005. ( LED.LED_Statu)UIMessageData.Instance.TerminalStatuA1.Value;
  1006. led_A2_terminal.Statu = UIMessageData.Instance.TerminalStatuA2.IsTimeout() ? LED.LED_Statu.Disconnected :
  1007. ( LED.LED_Statu)UIMessageData.Instance.TerminalStatuA2.Value;
  1008. led_B1_terminal.Statu = UIMessageData.Instance.TerminalStatuB1.IsTimeout() ? LED.LED_Statu.Disconnected :
  1009. ( LED.LED_Statu)UIMessageData.Instance.TerminalStatuB1.Value;
  1010. led_B2_terminal.Statu = UIMessageData.Instance.TerminalStatuB2.IsTimeout() ? LED.LED_Statu.Disconnected :
  1011. ( LED.LED_Statu)UIMessageData.Instance.TerminalStatuB2.Value;
  1012. led_C1_terminal.Statu = UIMessageData.Instance.TerminalStatuC1.IsTimeout() ? LED.LED_Statu.Disconnected :
  1013. ( LED.LED_Statu)UIMessageData.Instance.TerminalStatuC1.Value;
  1014. led_C2_terminal.Statu = UIMessageData.Instance.TerminalStatuC2.IsTimeout() ? LED.LED_Statu.Disconnected :
  1015. ( LED.LED_Statu)UIMessageData.Instance.TerminalStatuC2.Value;
  1016. led_A1_lidar.Statu = UIMessageData.Instance.LidarStatuA1.IsTimeout() ? LED.LED_Statu.Disconnected :
  1017. ( LED.LED_Statu)UIMessageData.Instance.LidarStatuA1.Value;
  1018. led_A2_lidar.Statu = UIMessageData.Instance.LidarStatuA2.IsTimeout() ? LED.LED_Statu.Disconnected :
  1019. ( LED.LED_Statu)UIMessageData.Instance.LidarStatuA2.Value;
  1020. led_B1_lidar.Statu = UIMessageData.Instance.LidarStatuB1.IsTimeout() ? LED.LED_Statu.Disconnected :
  1021. ( LED.LED_Statu)UIMessageData.Instance.LidarStatuB1.Value;
  1022. led_B2_lidar.Statu = UIMessageData.Instance.LidarStatuB2.IsTimeout() ? LED.LED_Statu.Disconnected :
  1023. ( LED.LED_Statu)UIMessageData.Instance.LidarStatuB2.Value;
  1024. led_C1_lidar.Statu = UIMessageData.Instance.LidarStatuC1.IsTimeout() ? LED.LED_Statu.Disconnected :
  1025. ( LED.LED_Statu)UIMessageData.Instance.LidarStatuC1.Value;
  1026. led_C2_lidar.Statu = UIMessageData.Instance.LidarStatuC2.IsTimeout() ? LED.LED_Statu.Disconnected :
  1027. ( LED.LED_Statu)UIMessageData.Instance.LidarStatuC2.Value;
  1028. led_main.Statu = UIMessageData.Instance.MainNodeStatu.IsTimeout() ? LED.LED_Statu.Disconnected :
  1029. ( LED.LED_Statu)UIMessageData.Instance.MainNodeStatu.Value;
  1030. led_database.Statu = UIMessageData.Instance.DatabaseNodeStatu.IsTimeout() ? LED.LED_Statu.Disconnected :
  1031. ( LED.LED_Statu)UIMessageData.Instance.DatabaseNodeStatu.Value;
  1032. led_out_terminal1.Statu = UIMessageData.Instance.OutputTerminal1Statu.IsTimeout() ? LED.LED_Statu.Disconnected :
  1033. ( LED.LED_Statu)UIMessageData.Instance.OutputTerminal1Statu.Value;
  1034. led_out_terminal2.Statu = UIMessageData.Instance.OutputTerminal2Statu.IsTimeout() ? LED.LED_Statu.Disconnected :
  1035. ( LED.LED_Statu)UIMessageData.Instance.OutputTerminal2Statu.Value;
  1036. led_out_unnormal.Statu = UIMessageData.Instance.OutputUnnormalNodeStatu.IsTimeout() ? LED.LED_Statu.Disconnected :
  1037. ( LED.LED_Statu)UIMessageData.Instance.OutputUnnormalNodeStatu.Value;
  1038. UpdataCommand();
  1039. }
  1040. public void UpdataCommand()
  1041. {
  1042. foreach (var item in UIMessageData.Instance.CommandMap)
  1043. {
  1044. if (item.Value.IsTimeout())
  1045. {
  1046. //指令已经结束,删除控件
  1047. if (m_step_map.ContainsKey(item.Key))
  1048. {
  1049. StepControl control = new StepControl();
  1050. m_step_map.TryRemove(item.Key, out control);
  1051. control.Dispose();
  1052. }
  1053. //删除指令数据
  1054. TimedData<UIMessageData.CommandInfo> Cmd =
  1055. new TimedData<UIMessageData.CommandInfo>(new UIMessageData.CommandInfo());
  1056. if (UIMessageData.Instance.CommandMap.TryRemove(item.Key, out Cmd) == false)
  1057. {
  1058. Console.WriteLine(" remove error");
  1059. }
  1060. }
  1061. else if (m_step_map.ContainsKey(item.Key))
  1062. {
  1063. //存在对应的控件, 直接更新
  1064. StepControl control = m_step_map[item.Key];
  1065. UIMessageData.CommandInfo command_info = item.Value.Value;
  1066. control.Steps = command_info.Steps;
  1067. control.BackSteps = command_info.BackSteps;
  1068. control.StepIndex = command_info.StepIndex;
  1069. }
  1070. else
  1071. {
  1072. //控件不存在,创建
  1073. UIMessageData.CommandInfo command_info = item.Value.Value;
  1074. StepControl control = new StepControl();
  1075. control.Steps = command_info.Steps;
  1076. control.BackSteps = command_info.BackSteps;
  1077. control.StepIndex = command_info.StepIndex;
  1078. control.Dock = DockStyle.Top;
  1079. //截取控件所在位置及车牌号
  1080. string[] labels = item.Key.Split('-'); //入口 标签格式 input_A1-车牌号,出口output_A1-车牌号
  1081. if (labels.Length != 2)
  1082. {
  1083. //key格式错误
  1084. continue;
  1085. }
  1086. control.Label = labels[1];
  1087. string location = labels[0];//位置
  1088. //入口
  1089. if (location == "input_A1")
  1090. panel_input_A1.Controls.Add(control);
  1091. if (location == "input_A2")
  1092. panel_input_A2.Controls.Add(control);
  1093. if (location == "input_B1")
  1094. panel_input_B1.Controls.Add(control);
  1095. if (location == "input_B2")
  1096. panel_input_B2.Controls.Add(control);
  1097. if (location == "input_C1")
  1098. panel_input_C1.Controls.Add(control);
  1099. if (location == "input_C2")
  1100. panel_input_C2.Controls.Add(control);
  1101. //出口
  1102. if (location == "output_A1")
  1103. panel_output_A1.Controls.Add(control);
  1104. if (location == "output_A2")
  1105. panel_output_A2.Controls.Add(control);
  1106. if (location == "output_B1")
  1107. panel_output_B1.Controls.Add(control);
  1108. if (location == "output_B2")
  1109. panel_output_B2.Controls.Add(control);
  1110. if (location == "output_C1")
  1111. panel_output_C1.Controls.Add(control);
  1112. if (location == "output_C2")
  1113. panel_output_C2.Controls.Add(control);
  1114. m_step_map[item.Key] = control;
  1115. }
  1116. }
  1117. }
  1118. private void init_btn_Click(object sender, EventArgs e)
  1119. {
  1120. Uninit();
  1121. Init();
  1122. }
  1123. }
  1124. }