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"> - +