From 5fe7edcb4c88da1ed0a755c33d1f390416ff7efd Mon Sep 17 00:00:00 2001 From: Eveldee Date: Sat, 23 Jan 2021 10:52:10 +0100 Subject: [PATCH] Reorganize and Add UserManager --- Akari.Provider.WaveshareUART.csproj | 18 +- Program.cs | 18 +- Users/User.cs | 27 +++ Users/UsersManager.cs | 88 +++++++ DataDisplay.cs => Views/DataDisplay.cs | 2 +- EntryDialog.cs => Views/EntryDialog.cs | 2 +- .../FingerprintDialog.cs | 2 +- .../SettingsDisplay.cs | 3 +- SleepDisplay.cs => Views/SleepDisplay.cs | 3 +- TUIManager.cs => Views/TUIManager.cs | 214 +++--------------- WaveshareUARTProvider.cs | 43 ++++ packages.config | 1 + 12 files changed, 215 insertions(+), 206 deletions(-) create mode 100644 Users/User.cs create mode 100644 Users/UsersManager.cs rename DataDisplay.cs => Views/DataDisplay.cs (96%) rename EntryDialog.cs => Views/EntryDialog.cs (97%) rename FingerprintDialog.cs => Views/FingerprintDialog.cs (96%) rename SettingsDisplay.cs => Views/SettingsDisplay.cs (95%) rename SleepDisplay.cs => Views/SleepDisplay.cs (97%) rename TUIManager.cs => Views/TUIManager.cs (51%) create mode 100644 WaveshareUARTProvider.cs diff --git a/Akari.Provider.WaveshareUART.csproj b/Akari.Provider.WaveshareUART.csproj index 303d9e1..0a2ba28 100644 --- a/Akari.Provider.WaveshareUART.csproj +++ b/Akari.Provider.WaveshareUART.csproj @@ -88,16 +88,22 @@ packages\WaveshareUARTFingerprintSensor.1.0.0\lib\net472\WaveshareUARTFingerprintSensor.dll + + packages\YamlDotNet.9.1.4\lib\net45\YamlDotNet.dll + - - - + + + - - - + + + + + + diff --git a/Program.cs b/Program.cs index 699194e..393177d 100644 --- a/Program.cs +++ b/Program.cs @@ -1,4 +1,7 @@ -using System; +using Akari.Provider.WaveshareUART; +using Akari.Provider.WaveshareUART.Users; +using Akari.Provider.WaveshareUART.Views; +using System; using System.Collections.Generic; using System.IO.Ports; using System.Linq; @@ -10,12 +13,15 @@ using Unosquare.RaspberryIO; using Unosquare.RaspberryIO.Abstractions; using Unosquare.WiringPi; -namespace WaveshareUARTFingerprintSensor.Sample +namespace Akari.Provider.WaveshareUART { class Program { static void Main(string[] args) { + // TODO + args = new[] { "-c" }; + if (args.Length > 0) { switch (args[0]) @@ -29,13 +35,7 @@ namespace WaveshareUARTFingerprintSensor.Sample } } - - StartLoop(); - } - - private static void StartLoop() - { - + WaveshareUARTProvider.Instance.FingerprintLoop(); } private static void StartConfig() diff --git a/Users/User.cs b/Users/User.cs new file mode 100644 index 0000000..4dd4b1c --- /dev/null +++ b/Users/User.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Akari.Provider.WaveshareUART.Users +{ + public class User + { + public string Name { get; private set; } + public string Token { get; private set; } + public ushort RangeStart { get; private set; } + + public User() + { + + } + + public User(string name, string token, ushort rangeStart) + { + Name = name; + Token = token; + RangeStart = rangeStart; + } + } +} diff --git a/Users/UsersManager.cs b/Users/UsersManager.cs new file mode 100644 index 0000000..e10ddbd --- /dev/null +++ b/Users/UsersManager.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Terminal.Gui; +using YamlDotNet.Serialization; + +namespace Akari.Provider.WaveshareUART.Users +{ + public class UsersManager + { + public const string UsersFilePath = "users.yaml"; + + private readonly List _users; + private IDeserializer _deserializer; + private ISerializer _serializer; + + public int Count => _users.Count; + + public UsersManager() + { + _serializer = new SerializerBuilder().Build(); + _deserializer = new DeserializerBuilder().Build(); + + try + { + if (!File.Exists(UsersFilePath)) + { + _users = new List(); + } + else + { + _users = _deserializer.Deserialize>(File.ReadAllText(UsersFilePath)); + } + } + catch (Exception e) + { + Console.WriteLine($"Can't load users: {e.Message}"); + Console.WriteLine(e.StackTrace); + } + } + + public User this[string name] => _users.FirstOrDefault(u => u.Name.Equals(name, StringComparison.OrdinalIgnoreCase)); + + public void Add(User user) + { + _users.Add(user); + + Save(); + } + + public IReadOnlyCollection GetAll() + { + return _users.AsReadOnly(); + } + + public void Remove(User user) + { + _users.Remove(user); + + Save(); + } + + public void Clear() + { + _users.Clear(); + + Save(); + } + + private void Save() + { + try + { + File.WriteAllText(UsersFilePath, _serializer.Serialize(_users)); + } + catch (Exception e) + { + Console.WriteLine($"Can't save users: {e.Message}"); + Console.WriteLine(e.StackTrace); + + MessageBox.ErrorQuery("Users", $"Can't save users: {e.Message}"); + } + } + } +} diff --git a/DataDisplay.cs b/Views/DataDisplay.cs similarity index 96% rename from DataDisplay.cs rename to Views/DataDisplay.cs index e1f1da5..d17c6fb 100644 --- a/DataDisplay.cs +++ b/Views/DataDisplay.cs @@ -6,7 +6,7 @@ using System.Text; using System.Threading.Tasks; using Terminal.Gui; -namespace WaveshareUARTFingerprintSensor.Sample +namespace Akari.Provider.WaveshareUART.Views { public class DataDisplay : Toplevel { diff --git a/EntryDialog.cs b/Views/EntryDialog.cs similarity index 97% rename from EntryDialog.cs rename to Views/EntryDialog.cs index cc68970..5a813a9 100644 --- a/EntryDialog.cs +++ b/Views/EntryDialog.cs @@ -6,7 +6,7 @@ using System.Text; using System.Threading.Tasks; using Terminal.Gui; -namespace WaveshareUARTFingerprintSensor.Sample +namespace Akari.Provider.WaveshareUART.Views { public class EntryDialog : Dialog { diff --git a/FingerprintDialog.cs b/Views/FingerprintDialog.cs similarity index 96% rename from FingerprintDialog.cs rename to Views/FingerprintDialog.cs index c71b04a..6643b30 100644 --- a/FingerprintDialog.cs +++ b/Views/FingerprintDialog.cs @@ -6,7 +6,7 @@ using System.Text; using System.Threading.Tasks; using Terminal.Gui; -namespace WaveshareUARTFingerprintSensor.Sample +namespace Akari.Provider.WaveshareUART.Views { public class FingerprintDialog : Dialog { diff --git a/SettingsDisplay.cs b/Views/SettingsDisplay.cs similarity index 95% rename from SettingsDisplay.cs rename to Views/SettingsDisplay.cs index 7dae4ae..06e7e15 100644 --- a/SettingsDisplay.cs +++ b/Views/SettingsDisplay.cs @@ -6,8 +6,9 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using Terminal.Gui; +using WaveshareUARTFingerprintSensor; -namespace WaveshareUARTFingerprintSensor.Sample +namespace Akari.Provider.WaveshareUART.Views { public class SettingsDisplay : Toplevel { diff --git a/SleepDisplay.cs b/Views/SleepDisplay.cs similarity index 97% rename from SleepDisplay.cs rename to Views/SleepDisplay.cs index 7657f29..5011cde 100644 --- a/SleepDisplay.cs +++ b/Views/SleepDisplay.cs @@ -6,8 +6,9 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using Terminal.Gui; +using WaveshareUARTFingerprintSensor; -namespace WaveshareUARTFingerprintSensor.Sample +namespace Akari.Provider.WaveshareUART.Views { public class SleepDisplay : Toplevel { diff --git a/TUIManager.cs b/Views/TUIManager.cs similarity index 51% rename from TUIManager.cs rename to Views/TUIManager.cs index 2703576..34871fc 100644 --- a/TUIManager.cs +++ b/Views/TUIManager.cs @@ -1,4 +1,6 @@ -using NStack; +using Akari.Provider.WaveshareUART; +using Akari.Provider.WaveshareUART.Users; +using NStack; using System; using System.Collections.Generic; using System.IO; @@ -6,21 +8,22 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Terminal.Gui; +using WaveshareUARTFingerprintSensor; -namespace WaveshareUARTFingerprintSensor.Sample +namespace Akari.Provider.WaveshareUART.Views { public class TUIManager : Toplevel { - public const string OutputFilePath = "out.txt"; public const string SettingsFilePath = "settings.txt"; - private FingerprintSensor _fingerprintSensor; + public WaveshareUARTProvider Provider => WaveshareUARTProvider.Instance; + public FingerprintSensor FingerprintSensor => Provider.FingerprintSensor; + public UsersManager UsersManager => Provider.UsersManager; + private Label _serialPortLabel; private Label _comparisonLevelLabel; private Label _userCountLabel; - private object _outputFileLock = new object(); - public TUIManager() { Init(); @@ -68,76 +71,34 @@ namespace WaveshareUARTFingerprintSensor.Sample Y = Pos.Bottom(_serialPortLabel), Width = Dim.Fill() }; - _userCountLabel = new Label("Users: 0") + _userCountLabel = new Label($"Users: {UsersManager.Count}") { X = Pos.Left(_comparisonLevelLabel), Y = Pos.Bottom(_comparisonLevelLabel), Width = Dim.Fill() }; - var userCountButton = new Button("Query _User Count") + var manageUsersButton = new Button("_Manage Users") { X = Pos.Center(), Y = 7 }; - userCountButton.Clicked += UserCountButton_Clicked; + manageUsersButton.Clicked += ManageUsersButton_Clicked; - var readFingerprintButton = new Button("_Read Fingerprint") + var addUserButton = new Button("_Add User") { X = Pos.Center(), - Y = Pos.Bottom(userCountButton) + 1 + Y = Pos.Bottom(manageUsersButton) + 1 }; - readFingerprintButton.Clicked += ReadFingerprintButton_Clicked; - - var readEigenvaluesButton = new Button("Read _Eigenvalues") - { - X = Pos.Center(), - Y = Pos.Bottom(readFingerprintButton) - }; - readEigenvaluesButton.Clicked += ReadEigenvaluesButton_Clicked; - - var readImageButton = new Button("Read _Image") - { - X = Pos.Center(), - Y = Pos.Bottom(readEigenvaluesButton) - }; - readImageButton.Clicked += ReadImageButton_Clicked; - - var addFingerprintButton = new Button("_Add Fingerprint") - { - X = Pos.Center(), - Y = Pos.Bottom(readImageButton) + 1 - }; - addFingerprintButton.Clicked += AddFingerprintButton_Clicked; - - var deleteAFingerprint = new Button("_Delete a Fingerprint") - { - X = Pos.Center(), - Y = Pos.Bottom(addFingerprintButton) - }; - deleteAFingerprint.Clicked += DeleteAFingerprint_Clicked; - - var clearFingerprintsButton = new Button("_Clear Fingerprints") - { - X = Pos.Center(), - Y = Pos.Bottom(deleteAFingerprint) - }; - clearFingerprintsButton.Clicked += ClearFingerprintsButton_Clicked; + addUserButton.Clicked += AddUserButton_Clicked; var setComparisonLevelButton = new Button("Set Comparison _Level") { X = Pos.Center(), - Y = Pos.Bottom(clearFingerprintsButton) + 1 + Y = Pos.Bottom(addUserButton) + 1 }; setComparisonLevelButton.Clicked += SetComparisonLevelButton_Clicked; - var sleepButton = new Button("_Sleep Mode") - { - X = Pos.Center(), - Y = Pos.Bottom(setComparisonLevelButton) + 1 - }; - sleepButton.Clicked += SleepButton_Clicked; - var quitButton = new Button("_Quit") { X = Pos.Center(), @@ -149,15 +110,9 @@ namespace WaveshareUARTFingerprintSensor.Sample _serialPortLabel, _comparisonLevelLabel, _userCountLabel, - userCountButton, - readFingerprintButton, - readEigenvaluesButton, - readImageButton, - addFingerprintButton, - deleteAFingerprint, - clearFingerprintsButton, + manageUsersButton, + addUserButton, setComparisonLevelButton, - sleepButton, quitButton ); @@ -167,7 +122,7 @@ namespace WaveshareUARTFingerprintSensor.Sample Application.Run(new SettingsDisplay()); } - InitSensor(); + Provider.InitSensor(); // Update gui UpdateSerialPort(); @@ -177,97 +132,27 @@ namespace WaveshareUARTFingerprintSensor.Sample private void UpdateSerialPort() { - _serialPortLabel.Text = $"Serial Port: {_fingerprintSensor.PortName}"; - } - - private void InitSensor() - { - _fingerprintSensor = new FingerprintSensor(File.ReadAllText(SettingsFilePath)); - - _fingerprintSensor.Start(); + _serialPortLabel.Text = $"Serial Port: {FingerprintSensor.PortName}"; } private void UpdateUserCount() { - if (_fingerprintSensor.TryGetUserCount(out ushort count)) - { - _userCountLabel.Text = $"Users: {count}"; - } + _userCountLabel.Text = $"Users: {UsersManager.Count}"; } private void UpdateComparisonLevel() { - if (_fingerprintSensor.TryGetComparisonLevel(out byte comparisonLevel)) + if (FingerprintSensor.TryGetComparisonLevel(out byte comparisonLevel)) { _comparisonLevelLabel.Text = $"Comparison Level: {comparisonLevel}"; } } - private void ReadImageButton_Clicked() - { - var dialog = new FingerprintDialog("Acquire Image", "Can't acquire image, try to place your finger flat on the sensor"); - byte[] image = null; - - Task.Run(() => - { - if (_fingerprintSensor.TryAcquireImage(out image)) - { - dialog.Cancel(); - } - else - { - dialog.CancelAndShowError(); - } - }); - - dialog.Show(); - - if (image != null) - { - WriteOut($"Image:\n{Utils.ArrayDisplay(image)}\n\n\n"); - - var window = new DataDisplay("Image", image.ToArray()); - - Application.Run(window); - } - } - - private void ReadEigenvaluesButton_Clicked() - { - var dialog = new FingerprintDialog("Acquire Eigenvalues", "Can't acquire eigenvalues, try to place your finger flat on the sensor"); - byte[] eigenvalues = null; - - Task.Run(() => - { - if (_fingerprintSensor.TryAcquireEigenvalues(out var values)) - { - eigenvalues = values.ToArray(); - - dialog.Cancel(); - } - else - { - dialog.CancelAndShowError(); - } - }); - - dialog.Show(); - - if (eigenvalues != null) - { - var window = new DataDisplay("Eigenvalues", eigenvalues); - - WriteOut($"Eigenvalues:\n{Utils.ArrayDisplay(eigenvalues)}\n\n\n"); - - Application.Run(window); - } - } - 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()))) + if (!FingerprintSensor.TrySetComparisonLevel(byte.Parse(input.ToString()))) { MessageBox.ErrorQuery("Comparison Level", "Can't set comparison level", "Ok"); } @@ -276,35 +161,7 @@ namespace WaveshareUARTFingerprintSensor.Sample UpdateComparisonLevel(); } - private void DeleteAFingerprint_Clicked() - { - if (new EntryDialog("User id", i => int.TryParse(i.ToString(), out var n), "Need to be a valid user id").TryShow(out var input)) - { - if (!_fingerprintSensor.DeleteUser(ushort.Parse(input.ToString()))) - { - MessageBox.ErrorQuery("Delete User", "Can't delete user, check user id", "Ok"); - } - } - - UpdateUserCount(); - } - - private void SleepButton_Clicked() - { - var window = new SleepDisplay(_fingerprintSensor); - - Application.Run(window); - } - - private void ClearFingerprintsButton_Clicked() - { - if (!_fingerprintSensor.DeleteAllUsers()) - { - MessageBox.ErrorQuery("Delete All Users", "Can't delete all user", "Ok"); - } - } - - private void AddFingerprintButton_Clicked() + 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)) { @@ -312,7 +169,7 @@ namespace WaveshareUARTFingerprintSensor.Sample Task.Run(() => { - switch (_fingerprintSensor.AddFingerprint(ushort.Parse(input.ToString()), UserPermission.Level1)) + switch (FingerprintSensor.AddFingerprint(ushort.Parse(input.ToString()), UserPermission.Level1)) { case ResponseType.Success: dialog.Cancel(); @@ -356,7 +213,7 @@ namespace WaveshareUARTFingerprintSensor.Sample } } - private void ReadFingerprintButton_Clicked() + private void ManageUsersButton_Clicked() { var dialog = new FingerprintDialog("Read Fingerprint", "Can't read fingerprint, try to place your finger flat on the sensor"); @@ -364,7 +221,7 @@ namespace WaveshareUARTFingerprintSensor.Sample Task.Run(() => { - if (_fingerprintSensor.TryComparison1N(out userInfo)) + if (FingerprintSensor.TryComparison1N(out userInfo)) { dialog.Cancel(); } @@ -382,28 +239,13 @@ namespace WaveshareUARTFingerprintSensor.Sample } } - private void UserCountButton_Clicked() - { - UpdateUserCount(); - } - private void WriteOut(string text) - { - Task.Run(() => - { - lock (_outputFileLock) - { - File.AppendAllText(OutputFilePath, text); - } - }); - } - private void ChangeConfig() { File.Delete(SettingsFilePath); Application.Run(new SettingsDisplay()); - InitSensor(); + Provider.InitSensor(); UpdateSerialPort(); } diff --git a/WaveshareUARTProvider.cs b/WaveshareUARTProvider.cs new file mode 100644 index 0000000..9f2f61e --- /dev/null +++ b/WaveshareUARTProvider.cs @@ -0,0 +1,43 @@ +using Akari.Provider.WaveshareUART.Users; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using WaveshareUARTFingerprintSensor; + +namespace Akari.Provider.WaveshareUART +{ + public class WaveshareUARTProvider + { + public const string SettingsFilePath = "settings.txt"; + + public static WaveshareUARTProvider Instance { get; } + + static WaveshareUARTProvider() + { + Instance = new WaveshareUARTProvider(); + } + + public UsersManager UsersManager { get; } + public FingerprintSensor FingerprintSensor { get; private set; } + + private WaveshareUARTProvider() + { + UsersManager = new UsersManager(); + } + + public void InitSensor() + { + FingerprintSensor = new FingerprintSensor(File.ReadAllText(SettingsFilePath)); + + FingerprintSensor.Start(); + } + + internal void FingerprintLoop() + { + + } + } +} diff --git a/packages.config b/packages.config index 3d3c24c..7afdc17 100644 --- a/packages.config +++ b/packages.config @@ -15,4 +15,5 @@ + \ No newline at end of file