using Akari.Provider.WaveshareUART; using Akari.Provider.WaveshareUART.Users; using NStack; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using Terminal.Gui; using WaveshareUARTFingerprintSensor; namespace Akari.Provider.WaveshareUART.Views { public class TUIManager : Toplevel { public const string SettingsFilePath = "settings.txt"; public WaveshareUARTProvider Provider => WaveshareUARTProvider.Instance; public FingerprintSensor FingerprintSensor => Provider.FingerprintSensor; public UsersManager UsersManager => Provider.UsersManager; private Label _serialPortLabel; private Label _comparisonLevelLabel; private Label _userCountLabel; public TUIManager() { Init(); } private void Init() { ColorScheme = Colors.Error; // Creates the top-level window to show var win = new Window("TUIManager") { X = 0, Y = 1, // Leave one row for the toplevel menu // By using Dim.Fill(), it will automatically resize without manual intervention Width = Dim.Fill(), Height = Dim.Fill() }; win.ColorScheme = Colors.ColorSchemes["Dialog"]; Add(win); // Creates a menubar, the item "New" has a help menu. var menu = new MenuBar(new MenuBarItem[] { new MenuBarItem ("_Options", new MenuItem [] { new MenuItem ("_Change Config", "", () => { ChangeConfig(); }), new MenuItem ("_Quit", "", () => { Application.RequestStop(); }) }) }); Add(menu); // Window Content _serialPortLabel = new Label("Serial Port:") { X = 2, Y = 1, Width = Dim.Fill() }; _comparisonLevelLabel = new Label("Comparison Level: 0") { X = Pos.Left(_serialPortLabel), Y = Pos.Bottom(_serialPortLabel), Width = Dim.Fill() }; _userCountLabel = new Label($"Users: {UsersManager.Count}") { X = Pos.Left(_comparisonLevelLabel), Y = Pos.Bottom(_comparisonLevelLabel), Width = Dim.Fill() }; var manageUsersButton = new Button("_Manage Users") { X = Pos.Center(), Y = 7 }; manageUsersButton.Clicked += ManageUsersButton_Clicked; var addUserButton = new Button("_Add User") { X = Pos.Center(), Y = Pos.Bottom(manageUsersButton) + 1 }; addUserButton.Clicked += AddUserButton_Clicked; var setComparisonLevelButton = new Button("Set Comparison _Level") { X = Pos.Center(), Y = Pos.Bottom(addUserButton) + 1 }; setComparisonLevelButton.Clicked += SetComparisonLevelButton_Clicked; var quitButton = new Button("_Quit") { X = Pos.Center(), Y = Pos.Percent(95) }; quitButton.Clicked += Quit_Clicked; win.Add( _serialPortLabel, _comparisonLevelLabel, _userCountLabel, manageUsersButton, addUserButton, setComparisonLevelButton, quitButton ); // Init Sensor if (!File.Exists(SettingsFilePath)) { Application.Run(new SettingsDisplay()); } Provider.InitSensor(); // Update gui UpdateSerialPort(); UpdateUserCount(); UpdateComparisonLevel(); } private void UpdateSerialPort() { _serialPortLabel.Text = $"Serial Port: {FingerprintSensor.PortName}"; } private void UpdateUserCount() { _userCountLabel.Text = $"Users: {UsersManager.Count}"; } private void UpdateComparisonLevel() { if (FingerprintSensor.TryGetComparisonLevel(out byte comparisonLevel)) { _comparisonLevelLabel.Text = $"Comparison Level: {comparisonLevel}"; } } private void SetComparisonLevelButton_Clicked() { if (new EntryDialog("Comparison Level", i => int.TryParse(i.ToString(), out var n) && n > 0 && n < 10, "Need to be a valid number in 0-9 range").TryShow(out var input)) { if (!FingerprintSensor.TrySetComparisonLevel(byte.Parse(input.ToString()))) { MessageBox.ErrorQuery("Comparison Level", "Can't set comparison level", "Ok"); } } UpdateComparisonLevel(); } private void AddUserButton_Clicked() { if (new EntryDialog("User id", i => ushort.TryParse(i.ToString(), out var n), "Need to be a valid user id").TryShow(out var input)) { var dialog = new FingerprintDialog("Add Fingerprint", "Can't add fingerprint, try to place your finger flat on the sensor"); Task.Run(() => { switch (FingerprintSensor.AddFingerprint(ushort.Parse(input.ToString()), UserPermission.Level1)) { case ResponseType.Success: dialog.Cancel(); Application.MainLoop.Invoke(() => MessageBox.Query("Add Fingerprint", "Successfully added fingerprint", "Ok")); break; case ResponseType.Full: dialog.ErrorMessage = "Sensor full, can't add more users"; dialog.CancelAndShowError(); break; case ResponseType.NoUser: dialog.ErrorMessage = "Can't add fingerprint, invalid id"; dialog.CancelAndShowError(); break; case ResponseType.FingerOccupied: dialog.ErrorMessage = "Can't add fingerprint, finger already registered"; dialog.CancelAndShowError(); break; case ResponseType.UserOccupied: dialog.ErrorMessage = "Can't add fingerprint, id already used"; dialog.CancelAndShowError(); break; default: dialog.CancelAndShowError(); break; } }); dialog.Show(); UpdateUserCount(); } } private void ManageUsersButton_Clicked() { var dialog = new FingerprintDialog("Read Fingerprint", "Can't read fingerprint, try to place your finger flat on the sensor"); (ushort userID, UserPermission permission) userInfo = default; Task.Run(() => { if (FingerprintSensor.TryComparison1N(out userInfo)) { dialog.Cancel(); } else { dialog.CancelAndShowError(); } }); dialog.Show(); if (userInfo != default) { MessageBox.Query("Read Fingerprint", $"Successfully read fingerprint\n\nUser ID: {userInfo.userID}\nPermissions: {userInfo.permission}\n ", "Ok"); } } private void ChangeConfig() { File.Delete(SettingsFilePath); Application.Run(new SettingsDisplay()); Provider.InitSensor(); UpdateSerialPort(); } private void Quit_Clicked() { Application.RequestStop(); } } }