From 62b2dca396555019d7ad6ff459f71d48e4926675 Mon Sep 17 00:00:00 2001 From: Marcus Date: Tue, 7 Oct 2025 14:18:03 +0200 Subject: [PATCH] COM Port / Kartenleserfunktionen neu gemacht --- ZKuP/AddCardUser.xaml | 2 +- ZKuP/AddCardUser.xaml.cs | 47 ++++++++++-- ZKuP/COMSelector.xaml.cs | 22 ++++-- ZKuP/CardReaderViewModel.cs | 71 ++++++++++++++++++ ZKuP/Cards.xaml.cs | 15 ++-- ZKuP/Helper.cs | 140 +++++++++++++++++++----------------- ZKuP/KartenTausch.xaml | 2 +- ZKuP/KartenTausch.xaml.cs | 47 ++++++++---- ZKuP/MainWindow.xaml.cs | 24 +++---- ZKuP/ZKuP.csproj | 1 + 10 files changed, 259 insertions(+), 112 deletions(-) create mode 100644 ZKuP/CardReaderViewModel.cs diff --git a/ZKuP/AddCardUser.xaml b/ZKuP/AddCardUser.xaml index 7ae3491..427fbb2 100644 --- a/ZKuP/AddCardUser.xaml +++ b/ZKuP/AddCardUser.xaml @@ -6,7 +6,7 @@ xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" xmlns:local="clr-namespace:ZKuP" mc:Ignorable="d" - Title="Kartenbenutzer" MinHeight="450" Height="450" Width="594" Loaded="Window_Loaded" LocationChanged="Window_LocationChanged"> + Title="Kartenbenutzer" MinHeight="450" Height="450" Width="594" Loaded="Window_Loaded" Closing="MetroWindow_Closing" LocationChanged="Window_LocationChanged"> diff --git a/ZKuP/AddCardUser.xaml.cs b/ZKuP/AddCardUser.xaml.cs index 3386a39..e52d55b 100644 --- a/ZKuP/AddCardUser.xaml.cs +++ b/ZKuP/AddCardUser.xaml.cs @@ -14,6 +14,7 @@ using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using System.Windows.Threading; +using static System.Net.Mime.MediaTypeNames; namespace ZKuP { @@ -38,6 +39,8 @@ namespace ZKuP DispatcherTimer blinkTimer = new DispatcherTimer(); + private CardReaderViewModel _cardReader; + public AddCardUser(string user = "", bool isBesucher = false, string count = "", string ap = "", bool needTel = true, bool hasEinweisung = false, string firma = "", string telnr = "", string idFirma = "") { _user = user; @@ -47,8 +50,9 @@ namespace ZKuP InitializeComponent(); - Helper.InitSerial(); - Helper.DataReceived += Helper_DataReceived; + _cardReader = new CardReaderViewModel(); + _cardReader.CardDetected += OnCardDetected; + _cardReader.StartListening(Settings.GetSettingString("COMPort")); blinkTimer.Interval = TimeSpan.FromMilliseconds(50); blinkTimer.Tick += BlinkTimer_Tick; @@ -125,13 +129,13 @@ namespace ZKuP } }); } - - private void Helper_DataReceived(object sender, string e) + private void OnCardDetected(string cardNumber) { + // Deine Logik var text = ""; Dispatcher.Invoke(() => { - text = tbNummer.Text = e.Split('=')[0]; + text = tbNummer.Text = cardNumber.Split('=')[0]; borderKartenleser.Visibility = Visibility.Collapsed; @@ -154,6 +158,34 @@ namespace ZKuP } }); } + //private void Helper_DataReceived(object sender, string e) + //{ + // var text = ""; + // Dispatcher.Invoke(() => + // { + // text = tbNummer.Text = e.Split('=')[0]; + + // borderKartenleser.Visibility = Visibility.Collapsed; + + + // blinkTimer.Stop(); + + // if (!string.IsNullOrWhiteSpace(text)) + // { + // var farbe = SQL.ReadSingleValue($"SELECT Farbe FROM {MainWindow.table}.kartennummern WHERE Kartennummer='{text}'"); + + // switch (farbe) + // { + // case "1": + // cbColor.SelectedValue = "Rot"; + // break; + // case "2": + // cbColor.SelectedValue = "Grün"; + // break; + // } + // } + // }); + //} private void tbNummer_TextChanged(object sender, TextChangedEventArgs e) @@ -255,5 +287,10 @@ namespace ZKuP { Helper.CheckWindowIsInScreenSpace(this); } + + private void MetroWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) + { + _cardReader.StopListening(); + } } } diff --git a/ZKuP/COMSelector.xaml.cs b/ZKuP/COMSelector.xaml.cs index cab623d..ec11de0 100644 --- a/ZKuP/COMSelector.xaml.cs +++ b/ZKuP/COMSelector.xaml.cs @@ -24,12 +24,14 @@ namespace ZKuP { private List COMList = new List(); + private CardReaderViewModel _cardReader; public COMSelector() { InitializeComponent(); COMList = Helper.GetCOMPorts(); cbCOMList.ItemsSource = COMList; + } private void btnSave_Click(object sender, RoutedEventArgs e) @@ -45,20 +47,26 @@ namespace ZKuP } private void cbCOMList_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - Helper.DataReceived += Helper_DataReceived; + { + var match = Regex.Match(cbCOMList.SelectedValue.ToString(), @"COM\d+(?=\))"); + Settings.WriteSetting("COMPort", match.Value); + + _cardReader = new CardReaderViewModel(); + _cardReader.CardDetected += OnCardDetected; + _cardReader.StartListening(Settings.GetSettingString("COMPort")); + //Helper.DataReceived += Helper_DataReceived; MessageBox.Show("Bitte jetzt den Leser testen:\n\nSchließen Sie diese Meldung und legen Sie anschließend eine Karte auf!\n\nWird nach dem Auflegen keine Meldung angezeigt, bitte anderen Port wählen", "Kartenleser testen", MessageBoxButton.OK, MessageBoxImage.Information); - Helper.InitSerial(cbCOMList.SelectedValue.ToString()); + //Helper.InitSerial(cbCOMList.SelectedValue.ToString(), true); } - private void Helper_DataReceived(object sender, string e) + private void OnCardDetected(string cardNumber) { - if (e.Split('=')[0].Length == 19) + if (cardNumber.Split('=')[0].Length == 19) { MessageBox.Show("Test des Kartenlesers erfolgreich!", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information); - - Helper.DataReceived -= Helper_DataReceived; } + + _cardReader.StopListening(); } } } diff --git a/ZKuP/CardReaderViewModel.cs b/ZKuP/CardReaderViewModel.cs new file mode 100644 index 0000000..02d0088 --- /dev/null +++ b/ZKuP/CardReaderViewModel.cs @@ -0,0 +1,71 @@ +using System; +using System.ComponentModel; +using System.IO.Ports; +using System.Text; +using System.Windows; + +public class CardReaderViewModel : IDisposable +{ + private SerialPort _port; + private StringBuilder _buffer = new StringBuilder(); + + public event Action CardDetected; + + public void StartListening(string portName = "COM3") + { + if (_port != null && _port.IsOpen) + return; // Bereits aktiv + + _port = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One); + _port.DataReceived += OnDataReceived; + + try + { + _port.Open(); + } + catch (UnauthorizedAccessException) + { + // Port bereits von anderem Fenster geöffnet + throw new InvalidOperationException("Port ist bereits in Verwendung"); + } + } + + public void StopListening() + { + if (_port != null && _port.IsOpen) + { + //_port.DataReceived -= OnDataReceived; + //_port.Dispose(); + _port.Close(); + } + } + + private void OnDataReceived(object sender, SerialDataReceivedEventArgs e) + { + string data = _port.ReadExisting(); + _buffer.Append(data); + + string bufferContent = _buffer.ToString(); + int newlineIndex = bufferContent.IndexOfAny(new[] { '\r', '\n' }); + + if (newlineIndex >= 0) + { + string cardNumber = bufferContent.Substring(0, newlineIndex).Trim(); + _buffer.Clear(); + + if (!string.IsNullOrWhiteSpace(cardNumber)) + { + Application.Current.Dispatcher.Invoke(() => + { + CardDetected?.Invoke(cardNumber); + }); + } + } + } + + public void Dispose() + { + StopListening(); + _port?.Dispose(); + } +} \ No newline at end of file diff --git a/ZKuP/Cards.xaml.cs b/ZKuP/Cards.xaml.cs index dc66e60..0b73d5a 100644 --- a/ZKuP/Cards.xaml.cs +++ b/ZKuP/Cards.xaml.cs @@ -437,14 +437,17 @@ namespace ZKuP if (type == CardType.McFit || type == CardType.All) mcFit = SQL.ReadSQL($"SELECT `Kartennr`,`Vorname`,`Nachname`,`Abteilung`,`Handynr`,`Email`,`AusgabeTimestamp`,`ZurueckTimestamp`,`AktuellAusgegeben` FROM {MainWindow.table}.mcFit ORDER BY AusgabeTimestamp", mcFit).Result; }); - if (type == CardType.DB || type == CardType.All) + Dispatcher.Invoke(() => { - if (!karten.Columns.Contains("IsChecked")) - karten.Columns.Add("IsChecked", typeof(bool)); + if (type == CardType.DB || type == CardType.All) + { + if (!karten.Columns.Contains("IsChecked")) + karten.Columns.Add("IsChecked", typeof(bool)); - dgCards.DataContext = karten; - } - if (type == CardType.McFit || type == CardType.All) dgMcFit.DataContext = mcFit; + dgCards.DataContext = karten; + } + if (type == CardType.McFit || type == CardType.All) dgMcFit.DataContext = mcFit; + }); } private void Window_LocationChanged(object sender, EventArgs e) diff --git a/ZKuP/Helper.cs b/ZKuP/Helper.cs index bbc4014..b263e39 100644 --- a/ZKuP/Helper.cs +++ b/ZKuP/Helper.cs @@ -876,49 +876,55 @@ namespace ZKuP } } - public static SerialPort serial = new SerialPort(); + //public static SerialPort serial = new SerialPort(); + //static bool serialInitialized = false; + //public static void InitSerial(string COM = "", bool forced = false) + //{ + // if (!serialInitialized || forced) + // { + // if (COM == "" && string.IsNullOrWhiteSpace(Settings.GetSettingString("COMPort")) && GetCOMPortCount() > 0) + // { + // COMSelector cOMSelector = new COMSelector(); + // cOMSelector.ShowDialog(); + // } + // else if (COM != "") + // { + // var match = Regex.Match(COM, @"COM\d+(?=\))"); + // Settings.WriteSetting("COMPort", match.Value); + // } - public static void InitSerial(string COM = "") - { - if (COM == "" && string.IsNullOrWhiteSpace(Settings.GetSettingString("COMPort")) && GetCOMPortCount() > 0) - { - COMSelector cOMSelector = new COMSelector(); - cOMSelector.ShowDialog(); - } - else if(COM != "") - { - var match = Regex.Match(COM, @"COM\d+(?=\))"); - Settings.WriteSetting("COMPort", match.Value); - } + // if (forced && serial.IsOpen) { serial.Close(); } - if (!serial.IsOpen) - { - try - { - var port = Settings.GetSettingString("COMPort"); - if (!string.IsNullOrWhiteSpace(port)) - { - serial.PortName = port; //Com Port Name - serial.BaudRate = Convert.ToInt32(9600); //COM Port Sp - serial.Handshake = System.IO.Ports.Handshake.None; - serial.Parity = Parity.None; - serial.DataBits = 8; - serial.StopBits = StopBits.One; - serial.ReadTimeout = 200; - serial.WriteTimeout = 50; + // if (!serial.IsOpen) + // { + // try + // { + // var port = Settings.GetSettingString("COMPort"); + // if (!string.IsNullOrWhiteSpace(port)) + // { + // serial.PortName = port; //Com Port Name + // serial.BaudRate = Convert.ToInt32(9600); //COM Port Sp + // serial.Handshake = System.IO.Ports.Handshake.None; + // serial.Parity = Parity.None; + // serial.DataBits = 8; + // serial.StopBits = StopBits.One; + // serial.ReadTimeout = 200; + // serial.WriteTimeout = 50; - serial.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(OnDataReceived); - serial.Open(); - } + // serial.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(OnDataReceived); + // serial.Open(); + // } + // } + // catch (Exception ex) + // { + // MessageBox.Show("Fehler beim Öffnen des COM Ports\nKartenleser kann nicht aktiviert werden\n\nBitte Kartenleser anstecken oder anderen COM Port versuchen", "Fehler beim COM Port", MessageBoxButton.OK, MessageBoxImage.Error); + // Log.WriteLog(ex.ToString()); + // } + // } - } - catch (Exception ex) - { - MessageBox.Show("Fehler beim Öffnen des COM Ports\nKartenleser kann nicht aktiviert werden\n\nBitte Kartenleser anstecken oder anderen COM Port versuchen", "Fehler beim COM Port", MessageBoxButton.OK, MessageBoxImage.Error); - Log.WriteLog(ex.ToString()); - } - } - } + // serialInitialized = true; + // } + //} public static int GetCOMPortCount() { @@ -958,35 +964,35 @@ namespace ZKuP // return Recieve(); //} - public static event EventHandler DataReceived; - public static event EventHandler BinaryDataReceived; - private static void OnDataReceived(object sender, SerialDataReceivedEventArgs e) - { - try - { - if (serial.BytesToRead > 0) - { - // Read as string - string stringData = serial.ReadExisting(); - if (!string.IsNullOrWhiteSpace(stringData)) - { - DataReceived?.Invoke(sender, stringData); - } + //public static event EventHandler DataReceived; + //public static event EventHandler BinaryDataReceived; + //private static void OnDataReceived(object sender, SerialDataReceivedEventArgs e) + //{ + // try + // { + // if (serial.BytesToRead > 0) + // { + // // Read as string + // string stringData = serial.ReadExisting(); + // if (!string.IsNullOrWhiteSpace(stringData)) + // { + // DataReceived?.Invoke(sender, stringData); + // } - // For binary data reception - if (serial.BytesToRead > 0) - { - byte[] binaryData = new byte[serial.BytesToRead]; - serial.Read(binaryData, 0, binaryData.Length); - BinaryDataReceived?.Invoke(sender, binaryData); - } - } - } - catch (Exception ex) - { - Console.WriteLine($"Error in async data reception: {ex.Message}"); - } - } + // // For binary data reception + // if (serial.BytesToRead > 0) + // { + // byte[] binaryData = new byte[serial.BytesToRead]; + // serial.Read(binaryData, 0, binaryData.Length); + // BinaryDataReceived?.Invoke(sender, binaryData); + // } + // } + // } + // catch (Exception ex) + // { + // Log.WriteLog($"Error in async data reception: {ex.Message}"); + // } + //} public static string GetIPAddresses() diff --git a/ZKuP/KartenTausch.xaml b/ZKuP/KartenTausch.xaml index 3f7ef77..852d664 100644 --- a/ZKuP/KartenTausch.xaml +++ b/ZKuP/KartenTausch.xaml @@ -6,7 +6,7 @@ xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls" xmlns:local="clr-namespace:ZKuP" mc:Ignorable="d" - Title="Rote Karte zu Grüner Karte tauschen" Height="250" Width="400" Loaded="Window_Loaded" LocationChanged="Window_LocationChanged"> + Title="Rote Karte zu Grüner Karte tauschen" Height="250" Width="400" Loaded="Window_Loaded" Closing="MetroWindow_Closing" LocationChanged="Window_LocationChanged"> diff --git a/ZKuP/KartenTausch.xaml.cs b/ZKuP/KartenTausch.xaml.cs index ae09024..e7dbf17 100644 --- a/ZKuP/KartenTausch.xaml.cs +++ b/ZKuP/KartenTausch.xaml.cs @@ -23,6 +23,7 @@ namespace ZKuP public partial class KartenTausch : MetroWindow { DispatcherTimer blinkTimer = new DispatcherTimer(); + private CardReaderViewModel _cardReader; public KartenTausch() { @@ -30,8 +31,12 @@ namespace ZKuP cbRot.ItemsSource = SQL.ReadListString($"SELECT kartennr From {MainWindow.table}.karten WHERE farbe = 'Rot'").Result; - Helper.InitSerial(); - Helper.DataReceived += Helper_DataReceived; + + _cardReader = new CardReaderViewModel(); + _cardReader.CardDetected += OnCardDetected; + _cardReader.StartListening(Settings.GetSettingString("COMPort")); + //Helper.InitSerial(); + //Helper.DataReceived += Helper_DataReceived; blinkTimer.Interval = TimeSpan.FromMilliseconds(50); blinkTimer.Tick += BlinkTimer_Tick; @@ -70,22 +75,36 @@ namespace ZKuP } } - - private void Helper_DataReceived(object sender, string e) + private void OnCardDetected(string cardNumber) { - borderKartenleserRot.Visibility = Visibility.Collapsed; - blinkTimer.Stop(); - - + // Deine Logik Dispatcher.Invoke(() => { - if (cbRot.ItemsSource.Cast().ToList().Contains(e.Split('=')[0].ToString())) - cbRot.SelectedValue = e.Split('=')[0].ToString(); - else if (cbRot.SelectedIndex != -1 || tbGruen.IsKeyboardFocused) - tbGruen.Text = e.Split('=')[0].ToString(); + borderKartenleserRot.Visibility = Visibility.Collapsed; + blinkTimer.Stop(); + + if (cbRot.ItemsSource.Cast().ToList().Contains(cardNumber.Split('=')[0].ToString())) + cbRot.SelectedValue = cardNumber.Split('=')[0].ToString(); + else if (cbRot.SelectedIndex != -1 || tbGruen.IsKeyboardFocused) + tbGruen.Text = cardNumber.Split('=')[0].ToString(); }); } + //private void Helper_DataReceived(object sender, string e) + //{ + // Dispatcher.Invoke(() => + // { + // borderKartenleserRot.Visibility = Visibility.Collapsed; + // blinkTimer.Stop(); + + + // if (cbRot.ItemsSource.Cast().ToList().Contains(e.Split('=')[0].ToString())) + // cbRot.SelectedValue = e.Split('=')[0].ToString(); + // else if (cbRot.SelectedIndex != -1 || tbGruen.IsKeyboardFocused) + // tbGruen.Text = e.Split('=')[0].ToString(); + + // }); + //} bool up = false; private void BlinkTimer_Tick(object sender, EventArgs e) @@ -197,5 +216,9 @@ namespace ZKuP Helper.CheckWindowIsInScreenSpace(this); } + private void MetroWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) + { + _cardReader.StopListening(); + } } } diff --git a/ZKuP/MainWindow.xaml.cs b/ZKuP/MainWindow.xaml.cs index 73f82ef..c6f647e 100644 --- a/ZKuP/MainWindow.xaml.cs +++ b/ZKuP/MainWindow.xaml.cs @@ -44,7 +44,7 @@ namespace ZKuP PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } - public const string Version = "5.2.1.0"; + public const string Version = "5.2.1.2"; //public static Roles LoggedInRole { get; private set; } = Roles.None; internal static MainWindow main; ThemeManager TM; @@ -239,8 +239,7 @@ namespace ZKuP File.Copy(@"\\mhb00swfs003v.fv-werke.db.de\GLW99\ZKuP\ZKuPUpdater.exe", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\ZKuPUpdater.exe", true); System.Diagnostics.Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\ZKuPUpdater.exe", $"\"{file}\""); - Helper.serial.Close(); - Helper.serial.Dispose(); + Application.Current.Shutdown(); return; } @@ -2858,18 +2857,17 @@ namespace ZKuP else lblmcfit.Visibility = Visibility.Collapsed; - if (tabPfoertner.IsSelected) - { - if (Helper.GetCOMPortCount() > 1) - btnCOMSelector.Visibility = Visibility.Visible; - else if (Helper.GetCOMPortCount() == 1) - Settings.WriteSetting("COMPort", Regex.Match(Helper.GetCOMPorts().First(), @"COM\d+(?=\))").Value); + //if (tabPfoertner.IsSelected) + //{ + // //if (Helper.GetCOMPortCount() > 1) + // // btnCOMSelector.Visibility = Visibility.Visible; + // //else if (Helper.GetCOMPortCount() == 1) + // // Settings.WriteSetting("COMPort", Regex.Match(Helper.GetCOMPorts().First(), @"COM\d+(?=\))").Value); - if (Helper.GetCOMPortCount() == 0) - return; + // //if (Helper.GetCOMPortCount() == 0) + // // return; - Helper.InitSerial(); - } + //} } private void imgLoading_AnimationCompleted(DependencyObject d, XamlAnimatedGif.AnimationCompletedEventArgs e) diff --git a/ZKuP/ZKuP.csproj b/ZKuP/ZKuP.csproj index 04c395c..2268b79 100644 --- a/ZKuP/ZKuP.csproj +++ b/ZKuP/ZKuP.csproj @@ -233,6 +233,7 @@ Belegung.xaml + Cards.xaml