From 6f364833a832509442154ea59951a1f35e399554 Mon Sep 17 00:00:00 2001 From: LeapwardKoex Date: Sun, 11 Feb 2024 23:34:51 +1300 Subject: [PATCH] Better shutdown handling --- MaiTouchComConnector.cs | 33 +++++++++++++++++++++++++-------- MainWindow.xaml.cs | 4 ++-- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/MaiTouchComConnector.cs b/MaiTouchComConnector.cs index a8747f4..c72348b 100644 --- a/MaiTouchComConnector.cs +++ b/MaiTouchComConnector.cs @@ -45,6 +45,7 @@ internal class MaiTouchComConnector { OnConnectStatusChange("Conecting..."); serialPort = new SerialPort(virtualPort, 9600, Parity.None, 8, StopBits.One); + serialPort.WriteTimeout = 100; serialPort.DataReceived += SerialPort_DataReceived; serialPort.Open(); Console.WriteLine("Serial port opened successfully."); @@ -65,6 +66,7 @@ internal class MaiTouchComConnector } } + catch (TimeoutException) { } catch (Exception ex) { OnConnectError(); @@ -86,15 +88,27 @@ internal class MaiTouchComConnector } } - public async void Disconnect() + public async Task Disconnect() { _shouldReconnect = false; - if (serialPort?.IsOpen == true) - { - serialPort.Close(); - serialPort.Dispose(); - } _connected = false; + try + { + serialPort.DtrEnable = false; + serialPort.RtsEnable = false; + serialPort.DataReceived -= SerialPort_DataReceived; + await Task.Delay(200); + if (serialPort.IsOpen == true) + { + serialPort.DiscardInBuffer(); + serialPort.DiscardOutBuffer(); + serialPort.Close(); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } } void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) @@ -138,7 +152,10 @@ internal class MaiTouchComConnector void SendTouchscreenState() { - var currentState = _buttonState.GetCurrentState(); - serialPort?.Write(currentState, 0, currentState.Length); + if (_connected) + { + var currentState = _buttonState.GetCurrentState(); + serialPort?.Write(currentState, 0, currentState.Length); + } } } diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index b85bbb3..4fb651f 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -101,7 +101,7 @@ public partial class MainWindow : Window var dataContext = (MainWindowViewModel)DataContext; if (dataContext.IsExitWithSinmaiEnabled) { - connector.Disconnect(); + await connector.Disconnect(); Application.Current.Shutdown(); } } @@ -154,7 +154,7 @@ public partial class MainWindow : Window var dataContext = (MainWindowViewModel)DataContext; var enabled = !dataContext.IsAutomaticPositioningEnabled; dataContext.IsAutomaticPositioningEnabled = !enabled; - Properties.Settings.Default.IsAutomaticPositioningEnabled = enabled; + Properties.Settings.Default.IsAutomaticPositioningEnabled = dataContext.IsAutomaticPositioningEnabled; Properties.Settings.Default.Save(); }