MainUserUI.xaml.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. using Microsoft.Win32;
  2. using Simano.Model;
  3. using Simano.Service;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading;
  10. using System.Threading.Tasks;
  11. using System.Windows;
  12. using System.Windows.Controls;
  13. using System.Windows.Data;
  14. using System.Windows.Documents;
  15. using System.Windows.Input;
  16. using System.Windows.Media;
  17. using System.Windows.Media.Imaging;
  18. using System.Windows.Navigation;
  19. namespace Simano.UserControls
  20. {
  21. /// <summary>
  22. /// MainUserUI.xaml 的互動邏輯
  23. /// </summary>
  24. public partial class MainUserUI : UserControl
  25. {
  26. public MainUserUI()
  27. {
  28. InitializeComponent();
  29. InitUi();
  30. Loaded += MainUserUI_Loaded;
  31. }
  32. private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
  33. private UiStatus _Status;
  34. private ScrollViewer scrollViewer;
  35. private UiStatus Status
  36. {
  37. get => _Status;
  38. set => SetStatus(value);
  39. }
  40. private void InitUi()
  41. {
  42. Status = UiStatus.Disconnected;
  43. uxConnectBtn.Click += UxConnectBtn_Click;
  44. uxDisconnectBtn.Click += UxDisconnectBtn_Click;
  45. uxComportSelector.SelectionChanged += UxComportSelector_SelectionChanged;
  46. uxFirmwareUpdateBtn.Click += UxFirmwareUpdateBtn_Click;
  47. uxSelectFirmwareBtn.Click += UxSelectFirmwareBtn_Click;
  48. SimanoService.Instance.OnLogReceived += SimanoService_OnLogReceived;
  49. var comList = SimanoService.Instance.GetComportList();
  50. uxComportSelector.ItemsSource = comList;
  51. var recordedPortName = AppSettingConfig.Instance.PortName;
  52. if (comList.Contains(recordedPortName))
  53. {
  54. uxComportSelector.SelectedItem = recordedPortName;
  55. }
  56. var recordedFirmwarePath = AppSettingConfig.Instance.FirmwarePath;
  57. uxFirmwarelocationText.Text = recordedFirmwarePath;
  58. }
  59. private void MainUserUI_Loaded(object sender, RoutedEventArgs e)
  60. {
  61. GetScroller();
  62. }
  63. private void SimanoService_OnLogReceived(object sender, string e)
  64. {
  65. Dispatcher.InvokeAsync(new Action(() =>
  66. {
  67. //uxConsole.AppendText(e + Environment.NewLine);
  68. var view = new Run(e + Environment.NewLine);
  69. uxConsole.Inlines.Add(view);
  70. scrollViewer?.ScrollToEnd();
  71. //uxConsole.Text = e + Environment.NewLine;
  72. Logger.Trace(e);
  73. Console.WriteLine(e);
  74. }));
  75. }
  76. private void UxSelectFirmwareBtn_Click(object sender, RoutedEventArgs e)
  77. {
  78. OpenFileDialog openFileDialog = new OpenFileDialog();
  79. var success = openFileDialog.ShowDialog();
  80. if (success != true)
  81. {
  82. return;
  83. }
  84. var path = openFileDialog.FileName;
  85. path = Path.GetFullPath(path);
  86. uxFirmwarelocationText.Text = path;
  87. AppSettingConfig.Instance.FirmwarePath = path;
  88. }
  89. private async void UxFirmwareUpdateBtn_Click(object sender, RoutedEventArgs e)
  90. {
  91. if (Status != UiStatus.Connected)
  92. {
  93. return;
  94. }
  95. var firmwareFile = uxFirmwarelocationText.Text;
  96. firmwareFile = Path.GetFullPath(firmwareFile);
  97. if (string.IsNullOrEmpty(firmwareFile) ||
  98. !File.Exists(firmwareFile))
  99. {
  100. MessageBox.Show("Firmware not found!");
  101. return;
  102. }
  103. Status = UiStatus.Busy;
  104. var result = await SimanoService.Instance.FlashFirmware(firmwareFile);
  105. if ( result )
  106. {
  107. MessageBox.Show("Flash Success");
  108. }
  109. else
  110. {
  111. MessageBox.Show("Flash Failed");
  112. }
  113. Status = UiStatus.Connected;
  114. }
  115. private void UxComportSelector_SelectionChanged(object sender, SelectionChangedEventArgs e)
  116. {
  117. AppSettingConfig.Instance.PortName = uxComportSelector.SelectedItem.ToString();
  118. }
  119. private void UxDisconnectBtn_Click(object sender, RoutedEventArgs e)
  120. {
  121. uxDisconnectBtn.Click -= UxDisconnectBtn_Click;
  122. Disconnect();
  123. uxDisconnectBtn.Click += UxDisconnectBtn_Click;
  124. }
  125. private void UxConnectBtn_Click(object sender, RoutedEventArgs e)
  126. {
  127. uxConnectBtn.Click -= UxConnectBtn_Click;
  128. Connect();
  129. uxConnectBtn.Click += UxConnectBtn_Click;
  130. }
  131. private async void Connect()
  132. {
  133. if (uxComportSelector.SelectedItem is null)
  134. {
  135. MessageBox.Show("Comport is not selected");
  136. Logger.Trace("Comport is not selected");
  137. return;
  138. }
  139. Status = UiStatus.Connecting;
  140. var connectResult = await SimanoService.Instance.Connect(uxComportSelector.SelectedItem as string);
  141. if (!connectResult)
  142. {
  143. Status = UiStatus.Disconnected;
  144. MessageBox.Show("Open port failed");
  145. Logger.Trace("Open port {portname} failed", uxComportSelector.SelectedItem);
  146. return;
  147. }
  148. Status = UiStatus.Connected;
  149. Logger.Trace("Open port {portname}", uxComportSelector.SelectedItem);
  150. }
  151. private void Disconnect()
  152. {
  153. var disconnectResult = SimanoService.Instance.Disconnect();
  154. if (!disconnectResult)
  155. {
  156. Status = UiStatus.Connected;
  157. MessageBox.Show("Close port failed");
  158. Logger.Trace("Close port failed");
  159. return;
  160. }
  161. Logger.Trace("Close port");
  162. Status = UiStatus.Disconnected;
  163. }
  164. private void GetScroller()
  165. {
  166. DependencyObject obj = uxConsoleScroller;
  167. Queue<DependencyObject> visuals = new Queue<DependencyObject> { };
  168. do
  169. {
  170. for (int index = 0; index < VisualTreeHelper.GetChildrenCount(obj); index ++)
  171. {
  172. visuals.Enqueue(VisualTreeHelper.GetChild(obj as Visual, index));
  173. }
  174. obj = visuals.Dequeue();
  175. }
  176. while (!(obj is ScrollViewer));
  177. this.scrollViewer = obj as ScrollViewer;
  178. }
  179. private void SetStatus(UiStatus value)
  180. {
  181. _Status = value;
  182. switch (value) {
  183. case UiStatus.Disconnected:
  184. uxConnectBtn.IsEnabled = true;
  185. uxDisconnectBtn.IsEnabled = false;
  186. uxComportSelector.IsEnabled = true;
  187. uxFirmwareUpdateBtn.IsEnabled = false;
  188. uxSelectFirmwareBtn.IsEnabled = true;
  189. uxConnectedStatusHint.Visibility = Visibility.Collapsed;
  190. uxDisconnectedStatusHint.Visibility = Visibility.Visible;
  191. uxRunningStatusHint.Visibility = Visibility.Collapsed;
  192. break;
  193. case UiStatus.Connecting:
  194. uxConnectBtn.IsEnabled = false;
  195. uxDisconnectBtn.IsEnabled = false;
  196. uxComportSelector.IsEnabled = false;
  197. uxFirmwareUpdateBtn.IsEnabled = false;
  198. uxSelectFirmwareBtn.IsEnabled = true;
  199. uxConnectedStatusHint.Visibility = Visibility.Collapsed;
  200. uxDisconnectedStatusHint.Visibility = Visibility.Visible;
  201. uxRunningStatusHint.Visibility = Visibility.Collapsed;
  202. break;
  203. case UiStatus.Connected:
  204. uxConnectBtn.IsEnabled = false;
  205. uxDisconnectBtn.IsEnabled = true;
  206. uxComportSelector.IsEnabled = false;
  207. uxFirmwareUpdateBtn.IsEnabled = true;
  208. uxSelectFirmwareBtn.IsEnabled = true;
  209. uxConnectedStatusHint.Visibility = Visibility.Visible;
  210. uxDisconnectedStatusHint.Visibility = Visibility.Collapsed;
  211. uxRunningStatusHint.Visibility = Visibility.Collapsed;
  212. break;
  213. case UiStatus.Busy:
  214. uxConnectBtn.IsEnabled = false;
  215. uxDisconnectBtn.IsEnabled = false;
  216. uxComportSelector.IsEnabled = false;
  217. uxFirmwareUpdateBtn.IsEnabled = false;
  218. uxSelectFirmwareBtn.IsEnabled = false;
  219. uxConnectedStatusHint.Visibility = Visibility.Collapsed;
  220. uxDisconnectedStatusHint.Visibility = Visibility.Collapsed;
  221. uxRunningStatusHint.Visibility = Visibility.Visible;
  222. break;
  223. }
  224. }
  225. }
  226. }