123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367 |
- using Microsoft.Win32;
- using Simano.Model;
- using Simano.Service;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- namespace Simano.UserControls
- {
- /// <summary>
- /// MainUserUI.xaml 的互動邏輯
- /// </summary>
- public partial class MainUserUI : UserControl
- {
- public MainUserUI()
- {
- InitializeComponent();
- InitUi();
- Loaded += MainUserUI_Loaded;
- }
- private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();
- private UiStatus _Status;
- private ScrollViewer scrollViewer;
- private UiStatus Status
- {
- get => _Status;
- set => SetStatus(value);
- }
- private void InitUi()
- {
- Status = UiStatus.Disconnected;
- uxConnectBtn.Click += UxConnectBtn_Click;
- uxDisconnectBtn.Click += UxDisconnectBtn_Click;
- uxComportSelector.SelectionChanged += UxComportSelector_SelectionChanged;
- uxFirmwareUpdateBtn.Click += UxFirmwareUpdateBtn_Click;
- uxSelectFirmwareBtn.Click += UxSelectFirmwareBtn_Click;
- uxFirmwareVersionBtn.Click += UxFirmwareVersionBtn_Click;
- uxEepromReadBtn.Click += UxEepromReadBtn_Click;
- uxEepromEraseBtn.Click += UxEepromEraseBtn_Click;
- SimanoService.Instance.OnLogReceived += SimanoService_OnLogReceived;
- var comList = SimanoService.Instance.GetComportList();
- uxComportSelector.ItemsSource = comList;
- var recordedPortName = AppSettingConfig.Instance.PortName;
- if (comList.Contains(recordedPortName))
- {
- uxComportSelector.SelectedItem = recordedPortName;
- }
- var recordedFirmwarePath = AppSettingConfig.Instance.FirmwarePath;
- uxFirmwarelocationText.Text = recordedFirmwarePath;
- List<string> numbers = Enumerable.Range(1, 0xFF).Select(x => x.ToString("X") ).ToList();
- var eraseAddressItems = new List<string>();
- eraseAddressItems.Add("ALL");
- eraseAddressItems.AddRange(numbers);
- uxEepromReadAddress.ItemsSource = eraseAddressItems;
- var readAddressItems = new List<string>();
- eraseAddressItems.AddRange(numbers);
- uxEepromEraseAddress.ItemsSource = eraseAddressItems;
- }
- private void MainUserUI_Loaded(object sender, RoutedEventArgs e)
- {
- GetScroller();
- }
- private void SimanoService_OnLogReceived(object sender, string e)
- {
- Dispatcher.InvokeAsync(new Action(() =>
- {
- //uxConsole.AppendText(e + Environment.NewLine);
- var view = new Run(e + Environment.NewLine);
- uxConsole.Inlines.Add(view);
- scrollViewer?.ScrollToEnd();
- //uxConsole.Text = e + Environment.NewLine;
- Logger.Trace(e);
- Console.WriteLine(e);
- }));
- }
- private void UxSelectFirmwareBtn_Click(object sender, RoutedEventArgs e)
- {
- OpenFileDialog openFileDialog = new OpenFileDialog();
- var success = openFileDialog.ShowDialog();
- if (success != true)
- {
- return;
- }
- var path = openFileDialog.FileName;
- path = Path.GetFullPath(path);
- uxFirmwarelocationText.Text = path;
- AppSettingConfig.Instance.FirmwarePath = path;
- }
- private async void UxFirmwareUpdateBtn_Click(object sender, RoutedEventArgs e)
- {
- if (Status != UiStatus.Connected)
- {
- return;
- }
- var firmwareFile = uxFirmwarelocationText.Text;
- firmwareFile = Path.GetFullPath(firmwareFile);
- if (string.IsNullOrEmpty(firmwareFile) ||
- !File.Exists(firmwareFile))
- {
- MessageBox.Show("Firmware not found!");
- return;
- }
- Status = UiStatus.Busy;
- var result = await SimanoService.Instance.FlashFirmware(firmwareFile);
- if ( result )
- {
- MessageBox.Show("Flash Success");
- }
- else
- {
- MessageBox.Show("Flash Failed");
- }
- Status = UiStatus.Connected;
- }
- private async void UxFirmwareVersionBtn_Click(object sender, RoutedEventArgs e)
- {
- Status = UiStatus.Busy;
- var result = await SimanoService.Instance.GetFirmwareVersion();
- if (result is null)
- {
- MessageBox.Show("Get Version Failed");
- }
- uxFirmwareVersionText.Text = result.ToString();
- Status = UiStatus.Connected;
- }
- private async void UxEepromReadBtn_Click(object sender, RoutedEventArgs e)
- {
- Status = UiStatus.Busy;
- int? address = GetAddress(uxEepromReadAddress);
- if (address is null)
- {
- MessageBox.Show("Address Error");
- return;
- }
- var result = await SimanoService.Instance.GetEeprom(address.Value);
- if (result is null)
- {
- MessageBox.Show("Get Version Failed");
- }
- uxEepromReadText.Text = result.ToString();
- Status = UiStatus.Connected;
- }
- private async void UxEepromEraseBtn_Click(object sender, RoutedEventArgs e)
- {
- Status = UiStatus.Busy;
- int? address = GetAddress(uxEepromEraseAddress);
- if (address is null)
- {
- MessageBox.Show("Address Error");
- return;
- }
- var result = await SimanoService.Instance.EraseEeprom(address.Value);
- if (result is null || result == false)
- {
- MessageBox.Show("EEPROM Erase failed");
- }
- MessageBox.Show("EEPROM Erase success");
- Status = UiStatus.Connected;
- }
- private void UxComportSelector_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- AppSettingConfig.Instance.PortName = uxComportSelector.SelectedItem.ToString();
- }
- private void UxDisconnectBtn_Click(object sender, RoutedEventArgs e)
- {
- uxDisconnectBtn.Click -= UxDisconnectBtn_Click;
- Disconnect();
- uxDisconnectBtn.Click += UxDisconnectBtn_Click;
- }
- private void UxConnectBtn_Click(object sender, RoutedEventArgs e)
- {
- uxConnectBtn.Click -= UxConnectBtn_Click;
- Connect();
- uxConnectBtn.Click += UxConnectBtn_Click;
- }
- private async void Connect()
- {
- if (uxComportSelector.SelectedItem is null)
- {
- MessageBox.Show("Comport is not selected");
- Logger.Trace("Comport is not selected");
- return;
- }
- Status = UiStatus.Connecting;
- var connectResult = await SimanoService.Instance.Connect(uxComportSelector.SelectedItem as string);
- if (!connectResult)
- {
- Status = UiStatus.Disconnected;
- MessageBox.Show("Open port failed");
- Logger.Trace("Open port {portname} failed", uxComportSelector.SelectedItem);
- return;
- }
- Status = UiStatus.Connected;
- Logger.Trace("Open port {portname}", uxComportSelector.SelectedItem);
- }
- private void Disconnect()
- {
- var disconnectResult = SimanoService.Instance.Disconnect();
- if (!disconnectResult)
- {
- Status = UiStatus.Connected;
- MessageBox.Show("Close port failed");
- Logger.Trace("Close port failed");
- return;
- }
- Logger.Trace("Close port");
- Status = UiStatus.Disconnected;
- }
- private void GetScroller()
- {
- DependencyObject obj = uxConsoleScroller;
- Queue<DependencyObject> visuals = new Queue<DependencyObject> { };
- do
- {
- for (int index = 0; index < VisualTreeHelper.GetChildrenCount(obj); index ++)
- {
- visuals.Enqueue(VisualTreeHelper.GetChild(obj as Visual, index));
- }
- obj = visuals.Dequeue();
- }
- while (!(obj is ScrollViewer));
- this.scrollViewer = obj as ScrollViewer;
- }
- private void SetStatus(UiStatus value)
- {
- _Status = value;
- switch (value) {
- case UiStatus.Disconnected:
- uxConnectBtn.IsEnabled = true;
- uxDisconnectBtn.IsEnabled = false;
- uxComportSelector.IsEnabled = true;
- uxFirmwareUpdateBtn.IsEnabled = false;
- uxSelectFirmwareBtn.IsEnabled = true;
- uxFirmwareVersionBtn.IsEnabled = false;
- uxEepromReadBtn.IsEnabled = false;
- uxEepromEraseBtn.IsEnabled = false;
- uxEepromReadAddress.IsEnabled = false;
- uxEepromEraseAddress.IsEnabled = false;
- uxConnectedStatusHint.Visibility = Visibility.Collapsed;
- uxDisconnectedStatusHint.Visibility = Visibility.Visible;
- uxRunningStatusHint.Visibility = Visibility.Collapsed;
- break;
- case UiStatus.Connecting:
- uxConnectBtn.IsEnabled = false;
- uxDisconnectBtn.IsEnabled = false;
- uxComportSelector.IsEnabled = false;
- uxFirmwareUpdateBtn.IsEnabled = false;
- uxSelectFirmwareBtn.IsEnabled = true;
- uxFirmwareVersionBtn.IsEnabled = false;
- uxEepromReadBtn.IsEnabled = false;
- uxEepromEraseBtn.IsEnabled = false;
- uxEepromReadAddress.IsEnabled = false;
- uxEepromEraseAddress.IsEnabled = false;
- uxConnectedStatusHint.Visibility = Visibility.Collapsed;
- uxDisconnectedStatusHint.Visibility = Visibility.Visible;
- uxRunningStatusHint.Visibility = Visibility.Collapsed;
- break;
- case UiStatus.Connected:
- uxConnectBtn.IsEnabled = false;
- uxDisconnectBtn.IsEnabled = true;
- uxComportSelector.IsEnabled = false;
- uxFirmwareUpdateBtn.IsEnabled = true;
- uxSelectFirmwareBtn.IsEnabled = true;
- uxFirmwareVersionBtn.IsEnabled = true;
- uxEepromReadBtn.IsEnabled = true;
- uxEepromEraseBtn.IsEnabled = true;
- uxEepromReadAddress.IsEnabled = true;
- uxEepromEraseAddress.IsEnabled = true;
- uxConnectedStatusHint.Visibility = Visibility.Visible;
- uxDisconnectedStatusHint.Visibility = Visibility.Collapsed;
- uxRunningStatusHint.Visibility = Visibility.Collapsed;
- break;
- case UiStatus.Busy:
- uxConnectBtn.IsEnabled = false;
- uxDisconnectBtn.IsEnabled = false;
- uxComportSelector.IsEnabled = false;
- uxFirmwareUpdateBtn.IsEnabled = false;
- uxSelectFirmwareBtn.IsEnabled = false;
- uxFirmwareVersionBtn.IsEnabled = false;
- uxEepromReadBtn.IsEnabled = false;
- uxEepromEraseBtn.IsEnabled = false;
- uxEepromReadAddress.IsEnabled = false;
- uxEepromEraseAddress.IsEnabled = false;
- uxConnectedStatusHint.Visibility = Visibility.Collapsed;
- uxDisconnectedStatusHint.Visibility = Visibility.Collapsed;
- uxRunningStatusHint.Visibility = Visibility.Visible;
- break;
- }
- }
- private int? GetAddress(ComboBox source)
- {
- var selected = source.SelectedItem as string;
- if (selected.ToUpper() == "ALL")
- {
- return 0;
- }
- try
- {
- int address = Convert.ToInt32(selected, 16);
- if (address < 0 || address > 0xff)
- {
- return null;
- }
- return address;
- }
- catch
- {
- return null;
- }
- }
- }
- }
|