ParameterDialog.xaml.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using Panuon.WPF.UI;
  2. using SWRIS.Core;
  3. using SWRIS.Enums;
  4. using SWRIS.Events;
  5. using SWRIS.Extensions;
  6. using SWRIS.Models;
  7. using SWRIS.Models.ViewModel;
  8. using System;
  9. using System.Linq;
  10. using System.Net.Sockets;
  11. using System.Threading;
  12. using System.Threading.Tasks;
  13. using System.Windows;
  14. using System.Windows.Controls.Primitives;
  15. using System.Windows.Input;
  16. namespace SWRIS.Pages
  17. {
  18. /// <summary>
  19. /// ParameterDialog.xaml 的交互逻辑
  20. /// </summary>
  21. public partial class ParameterDialog : WindowX
  22. {
  23. private string _serialNo;
  24. private Socket _clientSocket;
  25. private byte _runningMode = 0;
  26. private EquipmentSettingViewModel Equipment { get; set; }
  27. public ParameterDialog(EquipmentModel equipment, Socket clientSocket, RunningStatus runningStatus)
  28. {
  29. InitializeComponent();
  30. _serialNo = equipment.SerialNo;
  31. _clientSocket = clientSocket;
  32. _runningMode = GetRunningStatusByte(runningStatus);
  33. Equipment = equipment.ToEquipmentSettingViewModel(runningStatus);
  34. Equipment.IsConnected = _clientSocket != null && _clientSocket.Connected;
  35. App.TcpServer.SendGetTwistFactorData(_serialNo, _clientSocket);
  36. App.TcpServer.ClockResultReceived += TcpServer_ClockResultReceived;
  37. App.TcpServer.EncoderDirectionResultReceived += TcpServer_EncoderDirectionResultReceived;
  38. DataContext = Equipment;
  39. }
  40. private void TcpServer_EncoderDirectionResultReceived(object sender, EncoderDirectionResultReceivedEventArgs e)
  41. {
  42. Equipment.Parameter.EncoderDirection = e.Direction;
  43. }
  44. private void TcpServer_ClockResultReceived(object sender, ClockResultReceivedEventArgs e)
  45. {
  46. Equipment.Parameter.SystemTime = e.Timestamp.TimestampToDateTime();
  47. }
  48. protected void SetParameter()
  49. {
  50. ThreadPool.QueueUserWorkItem(act =>
  51. {
  52. EquipmentModel equipment = Equipment.ToEquipmentModel();
  53. if (_clientSocket != null && _clientSocket.Connected)
  54. {
  55. EquipmentDataModel equipmentData = App.DataCenter.Equipments.FirstOrDefault(c => c.IpAddress == equipment.IpAddress);
  56. equipment.ToEquipmentDataModel(equipmentData);
  57. StartOrStopDetection(equipmentData, RunningStatus.Stopped);
  58. Thread.Sleep(1000);
  59. App.TcpServer.SendSyncParameters(equipment.Parameter, Equipment.SerialNo, _clientSocket);
  60. Thread.Sleep(300);
  61. App.TcpServer.SendTurnLiveStreamData(true, _serialNo, _clientSocket);
  62. Thread.Sleep(1000);
  63. StartOrStopDetection(equipmentData, equipmentData.RunningStatus);
  64. }
  65. // 更新设备数据
  66. if (ConfigHelper.SetEquipment(equipment))
  67. {
  68. Application.Current.Dispatcher.Invoke(() =>
  69. {
  70. Thread.Sleep(500);
  71. NoticeBox.Show("参数设置成功", "通知", MessageBoxIcon.Success, true, 5000);
  72. DialogResult = true;
  73. });
  74. App.UpdateEquipment(equipment);
  75. }
  76. });
  77. }
  78. private void StartOrStopDetection(EquipmentDataModel equipmentData, RunningStatus runningStatus)
  79. {
  80. byte runningMode;
  81. if (runningStatus.HasFlag(RunningStatus.TemporalNormal))
  82. {
  83. equipmentData.RunningStatus |= RunningStatus.PreRunning;
  84. runningMode = (byte)RunningStatus.TemporalNormal;
  85. }
  86. else if (runningStatus.HasFlag(RunningStatus.SpatialNormal))
  87. {
  88. equipmentData.RunningStatus |= RunningStatus.PreRunning;
  89. runningMode = (byte)RunningStatus.SpatialNormal;
  90. }
  91. else
  92. {
  93. equipmentData.RunningStatus |= RunningStatus.PreStop;
  94. runningMode = (byte)RunningStatus.Stopped;
  95. }
  96. App.TcpServer.SendStartOrStopDetection(runningMode, _serialNo, _clientSocket);
  97. }
  98. private byte GetRunningStatusByte(RunningStatus runningStatus)
  99. {
  100. // 优先级:TemporalNormal > SpatialNormal > Stopped
  101. if (runningStatus.HasFlag(RunningStatus.TemporalNormal))
  102. return (byte)RunningStatus.TemporalNormal;
  103. if (runningStatus.HasFlag(RunningStatus.SpatialNormal))
  104. return (byte)RunningStatus.SpatialNormal;
  105. return (byte)RunningStatus.Stopped;
  106. }
  107. protected void GetEncoderDirection()
  108. {
  109. App.TcpServer.SendGetEncoderDirectionData(_serialNo, _clientSocket);
  110. }
  111. protected void SetEncoderDirection(EncoderDirection direction)
  112. {
  113. App.TcpServer.SendSetEncoderDirectionData(direction, _serialNo, _clientSocket);
  114. }
  115. protected string GetSerialNo()
  116. {
  117. return App.Config.GenerateNewSerialNo();
  118. }
  119. private void Save_Click(object sender, RoutedEventArgs e)
  120. {
  121. SetParameter();
  122. }
  123. private void SetClockAndDirection_Click(object sender, RoutedEventArgs e)
  124. {
  125. if (Equipment.Parameter.SystemTime != null)
  126. {
  127. var systemTime = Equipment.Parameter.SystemTime.Value;
  128. App.TcpServer.SendSetClockData(systemTime.DateTimeToTimestamp(), _serialNo, _clientSocket);
  129. }
  130. Task.Delay(20).Wait();
  131. App.TcpServer.SendSetEncoderDirectionData(Equipment.Parameter.EncoderDirection, _serialNo, _clientSocket);
  132. }
  133. private void ReadClockAndDirection_Click(object sender, RoutedEventArgs e)
  134. {
  135. App.TcpServer.SendGetClockData(_serialNo, _clientSocket);
  136. Task.Delay(20).Wait();
  137. App.TcpServer.SendGetEncoderDirectionData(_serialNo, _clientSocket);
  138. }
  139. private void Clock_GotFocus(object sender, RoutedEventArgs e)
  140. {
  141. if (Equipment.Parameter.SystemTime == null)
  142. {
  143. Equipment.Parameter.SystemTime = DateTime.Now;
  144. }
  145. }
  146. private void SerialNo_GotFocus(object sender, RoutedEventArgs e)
  147. {
  148. if (Equipment.SerialNo.IsNullOrEmptyOrWhiteSpace())
  149. {
  150. Equipment.SerialNo = App.Config.GenerateNewSerialNo();
  151. }
  152. }
  153. private void SetSerialNo_Click(object sender, RoutedEventArgs e)
  154. {
  155. App.TcpServer.SendSerialNoRequest(Equipment.SerialNo, _clientSocket);
  156. }
  157. private void Upgrade_MouseDown(object sender, MouseButtonEventArgs e)
  158. {
  159. var result = MessageBoxX.Show(this, "是否确认更新设备固件?此操作将会停止设备工作。", "警告",
  160. MessageBoxButton.YesNo,
  161. MessageBoxIcon.Warning, DefaultButton.YesOK);
  162. if (result == MessageBoxResult.Yes)
  163. {
  164. App.TcpServer.SendUpgradeRequest(_serialNo, _clientSocket);
  165. }
  166. }
  167. private void RunningStatus_Click(object sender, RoutedEventArgs e)
  168. {
  169. if (sender is ToggleButton toggleButton)
  170. {
  171. if (Enum.TryParse(toggleButton.Tag.ToString(), true, out RunningStatus runningStatus))
  172. {
  173. var newMode = GetRunningStatusByte(runningStatus);
  174. if (_runningMode != newMode)
  175. {
  176. _runningMode = newMode;
  177. StartOrStopDetection(App.DataCenter.Equipments.First(c => c.SerialNo == _serialNo), runningStatus);
  178. }
  179. }
  180. }
  181. }
  182. }
  183. }