COM Port / Kartenleserfunktionen neu gemacht

This commit is contained in:
Marcus 2025-10-07 14:18:03 +02:00
parent 8544d5c30a
commit 62b2dca396
10 changed files with 259 additions and 112 deletions

View File

@ -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">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>

View File

@ -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();
}
}
}

View File

@ -24,12 +24,14 @@ namespace ZKuP
{
private List<string> COMList = new List<string>();
private CardReaderViewModel _cardReader;
public COMSelector()
{
InitializeComponent();
COMList = Helper.GetCOMPorts();
cbCOMList.ItemsSource = COMList;
}
private void btnSave_Click(object sender, RoutedEventArgs e)
@ -46,19 +48,25 @@ 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();
}
}
}

View File

@ -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<string> 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();
}
}

View File

@ -437,6 +437,8 @@ 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;
});
Dispatcher.Invoke(() =>
{
if (type == CardType.DB || type == CardType.All)
{
if (!karten.Columns.Contains("IsChecked"))
@ -445,6 +447,7 @@ namespace ZKuP
dgCards.DataContext = karten;
}
if (type == CardType.McFit || type == CardType.All) dgMcFit.DataContext = mcFit;
});
}
private void Window_LocationChanged(object sender, EventArgs e)

View File

@ -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<string> DataReceived;
public static event EventHandler<byte[]> 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<string> DataReceived;
//public static event EventHandler<byte[]> 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()

View File

@ -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">
<Grid Margin="10">
<Grid.RowDefinitions>
<RowDefinition Height="1.5*"/>

View File

@ -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)
{
// Deine Logik
Dispatcher.Invoke(() =>
{
borderKartenleserRot.Visibility = Visibility.Collapsed;
blinkTimer.Stop();
Dispatcher.Invoke(() =>
{
if (cbRot.ItemsSource.Cast<string>().ToList().Contains(e.Split('=')[0].ToString()))
cbRot.SelectedValue = e.Split('=')[0].ToString();
if (cbRot.ItemsSource.Cast<string>().ToList().Contains(cardNumber.Split('=')[0].ToString()))
cbRot.SelectedValue = cardNumber.Split('=')[0].ToString();
else if (cbRot.SelectedIndex != -1 || tbGruen.IsKeyboardFocused)
tbGruen.Text = e.Split('=')[0].ToString();
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<string>().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();
}
}
}

View File

@ -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)

View File

@ -233,6 +233,7 @@
<Compile Include="Belegung.xaml.cs">
<DependentUpon>Belegung.xaml</DependentUpon>
</Compile>
<Compile Include="CardReaderViewModel.cs" />
<Compile Include="Cards.xaml.cs">
<DependentUpon>Cards.xaml</DependentUpon>
</Compile>