MaiTouchSensorEmulator/MainWindow.xaml.cs

256 lines
9.4 KiB
C#
Raw Normal View History

using System.Diagnostics;
2024-02-08 12:41:21 +08:00
using System.Windows;
namespace WpfMaiTouchEmulator;
2024-02-08 18:02:54 +08:00
2024-02-08 12:41:21 +08:00
public partial class MainWindow : Window
{
2024-02-08 16:46:57 +08:00
private readonly MaiTouchSensorButtonStateManager buttonState;
2024-04-24 17:40:10 +08:00
private readonly MaiTouchComConnector connector;
private readonly VirtualComPortManager comPortManager;
private TouchPanel _touchPanel;
2024-02-08 12:41:21 +08:00
public MainWindow()
{
InitializeComponent();
2024-04-24 17:40:10 +08:00
DataContext = new MainWindowViewModel()
{
IsDebugEnabled = Properties.Settings.Default.IsDebugEnabled,
IsAutomaticPortConnectingEnabled = Properties.Settings.Default.IsAutomaticPortConnectingEnabled,
IsAutomaticPositioningEnabled = Properties.Settings.Default.IsAutomaticPositioningEnabled,
IsExitWithSinmaiEnabled = Properties.Settings.Default.IsExitWithSinmaiEnabled,
IsRingButtonEmulationEnabled = Properties.Settings.Default.IsRingButtonEmulationEnabled
2024-04-24 17:40:10 +08:00
};
2024-02-08 12:41:21 +08:00
Title = "Mai Touch Emulator";
buttonState = new MaiTouchSensorButtonStateManager(buttonStateValue);
2024-04-24 18:49:02 +08:00
connector = new MaiTouchComConnector(buttonState, (MainWindowViewModel)DataContext);
comPortManager = new VirtualComPortManager((MainWindowViewModel)DataContext);
connector.OnConnectStatusChange = (status) =>
{
connectionStateLabel.Content = status;
};
2024-02-10 07:58:13 +08:00
connector.OnConnectError = () =>
{
var dataContext = (MainWindowViewModel)DataContext;
dataContext.IsAutomaticPortConnectingEnabled = false;
};
2024-02-08 12:41:21 +08:00
connector.OnDataSent = (data) =>
{
Application.Current.Dispatcher.Invoke(() =>
{
SentLogBox.AppendText(data + Environment.NewLine);
SentLogBox.ScrollToEnd();
});
};
connector.OnDataRecieved = (data) =>
{
Application.Current.Dispatcher.Invoke(() =>
{
RecievedLogBox.AppendText(data + Environment.NewLine);
RecievedLogBox.ScrollToEnd();
});
};
if (Properties.Settings.Default.FirstOpen)
{
Logger.Info("First open occurred");
2024-04-24 18:49:02 +08:00
ShowSetupInstructionsDialog();
Properties.Settings.Default.FirstOpen = false;
Properties.Settings.Default.Save();
}
2024-04-24 17:40:10 +08:00
Loaded += (s, e) => {
Logger.Info("Main window loaded, creating touch panel");
_touchPanel = new TouchPanel();
_touchPanel.onTouch = (value) => { buttonState.PressButton(value); };
_touchPanel.onRelease = (value) => { buttonState.ReleaseButton(value); };
_touchPanel.Show();
_touchPanel.Owner = this;
var dataContext = (MainWindowViewModel)DataContext;
2024-04-24 18:49:02 +08:00
_touchPanel.DataContext = dataContext;
2024-04-24 17:40:10 +08:00
_touchPanel.SetDebugMode(dataContext.IsDebugEnabled);
if (Properties.Settings.Default.IsAutomaticPositioningEnabled)
{
_touchPanel.DragWindowHandle.Visibility = Visibility.Hidden;
_touchPanel.ResizeGrip.Visibility = Visibility.Hidden;
}
AutomaticTouchPanelPositioningLoop();
2024-02-11 17:54:28 +08:00
AutomaticPortConnectingLoop();
ExitWithSinmaiLoop();
2024-02-08 16:46:57 +08:00
};
}
2024-02-08 16:46:57 +08:00
2024-04-24 17:40:10 +08:00
private async void MainWindow_Closing(object? sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
await connector.Disconnect();
foreach (Window childWindow in OwnedWindows)
{
childWindow.Close();
}
Closing -= MainWindow_Closing;
2024-04-24 17:40:10 +08:00
e.Cancel = false;
}
private async void ExitWithSinmaiLoop()
{
Process? sinamiProcess = null;
while (sinamiProcess == null)
{
var processes = Process.GetProcessesByName("Sinmai");
if (processes.Length > 0)
{
Logger.Info("Found sinmai process to exit alongside with");
sinamiProcess = processes[0];
}
else
{
await Task.Delay(1000);
}
}
var dataContext = (MainWindowViewModel)DataContext;
if (dataContext.IsExitWithSinmaiEnabled)
{
try
{
await sinamiProcess.WaitForExitAsync();
Logger.Info("Sinmai exited");
if (dataContext.IsExitWithSinmaiEnabled)
{
Logger.Info("Disconnecting from COM port before shutting down");
await connector.Disconnect();
Logger.Info("Shutting down...");
Application.Current.Shutdown();
}
}
catch (Exception ex)
{
Logger.Error("Failed to wait for sinmai to exit", ex);
dataContext.IsExitWithSinmaiEnabled = false;
Properties.Settings.Default.IsExitWithSinmaiEnabled = dataContext.IsExitWithSinmaiEnabled;
Properties.Settings.Default.Save();
2024-04-24 18:49:02 +08:00
MessageBox.Show(dataContext.TxtFailedToSetupSinmaiExit, dataContext.TxtFailedToSetupSinmaiExitHeader, MessageBoxButton.OK, MessageBoxImage.Information);
}
}
}
2024-04-24 18:49:02 +08:00
private void ShowSetupInstructionsDialog()
{
var dataContext = (MainWindowViewModel)DataContext;
MessageBox.Show(dataContext.TxtSetupInstructions, dataContext.TxtSetupInstructionsHeader, MessageBoxButton.OK, MessageBoxImage.Information);
}
private async void AutomaticTouchPanelPositioningLoop()
{
var dataContext = (MainWindowViewModel)DataContext;
while (true)
{
if (dataContext.IsAutomaticPositioningEnabled)
{
_touchPanel.PositionTouchPanel();
}
2024-02-11 17:54:28 +08:00
await Task.Delay(1000);
}
2024-02-08 12:41:21 +08:00
}
2024-02-11 17:54:28 +08:00
private async void AutomaticPortConnectingLoop()
{
var dataContext = (MainWindowViewModel)DataContext;
while (true)
{
if (dataContext.IsAutomaticPortConnectingEnabled)
{
await connector.StartTouchSensorPolling();
}
await Task.Delay(1000);
}
}
2024-02-08 12:41:21 +08:00
private async void ConnectToPortButton_Click(object sender, RoutedEventArgs e)
{
await connector.StartTouchSensorPolling();
2024-02-08 12:41:21 +08:00
}
private void debugMode_Click(object sender, RoutedEventArgs e)
2024-02-08 12:41:21 +08:00
{
var dataContext = (MainWindowViewModel)DataContext;
var enabled = !dataContext.IsDebugEnabled;
dataContext.IsDebugEnabled = !enabled;
2024-02-08 16:46:57 +08:00
Properties.Settings.Default.IsDebugEnabled = dataContext.IsDebugEnabled;
Properties.Settings.Default.Save();
_touchPanel.SetDebugMode(dataContext.IsDebugEnabled);
2024-02-08 12:41:21 +08:00
}
private void automaticTouchPanelPositioning_Click(object sender, RoutedEventArgs e)
2024-02-08 12:41:21 +08:00
{
var dataContext = (MainWindowViewModel)DataContext;
var enabled = !dataContext.IsAutomaticPositioningEnabled;
dataContext.IsAutomaticPositioningEnabled = !enabled;
_touchPanel.DragWindowHandle.Visibility = dataContext.IsAutomaticPositioningEnabled ? Visibility.Hidden : Visibility.Visible;
_touchPanel.ResizeGrip.Visibility = dataContext.IsAutomaticPositioningEnabled ? Visibility.Hidden : Visibility.Visible;
2024-02-11 18:34:51 +08:00
Properties.Settings.Default.IsAutomaticPositioningEnabled = dataContext.IsAutomaticPositioningEnabled;
2024-02-08 16:46:57 +08:00
Properties.Settings.Default.Save();
2024-02-08 12:41:21 +08:00
}
private void automaticPortConnecting_Click(object sender, RoutedEventArgs e)
2024-02-08 12:41:21 +08:00
{
var dataContext = (MainWindowViewModel)DataContext;
var enabled = !dataContext.IsAutomaticPortConnectingEnabled;
dataContext.IsAutomaticPortConnectingEnabled = !enabled;
2024-02-08 16:46:57 +08:00
Properties.Settings.Default.IsAutomaticPortConnectingEnabled = dataContext.IsAutomaticPortConnectingEnabled;
Properties.Settings.Default.Save();
2024-02-08 12:41:21 +08:00
}
private void exitWithSinmai_Click(object sender, RoutedEventArgs e)
2024-02-08 12:41:21 +08:00
{
var dataContext = (MainWindowViewModel)DataContext;
var enabled = !dataContext.IsExitWithSinmaiEnabled;
dataContext.IsExitWithSinmaiEnabled = !enabled;
2024-02-08 16:46:57 +08:00
Properties.Settings.Default.IsExitWithSinmaiEnabled = dataContext.IsExitWithSinmaiEnabled;
Properties.Settings.Default.Save();
2024-02-08 12:41:21 +08:00
}
private async void buttonInstallComPort_Click(object sender, RoutedEventArgs e)
{
await comPortManager.InstallComPort();
}
private async void buttonUninstallComPorts_Click(object sender, RoutedEventArgs e)
{
await comPortManager.UninstallVirtualPorts();
}
private void buttonListComPorts_Click(object sender, RoutedEventArgs e)
{
var output = comPortManager.GetInstalledPorts();
2024-04-24 18:49:02 +08:00
var dataContext = (MainWindowViewModel)DataContext;
MessageBox.Show(string.Join("\n", output), dataContext.TxtCurrentlyInstalledPorts);
}
private void instructionsLabel_Click(object sender, RoutedEventArgs e)
{
ShowSetupInstructionsDialog();
}
private void emulateRingButtons_Click(object sender, RoutedEventArgs e)
{
var dataContext = (MainWindowViewModel)DataContext;
var enabled = !dataContext.IsRingButtonEmulationEnabled;
dataContext.IsRingButtonEmulationEnabled = !enabled;
Properties.Settings.Default.IsRingButtonEmulationEnabled = dataContext.IsRingButtonEmulationEnabled;
Properties.Settings.Default.Save();
_touchPanel.SetEmulateRingButton(dataContext.IsRingButtonEmulationEnabled);
}
2024-02-15 02:40:57 +08:00
}