diff --git a/KeymapDownloader/KeymapDownloader/MainWindow.xaml.cs b/KeymapDownloader/KeymapDownloader/MainWindow.xaml.cs index b5c18365c..fa258839e 100644 --- a/KeymapDownloader/KeymapDownloader/MainWindow.xaml.cs +++ b/KeymapDownloader/KeymapDownloader/MainWindow.xaml.cs @@ -16,6 +16,7 @@ using HidSharp; using IntelHexFormatReader; using IntelHexFormatReader.Model; +using System.Threading; namespace KeymapDownloader { @@ -30,6 +31,12 @@ public MainWindow() { InitializeComponent(); RefreshHIDList(); + SetCopyright(); + } + + void SetCopyright() + { + setStatusText($"配列下载器 {System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString()}"); } /// @@ -40,7 +47,6 @@ void RefreshHIDList() Devices.Items.Clear(); var list = DeviceList.Local; - // var HidDeviceList = list.GetHidDevices(0x1209, 0x0514); var HidDeviceList = list.GetHidDevices(); foreach (var item in HidDeviceList) { @@ -88,6 +94,12 @@ bool checkSum(byte[] data) private void Download_Click(object sender, RoutedEventArgs e) { var path = Path.Text; + Thread thread = new Thread(() => { DownloadKeymap(path); }); + thread.Start(); + } + + private void DownloadKeymap(string path) + { byte[] binary = new Byte[1024]; HidStream hidStream = device.Open(); @@ -96,7 +108,7 @@ private void Download_Click(object sender, RoutedEventArgs e) { if (!File.Exists(path)) { - lbl_status.Text = "配列文件不存在"; + setStatusText("配列文件不存在"); return; } @@ -123,7 +135,7 @@ private void Download_Click(object sender, RoutedEventArgs e) if (!checkSum(binary)) { - lbl_status.Text = "Keymap校验不通过"; + setStatusText("Keymap校验不通过"); return; } } @@ -131,21 +143,36 @@ private void Download_Click(object sender, RoutedEventArgs e) try { byte[] packet = new byte[60]; - - for (int i = 0; i < (binary.Length / 60); i++) + var count = binary.Length / 60; + for (int i = 0; i < count; i++) { Array.Copy(binary, i * 60, packet, 0, 60); - SendPacket(hidStream, (uint)i, packet); + setStatusText($"{i + 1}/{count}"); + + if (SendPacket(hidStream, (uint)i, packet)) + break; } - lbl_status.Text = "完成"; + setStatusText("下载完毕"); } catch (Exception exp) { - lbl_status.Text = exp.Message; + setStatusText(exp.Message); } } - void SendPacket(HidStream stream, uint id, byte[] data) + void setStatusText(string msg) + { + Dispatcher.Invoke(() => { lbl_status.Text = msg; }); + } + + /// + /// 发送数据包 + /// + /// + /// + /// + /// 是否为最后一个 + bool SendPacket(HidStream stream, uint id, byte[] data) { byte[] send = new byte[63]; @@ -160,18 +187,27 @@ void SendPacket(HidStream stream, uint id, byte[] data) { stream.Write(send); var ret = stream.Read(); - ret_code = ret[1] == 0x11; + var code = ret[1]; + + // 0x10: 校验失败 + // 0x11: 接收成功 + // 0x12: 全部发送完毕 + if (code == 0x12) + return true; + + ret_code = code == 0x11; } while (!ret_code && retryCount-- > 0); if (retryCount <= 0) { throw new Exception("发送重试次数达到上限"); } + return false; } private void Devices_SelectionChanged(object sender, SelectionChangedEventArgs e) { - device = ((CustomHID)Devices.SelectedItem).Device; + device = ((CustomHID)Devices.SelectedItem)?.Device; } } } diff --git a/KeymapDownloader/KeymapDownloader/Properties/AssemblyInfo.cs b/KeymapDownloader/KeymapDownloader/Properties/AssemblyInfo.cs index 08cefaa1b..24c4796e0 100644 --- a/KeymapDownloader/KeymapDownloader/Properties/AssemblyInfo.cs +++ b/KeymapDownloader/KeymapDownloader/Properties/AssemblyInfo.cs @@ -12,7 +12,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("KeymapDownloader")] -[assembly: AssemblyCopyright("Copyright © 2018")] +[assembly: AssemblyCopyright("Copyright © Lotlab 2012 - 2019")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -51,5 +51,5 @@ // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号 // 方法是按如下所示使用“*”: : // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.0.3.3")] +[assembly: AssemblyFileVersion("1.0.3.3")]