MaiTouchSensorEmulator/MaiTouchComConnector.cs

145 lines
4.0 KiB
C#
Raw Normal View History

2024-02-08 18:02:54 +08:00
using System.IO.Ports;
2024-02-08 12:41:21 +08:00
using System.Windows;
namespace WpfMaiTouchEmulator;
internal class MaiTouchComConnector
{
private static SerialPort? serialPort;
private bool isActiveMode;
private bool _connected;
2024-02-11 17:54:28 +08:00
private bool _shouldReconnect = true;
2024-02-08 12:41:21 +08:00
private readonly MaiTouchSensorButtonStateManager _buttonState;
public Action<string> OnConnectStatusChange
{
get;
internal set;
}
2024-02-10 07:58:13 +08:00
public Action OnConnectError
{
get;
internal set;
}
2024-02-08 12:41:21 +08:00
public Action<string> OnDataSent
{
get;
internal set;
}
public Action<string> OnDataRecieved
{
get;
internal set;
}
public MaiTouchComConnector(MaiTouchSensorButtonStateManager buttonState)
{
_buttonState = buttonState;
}
public async Task StartTouchSensorPolling()
2024-02-08 12:41:21 +08:00
{
2024-02-11 17:54:28 +08:00
if (!_connected && _shouldReconnect)
2024-02-08 12:41:21 +08:00
{
var virtualPort = "COM23"; // Adjust as needed
try
2024-02-08 12:41:21 +08:00
{
OnConnectStatusChange("Conecting...");
serialPort = new SerialPort(virtualPort, 9600, Parity.None, 8, StopBits.One);
serialPort.DataReceived += SerialPort_DataReceived;
serialPort.Open();
Console.WriteLine("Serial port opened successfully.");
OnConnectStatusChange("Connected to port");
_connected = true;
while (true)
2024-02-08 12:41:21 +08:00
{
if (isActiveMode)
{
SendTouchscreenState();
await Task.Delay(1);
}
else
{
await Task.Delay(100);
}
2024-02-08 12:41:21 +08:00
}
}
catch (Exception ex)
2024-02-08 12:41:21 +08:00
{
2024-02-10 07:58:13 +08:00
OnConnectError();
Application.Current.Dispatcher.Invoke(() =>
{
MessageBox.Show(ex.Message, "Error connecting to COM port", MessageBoxButton.OK, MessageBoxImage.Error);
});
2024-02-08 12:41:21 +08:00
}
finally
2024-02-08 12:41:21 +08:00
{
_connected = false;
OnConnectStatusChange("Not Connected");
if (serialPort?.IsOpen == true)
{
serialPort.Close();
}
2024-02-08 12:41:21 +08:00
}
}
}
2024-02-11 17:54:28 +08:00
public async void Disconnect()
{
_shouldReconnect = false;
if (serialPort?.IsOpen == true)
{
serialPort.Close();
serialPort.Dispose();
}
_connected = false;
}
2024-02-08 12:41:21 +08:00
void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
2024-02-08 18:02:54 +08:00
var recievedData = serialPort.ReadExisting();
2024-02-08 12:41:21 +08:00
var commands = recievedData.Split(new[] { '}' }, StringSplitOptions.RemoveEmptyEntries);
2024-02-08 18:02:54 +08:00
foreach (var command in commands)
2024-02-08 12:41:21 +08:00
{
2024-02-08 18:02:54 +08:00
var cleanedCommand = command.TrimStart('{');
2024-02-08 12:41:21 +08:00
Console.WriteLine($"Received data: {cleanedCommand}");
OnDataRecieved(cleanedCommand);
if (cleanedCommand == "STAT")
{
isActiveMode = true;
}
else if (cleanedCommand == "RSET")
{
}
else if (cleanedCommand == "HALT")
{
isActiveMode = false;
}
else if (cleanedCommand[2] == 'r' || cleanedCommand[2] == 'k')
{
2024-02-08 18:02:54 +08:00
var leftOrRight = cleanedCommand[0];
var sensor = cleanedCommand[1];
var ratio = cleanedCommand[3];
2024-02-08 12:41:21 +08:00
2024-02-08 18:02:54 +08:00
var newString = $"({leftOrRight}{sensor}{cleanedCommand[2]}{ratio})";
2024-02-08 12:41:21 +08:00
serialPort.Write(newString);
OnDataSent(newString);
}
else
{
Console.WriteLine(cleanedCommand);
}
}
}
void SendTouchscreenState()
{
var currentState = _buttonState.GetCurrentState();
serialPort?.Write(currentState, 0, currentState.Length);
}
}