diff --git a/CardCheckAssistant/CardCheckAssistant.csproj b/CardCheckAssistant/CardCheckAssistant.csproj
index 86ed270..d153611 100644
--- a/CardCheckAssistant/CardCheckAssistant.csproj
+++ b/CardCheckAssistant/CardCheckAssistant.csproj
@@ -24,7 +24,7 @@
Never
https://github.com/c3rebro/CardCheckAssistant/releases/latest/download/
$(AssemblyVersion)
- 1.0.38
+ 1.0.39
de-DE
False
@@ -70,7 +70,7 @@
-
+
diff --git a/CardCheckAssistant/DataAccessLayer/DefaultSettings.cs b/CardCheckAssistant/DataAccessLayer/DefaultSettings.cs
index d59ee43..2b81d40 100644
--- a/CardCheckAssistant/DataAccessLayer/DefaultSettings.cs
+++ b/CardCheckAssistant/DataAccessLayer/DefaultSettings.cs
@@ -43,6 +43,7 @@ public DefaultSettings(bool init)
_defaultTheme = "Light";
_defaultRFIDGearExePath = "";
_defaultProjectOutputPath = "";
+ _readerVolume = 0;
_cardCheckTextTemplates = new ObservableCollection(new());
_selectedDBName = "db";
@@ -243,6 +244,16 @@ public string? DefaultProjectOutputPath
set => _defaultProjectOutputPath = value;
}
private string? _defaultProjectOutputPath;
+
+ ///
+ ///
+ ///
+ public int? ReaderVolume
+ {
+ get => _readerVolume;
+ set => _readerVolume = value;
+ }
+ private int? _readerVolume;
#endregion properties
#region Extensions
diff --git a/CardCheckAssistant/Models/GenericChipModel.cs b/CardCheckAssistant/Models/GenericChipModel.cs
index 7497930..791488f 100644
--- a/CardCheckAssistant/Models/GenericChipModel.cs
+++ b/CardCheckAssistant/Models/GenericChipModel.cs
@@ -10,17 +10,19 @@ public class GenericChipModel
{
public GenericChipModel()
{
-
+ Childs = new List();
}
public GenericChipModel(string uid, ChipType cardType)
{
+ Childs = new List();
UID = uid;
TCard = new CType() { PrimaryType = cardType, SecondaryType = MifareChipSubType.Unspecified };
}
public GenericChipModel(string uid, ChipType cardType, string sak, string rats)
{
+ Childs = new List();
UID = uid;
TCard = new CType() { PrimaryType = cardType, SecondaryType = MifareChipSubType.Unspecified };
SAK = sak;
@@ -29,6 +31,7 @@ public GenericChipModel(string uid, ChipType cardType, string sak, string rats)
public GenericChipModel(string uid, MifareChipSubType cardType, string sak, string rats)
{
+ Childs = new List();
UID = uid;
TCard = new CType() { PrimaryType = ChipType.MIFARE, SecondaryType = cardType };
SAK = sak;
@@ -37,6 +40,7 @@ public GenericChipModel(string uid, MifareChipSubType cardType, string sak, stri
public GenericChipModel(string uid, ChipType cardType, string sak, string rats, string versionL4)
{
+ Childs = new List();
UID = uid;
TCard = new CType() { PrimaryType = cardType, SecondaryType = MifareChipSubType.Unspecified };
SAK = sak;
@@ -46,6 +50,7 @@ public GenericChipModel(string uid, ChipType cardType, string sak, string rats,
public GenericChipModel(string uid, MifareChipSubType cardType, string sak, string rats, string versionL4)
{
+ Childs = new List();
UID = uid;
TCard = new CType() { PrimaryType = ChipType.MIFARE, SecondaryType = cardType };
SAK = sak;
@@ -55,6 +60,7 @@ public GenericChipModel(string uid, MifareChipSubType cardType, string sak, stri
public GenericChipModel(GenericChipModel chip)
{
+ Childs = new List();
UID = chip.UID;
TCard = new CType() { PrimaryType = chip.TCard.PrimaryType, SecondaryType = chip.TCard.SecondaryType };
SAK = chip.SAK;
@@ -62,7 +68,7 @@ public GenericChipModel(GenericChipModel chip)
VersionL4 = chip.VersionL4;
}
- public bool? HasChilds => Childs?.Count > 0;
+ public bool? HasChilds => Childs?.Any() ?? false;
public List Childs
{
diff --git a/CardCheckAssistant/Services/ModalView.cs b/CardCheckAssistant/Services/ModalView.cs
index 309196b..3961fd7 100644
--- a/CardCheckAssistant/Services/ModalView.cs
+++ b/CardCheckAssistant/Services/ModalView.cs
@@ -2,6 +2,8 @@
using Microsoft.UI.Xaml.Controls;
using System;
using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.Reflection;
using System.Threading.Tasks;
using Windows.UI.Core;
@@ -12,6 +14,7 @@ namespace CardCheckAssistant.Services
///
public static class ModalView
{
+ private static readonly EventLog eventLog = new("Application", ".", Assembly.GetEntryAssembly().GetName().Name);
public static ObservableCollection Dialogs { get; set; }
public static async Task MessageDialogAsync(this FrameworkElement element, string title, string message)
@@ -43,11 +46,18 @@ public static async Task MessageDialogAsync(this FrameworkElement element, strin
RequestedTheme = element.ActualTheme
};
- Dialogs.Add(dialog);
+ try
+ {
+ Dialogs.Add(dialog);
- await dialog.ShowAsync();
+ await dialog.ShowAsync();
- Dialogs.Remove(dialog);
+ Dialogs.Remove(dialog);
+ }
+ catch (Exception e)
+ {
+ eventLog.WriteEntry(e.Message, EventLogEntryType.Error);
+ }
}
public static async Task ConfirmationDialogAsync(this FrameworkElement element, string title, string message)
diff --git a/CardCheckAssistant/Services/ReaderService.cs b/CardCheckAssistant/Services/ReaderService.cs
index 37f5002..3de48e6 100644
--- a/CardCheckAssistant/Services/ReaderService.cs
+++ b/CardCheckAssistant/Services/ReaderService.cs
@@ -114,6 +114,8 @@ public async Task ReadChipPublic()
{
try
{
+ using SettingsReaderWriter settings = new SettingsReaderWriter();
+
if (readerDevice != null)
{
if (!readerDevice.IsConnected)
@@ -186,7 +188,7 @@ public async Task ReadChipPublic()
}
if(hfTag == null && lfTag == null && legicTag == null)
{
- await readerDevice.BeepAsync(40, 2500, 50, 0);
+ await readerDevice.BeepAsync((byte)(settings.DefaultSettings.ReaderVolume ?? 0), 2500, 50, 0);
GenericChip = null;
diff --git a/CardCheckAssistant/ViewModels/HomePageViewModel.cs b/CardCheckAssistant/ViewModels/HomePageViewModel.cs
index dc7a292..e8fe865 100644
--- a/CardCheckAssistant/ViewModels/HomePageViewModel.cs
+++ b/CardCheckAssistant/ViewModels/HomePageViewModel.cs
@@ -18,6 +18,7 @@
using Windows.ApplicationModel.Store;
using Microsoft.UI.Windowing;
using CardCheckAssistant.Contracts.ViewModels;
+using Windows.Foundation.Diagnostics;
namespace CardCheckAssistant.ViewModels;
@@ -26,6 +27,7 @@ public partial class HomePageViewModel : ObservableRecipient, INavigationAware
private readonly EventLog eventLog = new("Application", ".", Assembly.GetEntryAssembly().GetName().Name);
private readonly Microsoft.UI.Xaml.DispatcherTimer scanDBTimer;
private SQLDBService dbService;
+ private readonly bool isCreateEventLogSourceErr;
private ObservableCollection cardCheckProcessesFromCache;
@@ -34,12 +36,20 @@ public partial class HomePageViewModel : ObservableRecipient, INavigationAware
///
public HomePageViewModel()
{
- if (!EventLog.SourceExists(Assembly.GetEntryAssembly().GetName().Name))
+ try
+ {
+ if (!EventLog.SourceExists(Assembly.GetEntryAssembly()?.GetName()?.Name))
+ {
+ EventLog.CreateEventSource(new EventSourceCreationData(Assembly.GetEntryAssembly().GetName().Name, "Application"));
+ isCreateEventLogSourceErr = false;
+ }
+ }
+ catch
{
- EventLog.CreateEventSource(new EventSourceCreationData(Assembly.GetEntryAssembly().GetName().Name, "Application"));
+ isCreateEventLogSourceErr = true;
}
- eventLog.Source = Assembly.GetEntryAssembly().GetName().Name;
+ eventLog.Source = Assembly.GetEntryAssembly()?.GetName()?.Name;
DataGridItemCollection = new ObservableCollection();
SetSortAscending = false;
@@ -453,6 +463,15 @@ private async Task PostPageLoadedCommand_Executed()
{
try
{
+ if(isCreateEventLogSourceErr)
+ {
+ await App.MainRoot.MessageDialogAsync(
+ "Fehler.",
+ "Es konnte keine Lagdatei erzeugt werden.\n" +
+ "Bitte das Programm einmal mit Adminrechten starten...");
+ }
+
+
await CheckForUpdates();
using var settings = new SettingsReaderWriter();
diff --git a/CardCheckAssistant/ViewModels/SettingsViewModel.cs b/CardCheckAssistant/ViewModels/SettingsViewModel.cs
index 53fd51a..decf8da 100644
--- a/CardCheckAssistant/ViewModels/SettingsViewModel.cs
+++ b/CardCheckAssistant/ViewModels/SettingsViewModel.cs
@@ -21,10 +21,11 @@
using Microsoft.Extensions.Hosting;
using CardCheckAssistant.Views;
using System.Diagnostics;
+using CardCheckAssistant.Contracts.ViewModels;
namespace CardCheckAssistant.ViewModels;
-public partial class SettingsPageViewModel : ObservableRecipient
+public partial class SettingsPageViewModel : ObservableRecipient, INavigationAware
{
private readonly IThemeSelectorService _themeSelectorService;
private readonly EventLog eventLog = new("Application", ".", Assembly.GetEntryAssembly().GetName().Name);
@@ -77,6 +78,7 @@ public SettingsPageViewModel(IThemeSelectorService themeSelectorService)
CardCheckUseSQLLite = settings.DefaultSettings.CardCheckUseMSSQL == true ? true : false;
CreateSubdirectoryIsEnabled = settings.DefaultSettings.CreateSubdirectoryIsEnabled == true ? true : false;
RemoveTemporaryReportsIsEnabled = settings.DefaultSettings.RemoveTemporaryReportsIsEnabled == true ? true : false;
+ ReaderVolume = settings.DefaultSettings.ReaderVolume ?? 0;
SelectedDBUserPwd = enc.Decrypt(settings?.DefaultSettings?.SelectedDBUserPwd ?? "NoPWD");
@@ -346,6 +348,24 @@ public bool RFiDGearIsAutoRunEnabled
///
[ObservableProperty]
private CardCheckTextTemplate _selectedTextTemplate;
+
+ ///
+ ///
+ ///
+ public int ReaderVolume
+ {
+ get => _readerVolume;
+ set
+ {
+ SetProperty(ref _readerVolume, value);
+ using var settings = new SettingsReaderWriter();
+
+ settings.DefaultSettings.ReaderVolume = value;
+ settings.SaveSettings();
+ }
+ }
+ private int _readerVolume;
+
#endregion
#region Commands
@@ -362,6 +382,8 @@ public bool RFiDGearIsAutoRunEnabled
public ICommand SelectProjectFolderCommand => new AsyncRelayCommand(SelectProjectFolder_Executed);
public ICommand SelectRFIDGearCustomProjectCommand => new AsyncRelayCommand(SelectRFIDGearCustomProjectCommand_Executed);
+
+ public ICommand ReaderConnectionTestCommand => new AsyncRelayCommand(ReaderConnectionTestCommand_Executed);
#endregion
private async Task CreateNewTextTemplate_Executed()
@@ -505,6 +527,35 @@ private async Task SelectProjectFolder_Executed()
}
}
+ private async Task ReaderConnectionTestCommand_Executed()
+ {
+
+ }
+
+ ///
+ /// INavigation Aware Event. Close Connection If Open
+ ///
+ ///
+ public async void OnNavigatedTo(object parameter)
+ {
+ // Run code when the app navigates to this page
+ using var reader = ReaderService.Instance;
+
+ await reader.Disconnect();
+
+ }
+
+ ///
+ /// INavigation Aware Event. Close Connection If Open
+ ///
+ public async void OnNavigatedFrom()
+ {
+ // Run code when the app navigates away from this page
+ using var reader = ReaderService.Instance;
+
+ await reader.Disconnect();
+ }
+
private async Task NavigateBackCommand_Executed()
{
try
diff --git a/CardCheckAssistant/ViewModels/Step1PageViewModel.cs b/CardCheckAssistant/ViewModels/Step1PageViewModel.cs
index 222f56b..9e4bde8 100644
--- a/CardCheckAssistant/ViewModels/Step1PageViewModel.cs
+++ b/CardCheckAssistant/ViewModels/Step1PageViewModel.cs
@@ -418,6 +418,9 @@ private async Task NavigateBackCommand_Executed()
public async void OnNavigatedTo(object parameter)
{
// Run code when the app navigates to this page
+ scanChipTimer.Stop();
+ scanChipTimer.Tick -= ScanChipEvent;
+
using var reader = ReaderService.Instance;
await reader.Disconnect();
@@ -430,6 +433,9 @@ public async void OnNavigatedTo(object parameter)
public async void OnNavigatedFrom()
{
// Run code when the app navigates away from this page
+ scanChipTimer.Stop();
+ scanChipTimer.Tick -= ScanChipEvent;
+
using var reader = ReaderService.Instance;
await reader.Disconnect();
diff --git a/CardCheckAssistant/ViewModels/Step2PageViewModel.cs b/CardCheckAssistant/ViewModels/Step2PageViewModel.cs
index 8b963c0..c1fdd5f 100644
--- a/CardCheckAssistant/ViewModels/Step2PageViewModel.cs
+++ b/CardCheckAssistant/ViewModels/Step2PageViewModel.cs
@@ -353,9 +353,10 @@ public bool NextStepCanExecute
set
{
- if ((CheckBoxChipProgrammableNo || CheckBoxChipProgrammableYes) &&
+ if (TextBlockCheckFinishedAndResultIsNotSuppIsVisible ||
+ ((CheckBoxChipProgrammableNo || CheckBoxChipProgrammableYes) &&
(CheckBoxTestOnLockFailed || CheckBoxTestOnLockSuccess) &&
- (CheckBoxTestOnLockLimitedNo || CheckBoxTestOnLockLimitedYes) && chipWasRemovedAndPlacedAgain)
+ (CheckBoxTestOnLockLimitedNo || CheckBoxTestOnLockLimitedYes) && chipWasRemovedAndPlacedAgain))
{
SetProperty(ref _nextStepCanExecute, value);
}
@@ -435,8 +436,8 @@ public IAsyncRelayCommand PostPageLoadedCommand
///
/// launch rfidgear to test the chip and create a report
///
- ///
- private async Task ExecuteRFIDGearCommand()
+ /// false on NoChipFound, true otherwise
+ private async Task ExecuteRFIDGearCommand()
{
try
{
@@ -582,17 +583,16 @@ private async Task ExecuteRFIDGearCommand()
? LsmCardTemplates.FirstOrDefault(y => y.TemplateText.Contains("MC1000L_AV")) ?? new LSMCardTemplate()
: LsmCardTemplates.FirstOrDefault() ?? new LSMCardTemplate();
-
- if (!supported)
+ if (!programmable)
{
- Debug.WriteLine("supported only");
+ scanChipTimer.Stop();
+ scanChipTimer.Tick -= ScanChipEvent;
TextBlockCheckFinishedAndResultIsNotSuppIsVisible = true;
HyperlinkButtonReportIsVisible = true;
-
- NextStepButtonContent = "Fertigstellen";
- NextStepCanExecute = true;
TextBlockCheckFinishedIsVisible = true;
+
+ return false;
}
else if (supported && !programmable && !notEnoughFreeMemory)
@@ -603,8 +603,7 @@ private async Task ExecuteRFIDGearCommand()
TextBlockCheckFinishedAndResultIsMissingPICCKeyIsVisible = true;
HyperlinkButtonReportIsVisible = true;
- NextStepCanExecute = true;
- NextStepButtonContent = "Fertigstellen";
+ return false;
}
else if (supported && !programmable && notEnoughFreeMemory || (supported && programmable && notEnoughFreeMemory))
@@ -615,7 +614,7 @@ private async Task ExecuteRFIDGearCommand()
TextBlockCheckFinishedAndResultIsNotEnoughMemoryIsVisible = true;
HyperlinkButtonReportIsVisible = true;
- NextStepButtonContent = "Fertigstellen";
+ return false;
}
else if (supported && programmable)
@@ -653,6 +652,8 @@ await App.MainRoot.MessageDialogAsync(
throw new InvalidOperationException(e.Message);
}
+
+ return true;
}
///
@@ -779,7 +780,7 @@ private async void ScanChipEvent(object? sender, object e)
readerService.GenericChip.TCard.PrimaryType.ToString() :
readerService.GenericChip.TCard.SecondaryType.ToString() ?? "");
- if (readerService.GenericChip?.Childs != null)
+ if (readerService.GenericChip?.HasChilds == true)
{
ChipInfoMessage += string.Format("\nErkannt 2: {0}",
readerService.GenericChip.Childs[0].TCard.SecondaryType == MifareChipSubType.Unspecified ?
@@ -805,7 +806,7 @@ private async void ScanChipEvent(object? sender, object e)
readerService.GenericChip.TCard.PrimaryType.ToString() :
readerService.GenericChip.TCard.SecondaryType.ToString());
- if (readerService.GenericChip?.Childs[0] != null)
+ if (readerService.GenericChip?.HasChilds == true)
{
ChipInfoMessage += string.Format("\nErkannt 2: {0}",
readerService.GenericChip.Childs[0].TCard.SecondaryType == MifareChipSubType.Unspecified ?
@@ -845,16 +846,23 @@ public async Task PostPageLoadedCommand_Executed()
{
try
{
- var reader = ReaderService.Instance;
- await reader.Disconnect();
-
scanChipTimer.Stop();
scanChipTimer.Tick -= ScanChipEvent;
- await ExecuteRFIDGearCommand();
+ var reader = ReaderService.Instance;
+ await reader.Disconnect();
- scanChipTimer.Tick += ScanChipEvent;
- scanChipTimer.Start();
+ if (await ExecuteRFIDGearCommand())
+ {
+ scanChipTimer.Tick += ScanChipEvent;
+ scanChipTimer.Start();
+ }
+ else
+ {
+ NextStepCanExecute = true;
+ NextStepButtonContent = "Fertigstellen";
+ TextBlockCheckFinishedAndResultIsNotSuppIsVisible = true;
+ }
}
catch (Exception ex)
{
diff --git a/CardCheckAssistant/ViewModels/Step3PageViewModel.cs b/CardCheckAssistant/ViewModels/Step3PageViewModel.cs
index b58bf5d..15157ae 100644
--- a/CardCheckAssistant/ViewModels/Step3PageViewModel.cs
+++ b/CardCheckAssistant/ViewModels/Step3PageViewModel.cs
@@ -12,6 +12,7 @@
using Microsoft.UI.Xaml.Controls;
using System.Reflection.PortableExecutable;
+using Windows.Foundation.Diagnostics;
namespace CardCheckAssistant.ViewModels;
@@ -213,6 +214,10 @@ private async Task ExecuteRFIDGearCommand()
{
File.Copy(finalPath, semiFinalPath, true);
}
+ else if (File.Exists(semiFinalPath))
+ {
+ File.Copy(semiFinalPath, finalPath, true);
+ }
};
p.Start();
diff --git a/CardCheckAssistant/Views/SettingsPage.xaml b/CardCheckAssistant/Views/SettingsPage.xaml
index cc23887..57cf0be 100644
--- a/CardCheckAssistant/Views/SettingsPage.xaml
+++ b/CardCheckAssistant/Views/SettingsPage.xaml
@@ -70,11 +70,11 @@
ContentAlignment="Left">
-
+
@@ -83,18 +83,18 @@
-
+
-
+
@@ -103,14 +103,14 @@
-
+
@@ -123,20 +123,14 @@
-
+
-
-
-
-
-
-
-
+
@@ -157,7 +151,7 @@
Description="Prüfvorgang automatisch Starten"
Header="RFiDGear Automatisch starten">
-
+
@@ -170,7 +164,7 @@
HorizontalContentAlignment="Stretch"
HorizontalAlignment="Stretch">
-
+
@@ -264,7 +258,7 @@
Description="Verbindungseinstellungen"
Header="Datenbankeinstellungen">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+ Content="{x:Bind ViewModel.NextStepButtonContent, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}">