MainUserUI.xaml.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  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. uxFirmwareVersionBtn.Click += UxFirmwareVersionBtn_Click;
  49. uxEepromReadBtn.Click += UxEepromReadBtn_Click;
  50. uxEepromEraseBtn.Click += UxEepromEraseBtn_Click;
  51. SimanoService.Instance.OnLogReceived += SimanoService_OnLogReceived;
  52. var comList = SimanoService.Instance.GetComportList();
  53. uxComportSelector.ItemsSource = comList;
  54. var recordedPortName = AppSettingConfig.Instance.PortName;
  55. if (comList.Contains(recordedPortName))
  56. {
  57. uxComportSelector.SelectedItem = recordedPortName;
  58. }
  59. var recordedFirmwarePath = AppSettingConfig.Instance.FirmwarePath;
  60. uxFirmwarelocationText.Text = recordedFirmwarePath;
  61. List<string> numbers = Enumerable.Range(1, 0xFF).Select(x => x.ToString("X") ).ToList();
  62. var eraseAddressItems = new List<string>();
  63. eraseAddressItems.Add("ALL");
  64. eraseAddressItems.AddRange(numbers);
  65. uxEepromReadAddress.ItemsSource = eraseAddressItems;
  66. var readAddressItems = new List<string>();
  67. eraseAddressItems.AddRange(numbers);
  68. uxEepromEraseAddress.ItemsSource = eraseAddressItems;
  69. }
  70. private void MainUserUI_Loaded(object sender, RoutedEventArgs e)
  71. {
  72. GetScroller();
  73. }
  74. private void SimanoService_OnLogReceived(object sender, string e)
  75. {
  76. Dispatcher.InvokeAsync(new Action(() =>
  77. {
  78. //uxConsole.AppendText(e + Environment.NewLine);
  79. var view = new Run(e + Environment.NewLine);
  80. uxConsole.Inlines.Add(view);
  81. scrollViewer?.ScrollToEnd();
  82. //uxConsole.Text = e + Environment.NewLine;
  83. Logger.Trace(e);
  84. Console.WriteLine(e);
  85. }));
  86. }
  87. private void UxSelectFirmwareBtn_Click(object sender, RoutedEventArgs e)
  88. {
  89. OpenFileDialog openFileDialog = new OpenFileDialog();
  90. var success = openFileDialog.ShowDialog();
  91. if (success != true)
  92. {
  93. return;
  94. }
  95. var path = openFileDialog.FileName;
  96. path = Path.GetFullPath(path);
  97. uxFirmwarelocationText.Text = path;
  98. AppSettingConfig.Instance.FirmwarePath = path;
  99. }
  100. private async void UxFirmwareUpdateBtn_Click(object sender, RoutedEventArgs e)
  101. {
  102. if (Status != UiStatus.Connected)
  103. {
  104. return;
  105. }
  106. var firmwareFile = uxFirmwarelocationText.Text;
  107. firmwareFile = Path.GetFullPath(firmwareFile);
  108. if (string.IsNullOrEmpty(firmwareFile) ||
  109. !File.Exists(firmwareFile))
  110. {
  111. MessageBox.Show("Firmware not found!");
  112. return;
  113. }
  114. Status = UiStatus.Busy;
  115. var result = await SimanoService.Instance.FlashFirmware(firmwareFile);
  116. if ( result )
  117. {
  118. MessageBox.Show("Flash Success");
  119. }
  120. else
  121. {
  122. MessageBox.Show("Flash Failed");
  123. }
  124. Status = UiStatus.Connected;
  125. }
  126. private async void UxFirmwareVersionBtn_Click(object sender, RoutedEventArgs e)
  127. {
  128. Status = UiStatus.Busy;
  129. var result = await SimanoService.Instance.GetFirmwareVersion();
  130. if (result is null)
  131. {
  132. MessageBox.Show("Get Version Failed");
  133. }
  134. uxFirmwareVersionText.Text = result.ToString();
  135. Status = UiStatus.Connected;
  136. }
  137. private async void UxEepromReadBtn_Click(object sender, RoutedEventArgs e)
  138. {
  139. Status = UiStatus.Busy;
  140. int? address = GetAddress(uxEepromReadAddress);
  141. if (address is null)
  142. {
  143. MessageBox.Show("Address Error");
  144. return;
  145. }
  146. var result = await SimanoService.Instance.GetEeprom(address.Value);
  147. if (result is null)
  148. {
  149. MessageBox.Show("Get Version Failed");
  150. }
  151. uxEepromReadText.Text = result.ToString();
  152. Status = UiStatus.Connected;
  153. }
  154. private async void UxEepromEraseBtn_Click(object sender, RoutedEventArgs e)
  155. {
  156. Status = UiStatus.Busy;
  157. int? address = GetAddress(uxEepromEraseAddress);
  158. if (address is null)
  159. {
  160. MessageBox.Show("Address Error");
  161. return;
  162. }
  163. var result = await SimanoService.Instance.EraseEeprom(address.Value);
  164. if (result is null || result == false)
  165. {
  166. MessageBox.Show("EEPROM Erase failed");
  167. }
  168. MessageBox.Show("EEPROM Erase success");
  169. Status = UiStatus.Connected;
  170. }
  171. private void UxComportSelector_SelectionChanged(object sender, SelectionChangedEventArgs e)
  172. {
  173. AppSettingConfig.Instance.PortName = uxComportSelector.SelectedItem.ToString();
  174. }
  175. private void UxDisconnectBtn_Click(object sender, RoutedEventArgs e)
  176. {
  177. uxDisconnectBtn.Click -= UxDisconnectBtn_Click;
  178. Disconnect();
  179. uxDisconnectBtn.Click += UxDisconnectBtn_Click;
  180. }
  181. private void UxConnectBtn_Click(object sender, RoutedEventArgs e)
  182. {
  183. uxConnectBtn.Click -= UxConnectBtn_Click;
  184. Connect();
  185. uxConnectBtn.Click += UxConnectBtn_Click;
  186. }
  187. private async void Connect()
  188. {
  189. if (uxComportSelector.SelectedItem is null)
  190. {
  191. MessageBox.Show("Comport is not selected");
  192. Logger.Trace("Comport is not selected");
  193. return;
  194. }
  195. Status = UiStatus.Connecting;
  196. var connectResult = await SimanoService.Instance.Connect(uxComportSelector.SelectedItem as string);
  197. if (!connectResult)
  198. {
  199. Status = UiStatus.Disconnected;
  200. MessageBox.Show("Open port failed");
  201. Logger.Trace("Open port {portname} failed", uxComportSelector.SelectedItem);
  202. return;
  203. }
  204. Status = UiStatus.Connected;
  205. Logger.Trace("Open port {portname}", uxComportSelector.SelectedItem);
  206. }
  207. private void Disconnect()
  208. {
  209. var disconnectResult = SimanoService.Instance.Disconnect();
  210. if (!disconnectResult)
  211. {
  212. Status = UiStatus.Connected;
  213. MessageBox.Show("Close port failed");
  214. Logger.Trace("Close port failed");
  215. return;
  216. }
  217. Logger.Trace("Close port");
  218. Status = UiStatus.Disconnected;
  219. }
  220. private void GetScroller()
  221. {
  222. DependencyObject obj = uxConsoleScroller;
  223. Queue<DependencyObject> visuals = new Queue<DependencyObject> { };
  224. do
  225. {
  226. for (int index = 0; index < VisualTreeHelper.GetChildrenCount(obj); index ++)
  227. {
  228. visuals.Enqueue(VisualTreeHelper.GetChild(obj as Visual, index));
  229. }
  230. obj = visuals.Dequeue();
  231. }
  232. while (!(obj is ScrollViewer));
  233. this.scrollViewer = obj as ScrollViewer;
  234. }
  235. private void SetStatus(UiStatus value)
  236. {
  237. _Status = value;
  238. switch (value) {
  239. case UiStatus.Disconnected:
  240. uxConnectBtn.IsEnabled = true;
  241. uxDisconnectBtn.IsEnabled = false;
  242. uxComportSelector.IsEnabled = true;
  243. uxFirmwareUpdateBtn.IsEnabled = false;
  244. uxSelectFirmwareBtn.IsEnabled = true;
  245. uxFirmwareVersionBtn.IsEnabled = false;
  246. uxEepromReadBtn.IsEnabled = false;
  247. uxEepromEraseBtn.IsEnabled = false;
  248. uxEepromReadAddress.IsEnabled = false;
  249. uxEepromEraseAddress.IsEnabled = false;
  250. uxConnectedStatusHint.Visibility = Visibility.Collapsed;
  251. uxDisconnectedStatusHint.Visibility = Visibility.Visible;
  252. uxRunningStatusHint.Visibility = Visibility.Collapsed;
  253. break;
  254. case UiStatus.Connecting:
  255. uxConnectBtn.IsEnabled = false;
  256. uxDisconnectBtn.IsEnabled = false;
  257. uxComportSelector.IsEnabled = false;
  258. uxFirmwareUpdateBtn.IsEnabled = false;
  259. uxSelectFirmwareBtn.IsEnabled = true;
  260. uxFirmwareVersionBtn.IsEnabled = false;
  261. uxEepromReadBtn.IsEnabled = false;
  262. uxEepromEraseBtn.IsEnabled = false;
  263. uxEepromReadAddress.IsEnabled = false;
  264. uxEepromEraseAddress.IsEnabled = false;
  265. uxConnectedStatusHint.Visibility = Visibility.Collapsed;
  266. uxDisconnectedStatusHint.Visibility = Visibility.Visible;
  267. uxRunningStatusHint.Visibility = Visibility.Collapsed;
  268. break;
  269. case UiStatus.Connected:
  270. uxConnectBtn.IsEnabled = false;
  271. uxDisconnectBtn.IsEnabled = true;
  272. uxComportSelector.IsEnabled = false;
  273. uxFirmwareUpdateBtn.IsEnabled = true;
  274. uxSelectFirmwareBtn.IsEnabled = true;
  275. uxFirmwareVersionBtn.IsEnabled = true;
  276. uxEepromReadBtn.IsEnabled = true;
  277. uxEepromEraseBtn.IsEnabled = true;
  278. uxEepromReadAddress.IsEnabled = true;
  279. uxEepromEraseAddress.IsEnabled = true;
  280. uxConnectedStatusHint.Visibility = Visibility.Visible;
  281. uxDisconnectedStatusHint.Visibility = Visibility.Collapsed;
  282. uxRunningStatusHint.Visibility = Visibility.Collapsed;
  283. break;
  284. case UiStatus.Busy:
  285. uxConnectBtn.IsEnabled = false;
  286. uxDisconnectBtn.IsEnabled = false;
  287. uxComportSelector.IsEnabled = false;
  288. uxFirmwareUpdateBtn.IsEnabled = false;
  289. uxSelectFirmwareBtn.IsEnabled = false;
  290. uxFirmwareVersionBtn.IsEnabled = false;
  291. uxEepromReadBtn.IsEnabled = false;
  292. uxEepromEraseBtn.IsEnabled = false;
  293. uxEepromReadAddress.IsEnabled = false;
  294. uxEepromEraseAddress.IsEnabled = false;
  295. uxConnectedStatusHint.Visibility = Visibility.Collapsed;
  296. uxDisconnectedStatusHint.Visibility = Visibility.Collapsed;
  297. uxRunningStatusHint.Visibility = Visibility.Visible;
  298. break;
  299. }
  300. }
  301. private int? GetAddress(ComboBox source)
  302. {
  303. var selected = source.SelectedItem as string;
  304. if (selected.ToUpper() == "ALL")
  305. {
  306. return 0;
  307. }
  308. try
  309. {
  310. int address = Convert.ToInt32(selected, 16);
  311. if (address < 0 || address > 0xff)
  312. {
  313. return null;
  314. }
  315. return address;
  316. }
  317. catch
  318. {
  319. return null;
  320. }
  321. }
  322. }
  323. }