Improve performance of sending button inputs

pull/7/head 1.1.0
LeapwardKoex 2024-04-16 23:39:31 +12:00
parent fabead4e65
commit 3835123208
2 changed files with 52 additions and 28 deletions

View File

@ -7,6 +7,8 @@ internal class MaiTouchComConnector(MaiTouchSensorButtonStateManager buttonState
private static SerialPort? serialPort; private static SerialPort? serialPort;
private bool isActiveMode; private bool isActiveMode;
private bool _connected; private bool _connected;
private CancellationTokenSource? _tokenSource;
private Thread? _pollThread;
private bool _shouldReconnect = true; private bool _shouldReconnect = true;
private readonly MaiTouchSensorButtonStateManager _buttonState = buttonState; private readonly MaiTouchSensorButtonStateManager _buttonState = buttonState;
@ -50,18 +52,10 @@ internal class MaiTouchComConnector(MaiTouchSensorButtonStateManager buttonState
OnConnectStatusChange?.Invoke("Connected to port"); OnConnectStatusChange?.Invoke("Connected to port");
_connected = true; _connected = true;
while (true) _tokenSource = new CancellationTokenSource(); // Create a token source.
{ _pollThread = new Thread(() => PollingThread(_tokenSource.Token)); // Pass the token to the thread you want to stop.
if (isActiveMode) _pollThread.Priority = ThreadPriority.Highest;
{ _pollThread.Start();
SendTouchscreenState();
await Task.Delay(1);
}
else
{
await Task.Delay(100);
}
}
} }
catch (TimeoutException) { } catch (TimeoutException) { }
@ -73,9 +67,6 @@ internal class MaiTouchComConnector(MaiTouchSensorButtonStateManager buttonState
MessageBox.Show(ex.Message, "Error connecting to COM port", MessageBoxButton.OK, MessageBoxImage.Error); MessageBox.Show(ex.Message, "Error connecting to COM port", MessageBoxButton.OK, MessageBoxImage.Error);
}); });
}
finally
{
Logger.Info("Disconnecting from COM port"); Logger.Info("Disconnecting from COM port");
_connected = false; _connected = false;
OnConnectStatusChange?.Invoke("Not Connected"); OnConnectStatusChange?.Invoke("Not Connected");
@ -85,6 +76,23 @@ internal class MaiTouchComConnector(MaiTouchSensorButtonStateManager buttonState
serialPort.DiscardOutBuffer(); serialPort.DiscardOutBuffer();
serialPort.Close(); serialPort.Close();
} }
}
}
}
private void PollingThread(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
if (isActiveMode)
{
SendTouchscreenState();
Thread.Sleep(1);
}
else
{
Thread.Sleep(100);
} }
} }
} }
@ -96,13 +104,22 @@ internal class MaiTouchComConnector(MaiTouchSensorButtonStateManager buttonState
_connected = false; _connected = false;
try try
{ {
if (_tokenSource != null && !_tokenSource.IsCancellationRequested)
{
_tokenSource.Cancel();
_pollThread?.Join();
_tokenSource.Dispose();
_tokenSource = null;
}
if (serialPort != null) if (serialPort != null)
{ {
serialPort.DtrEnable = false; serialPort.DtrEnable = false;
serialPort.RtsEnable = false; serialPort.RtsEnable = false;
serialPort.DataReceived -= SerialPort_DataReceived; serialPort.DataReceived -= SerialPort_DataReceived;
await Task.Delay(200); await Task.Delay(200);
if (serialPort.IsOpen == true) if (serialPort.IsOpen)
{ {
serialPort.DiscardInBuffer(); serialPort.DiscardInBuffer();
serialPort.DiscardOutBuffer(); serialPort.DiscardOutBuffer();
@ -165,7 +182,16 @@ internal class MaiTouchComConnector(MaiTouchSensorButtonStateManager buttonState
if (_connected) if (_connected)
{ {
var currentState = _buttonState.GetCurrentState(); var currentState = _buttonState.GetCurrentState();
serialPort?.Write(currentState, 0, currentState.Length); try
{
serialPort?.Write(currentState, 0, currentState.Length);
}
catch (Exception ex) {
if (Properties.Settings.Default.IsDebugEnabled)
{
Logger.Error("Error when writing to serial port on button update", ex);
}
}
} }
} }
} }

View File

@ -51,17 +51,21 @@ internal class MaiTouchSensorButtonStateManager
{ {
this.buttonStateValue = buttonStateValue; this.buttonStateValue = buttonStateValue;
SetupUpdateLoop(); SetupUpdateLoop();
} }
private async void SetupUpdateLoop() private async Task SetupUpdateLoop()
{ {
string? lastButtonState = null;
while (true) while (true)
{ {
Application.Current.Dispatcher.Invoke(() => if (lastButtonState != buttonState.ToString())
{ {
buttonStateValue.Content = buttonState.ToString(); lastButtonState = buttonState.ToString();
}); Application.Current.Dispatcher.Invoke(() =>
{
buttonStateValue.Content = lastButtonState;
});
}
await Task.Delay(16); await Task.Delay(16);
} }
} }
@ -83,12 +87,6 @@ internal class MaiTouchSensorButtonStateManager
public byte[] GetCurrentState() public byte[] GetCurrentState()
{ {
Application.Current.Dispatcher.Invoke(() =>
{
buttonStateValue.Content = buttonState.ToString();
});
return return
[ [
0x28, 0x28,