diff --git a/Toolkit.Foundation/IHostBuilderExtension.cs b/Toolkit.Foundation/IHostBuilderExtension.cs index 1be1af4..80ea01a 100644 --- a/Toolkit.Foundation/IHostBuilderExtension.cs +++ b/Toolkit.Foundation/IHostBuilderExtension.cs @@ -197,16 +197,20 @@ public static class IHostBuilderExtension return builder; } - public static IHostBuilder ConfigureSerial(this IHostBuilder hostBuilder, - Action configureDelegate) where TSerialReader : SerialReader - where TConfiguration : ISerialConfiguration, new() + public static IHostBuilder ConfigureMicroControllers(this IHostBuilder hostBuilder, Action builderDelegate) { hostBuilder.ConfigureServices((hostBuilderContext, serviceCollection) => { - configureDelegate.Invoke(hostBuilderContext); + MicroControllerBuilder? builder = new(); + builderDelegate.Invoke(builder); serviceCollection.TryAddSingleton(); - serviceCollection.AddSingleton(provider => provider.GetService()!.Create(provider.GetService>()!.CurrentValue)); + serviceCollection.TryAddSingleton(); + + foreach (IMicroControllerBuilderConfiguration configuration in builder.Configurations) + { + serviceCollection.AddSingleton(provider => configuration.Factory.Invoke(provider) ?? throw new NullReferenceException()); + } }); return hostBuilder; diff --git a/Toolkit.Foundation/IMicroControllerContextFactory.cs b/Toolkit.Foundation/IMicroControllerContextFactory.cs new file mode 100644 index 0000000..31ad49f --- /dev/null +++ b/Toolkit.Foundation/IMicroControllerContextFactory.cs @@ -0,0 +1,9 @@ +namespace Toolkit.Foundation; + +public interface IMicroControllerContextFactory +{ + IMicroControllerContext? Create(IReadOnlyCollection modules) + where TConfiguration : ISerialConfiguration + where TReader : SerialReader + where TEvent : ISerialEventArgs; +} diff --git a/Toolkit.Foundation/IMicrocontrollerBuilder.cs b/Toolkit.Foundation/IMicrocontrollerBuilder.cs index 4db6403..75bc655 100644 --- a/Toolkit.Foundation/IMicrocontrollerBuilder.cs +++ b/Toolkit.Foundation/IMicrocontrollerBuilder.cs @@ -1,12 +1,11 @@ -using Microsoft.Extensions.Configuration; +namespace Toolkit.Foundation; -namespace Toolkit.Foundation; - -public interface IMicrocontrollerBuilder +public interface IMicroControllerBuilder { - IReadOnlyCollection Configurations { get; } + IReadOnlyCollection Configurations { get; } - IMicrocontrollerBuilderConfiguration Add(IConfiguration configuration) - where TConfiguration : IMicrocontrollerConfiguration, new() - where TSerialReader : SerialReader where TReadDeserializer : IMicrocontrollerModuleDeserializer, new(); + IMicroControllerBuilderConfiguration Add() + where TConfiguration : ISerialConfiguration + where TReader : SerialReader + where TEvent : ISerialEventArgs; } diff --git a/Toolkit.Foundation/IMicrocontrollerBuilderConfiguration.cs b/Toolkit.Foundation/IMicrocontrollerBuilderConfiguration.cs index 751441d..e87e488 100644 --- a/Toolkit.Foundation/IMicrocontrollerBuilderConfiguration.cs +++ b/Toolkit.Foundation/IMicrocontrollerBuilderConfiguration.cs @@ -1,17 +1,19 @@ namespace Toolkit.Foundation; -public interface IMicrocontrollerBuilderConfiguration +public interface IMicroControllerBuilderConfiguration { - IReadOnlyCollection Modules { get; } + IReadOnlyCollection Modules { get; } - Func Factory { get; } + Func Factory { get; } } -public interface IMicrocontrollerBuilderConfiguration : - IMicrocontrollerBuilderConfiguration where TConfiguration : IMicrocontrollerConfiguration, new() - where TSerialReader : SerialReader where TReadDeserializer : IMicrocontrollerModuleDeserializer, new() +public interface IMicroControllerBuilderConfiguration : + IMicroControllerBuilderConfiguration + where TConfiguration : ISerialConfiguration + where TReader : SerialReader + where IEvent : ISerialEventArgs { - IMicrocontrollerBuilderConfiguration AddModule() - where TModule : IMicrocontrollerModule, new(); + IMicroControllerBuilderConfiguration AddModule() + where TModule : IMicroControllerModule, new(); } diff --git a/Toolkit.Foundation/IMicrocontrollerConfiguration.cs b/Toolkit.Foundation/IMicrocontrollerConfiguration.cs deleted file mode 100644 index 75a01de..0000000 --- a/Toolkit.Foundation/IMicrocontrollerConfiguration.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace Toolkit.Foundation; - -public interface IMicrocontrollerConfiguration : - ISerialConfiguration; diff --git a/Toolkit.Foundation/IMicrocontrollerContext.cs b/Toolkit.Foundation/IMicrocontrollerContext.cs index 8b1de04..0990f1e 100644 --- a/Toolkit.Foundation/IMicrocontrollerContext.cs +++ b/Toolkit.Foundation/IMicrocontrollerContext.cs @@ -1,6 +1,7 @@ namespace Toolkit.Foundation; -public interface IMicrocontrollerContext : - IMicrocontrollerContext where TModuleDeserializer : IMicrocontrollerModuleDeserializer, new(); +public interface IMicroControllerContext : + IMicroControllerContext + where TEvent : ISerialEventArgs; -public interface IMicrocontrollerContext; \ No newline at end of file +public interface IMicroControllerContext; \ No newline at end of file diff --git a/Toolkit.Foundation/IMicrocontrollerFactory.cs b/Toolkit.Foundation/IMicrocontrollerFactory.cs deleted file mode 100644 index 602930b..0000000 --- a/Toolkit.Foundation/IMicrocontrollerFactory.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Toolkit.Foundation; - -public interface IMicrocontrollerFactory -{ - IMicrocontrollerContext Create(IMicrocontrollerConfiguration configuration, IReadOnlyCollection modules) - where TSerialReader : SerialReader where TReadDeserializer : IMicrocontrollerModuleDeserializer, new(); -} diff --git a/Toolkit.Foundation/IMicrocontrollerModule.cs b/Toolkit.Foundation/IMicrocontrollerModule.cs index b5e2206..d04fad2 100644 --- a/Toolkit.Foundation/IMicrocontrollerModule.cs +++ b/Toolkit.Foundation/IMicrocontrollerModule.cs @@ -1,3 +1,3 @@ namespace Toolkit.Foundation; -public interface IMicrocontrollerModule; \ No newline at end of file +public interface IMicroControllerModule; \ No newline at end of file diff --git a/Toolkit.Foundation/IMicrocontrollerModuleDescriptor.cs b/Toolkit.Foundation/IMicrocontrollerModuleDescriptor.cs index ec45a33..a63155d 100644 --- a/Toolkit.Foundation/IMicrocontrollerModuleDescriptor.cs +++ b/Toolkit.Foundation/IMicrocontrollerModuleDescriptor.cs @@ -1,12 +1,13 @@ namespace Toolkit.Foundation; -public interface IMicrocontrollerModuleDescriptor : - IMicrocontrollerModuleDescriptor where TModule : IMicrocontrollerModule +public interface IMicroControllerModuleDescriptor : + IMicroControllerModuleDescriptor + where TModule : IMicroControllerModule { Func? Factory { get; } } -public interface IMicrocontrollerModuleDescriptor +public interface IMicroControllerModuleDescriptor { Type Type { get; } } diff --git a/Toolkit.Foundation/IMicrocontrollerModuleDeserializer.cs b/Toolkit.Foundation/IMicrocontrollerModuleDeserializer.cs deleted file mode 100644 index c032760..0000000 --- a/Toolkit.Foundation/IMicrocontrollerModuleDeserializer.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Toolkit.Foundation; - -public interface IMicrocontrollerModuleDeserializer -{ - public TRead? Read { get; set; } -} diff --git a/Toolkit.Foundation/ISerialContext.cs b/Toolkit.Foundation/ISerialContext.cs index 10ca1b5..46d01d8 100644 --- a/Toolkit.Foundation/ISerialContext.cs +++ b/Toolkit.Foundation/ISerialContext.cs @@ -1,7 +1,8 @@ namespace Toolkit.Foundation; -public interface ISerialContext : - ISerialContext where TSerialReader : SerialReader; +public interface ISerialContext : + ISerialContext + where TReader : SerialReader; public interface ISerialContext { diff --git a/Toolkit.Foundation/ISerialEventArgs.cs b/Toolkit.Foundation/ISerialEventArgs.cs new file mode 100644 index 0000000..0512557 --- /dev/null +++ b/Toolkit.Foundation/ISerialEventArgs.cs @@ -0,0 +1,3 @@ +namespace Toolkit.Foundation; + +public interface ISerialEventArgs; \ No newline at end of file diff --git a/Toolkit.Foundation/ISerialFactory.cs b/Toolkit.Foundation/ISerialFactory.cs index dea9357..50a3bd3 100644 --- a/Toolkit.Foundation/ISerialFactory.cs +++ b/Toolkit.Foundation/ISerialFactory.cs @@ -2,6 +2,7 @@ public interface ISerialFactory { - ISerialContext Create(ISerialConfiguration configuration) - where TSerialReader : SerialReader; + ISerialContext? Create() + where TConfiguration : ISerialConfiguration + where TReader : SerialReader; } diff --git a/Toolkit.Foundation/MicroControllerContextFactory.cs b/Toolkit.Foundation/MicroControllerContextFactory.cs new file mode 100644 index 0000000..a15c3b5 --- /dev/null +++ b/Toolkit.Foundation/MicroControllerContextFactory.cs @@ -0,0 +1,35 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Toolkit.Foundation; + +public class MicroControllerContextFactory(IServiceProvider provider, + IServiceFactory factory, + ISerialFactory serialFactory) : + IMicroControllerContextFactory +{ + private readonly Dictionary cache = []; + + public IMicroControllerContext? Create(IReadOnlyCollection modules) + where TConfiguration : ISerialConfiguration + where TReader : SerialReader + where THandler : ISerialEventArgs + { + if (provider.GetRequiredService() is TConfiguration configuration) + { + if (cache.TryGetValue(configuration, out IMicroControllerContext? context)) + { + return (IMicroControllerContext)context; + } + + if (serialFactory.Create() is ISerialContext serialContext) + { + context = factory.Create>(modules, serialContext); + cache.Add(configuration, context); + + return (IMicroControllerContext)context; + } + } + + return default; + } +} diff --git a/Toolkit.Foundation/MicrocontrollerBuilder.cs b/Toolkit.Foundation/MicrocontrollerBuilder.cs index 0d99ec2..3e461fa 100644 --- a/Toolkit.Foundation/MicrocontrollerBuilder.cs +++ b/Toolkit.Foundation/MicrocontrollerBuilder.cs @@ -1,22 +1,21 @@ -using Microsoft.Extensions.Configuration; -using System.Collections.ObjectModel; +using System.Collections.ObjectModel; namespace Toolkit.Foundation; -public class MicrocontrollerBuilder : - IMicrocontrollerBuilder +public class MicroControllerBuilder : + IMicroControllerBuilder { - private readonly List configurations = []; + private readonly List configurations = []; - public IReadOnlyCollection Configurations => - new ReadOnlyCollection(configurations); + public IReadOnlyCollection Configurations => + new ReadOnlyCollection(configurations); - public IMicrocontrollerBuilderConfiguration Add(IConfiguration configuration) - where TConfiguration : IMicrocontrollerConfiguration, new() - where TSerialReader : SerialReader - where TReadDeserializer : IMicrocontrollerModuleDeserializer, new() + public IMicroControllerBuilderConfiguration Add() + where TConfiguration : ISerialConfiguration + where TReader : SerialReader + where TEvent : ISerialEventArgs { - MicrocontrollerBuilderConfiguration? builderConfiguration = new(configuration); + MicroControllerBuilderConfiguration? builderConfiguration = new(); configurations.Add(builderConfiguration); return builderConfiguration; diff --git a/Toolkit.Foundation/MicrocontrollerBuilderConfiguration.cs b/Toolkit.Foundation/MicrocontrollerBuilderConfiguration.cs index e9d81ce..a5d24c7 100644 --- a/Toolkit.Foundation/MicrocontrollerBuilderConfiguration.cs +++ b/Toolkit.Foundation/MicrocontrollerBuilderConfiguration.cs @@ -1,24 +1,25 @@ -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using System.Collections.ObjectModel; namespace Toolkit.Foundation; -public class MicrocontrollerBuilderConfiguration(IConfiguration configuration) : - IMicrocontrollerBuilderConfiguration - where TConfiguration : IMicrocontrollerConfiguration, new() - where TSerialReader : SerialReader where TReadDeserializer : IMicrocontrollerModuleDeserializer, new() +public class MicroControllerBuilderConfiguration : + IMicroControllerBuilderConfiguration + where TConfiguration : ISerialConfiguration + where TReader : SerialReader + where TEvent : ISerialEventArgs { - private readonly List modules = new(); + private readonly List modules = []; - public Func Factory => (IServiceProvider provider) => provider.GetService()!.Create(configuration.Get(), Modules); + public Func Factory => (IServiceProvider provider) => provider.GetService()! + .Create(Modules); - public IReadOnlyCollection Modules => new ReadOnlyCollection(modules); + public IReadOnlyCollection Modules => new ReadOnlyCollection(modules); - public IMicrocontrollerBuilderConfiguration AddModule() - where TModule : IMicrocontrollerModule, new() + public IMicroControllerBuilderConfiguration AddModule() + where TModule : IMicroControllerModule, new() { - modules.Add(new MicrocontrollerModuleDescriptor()); + modules.Add(new MicroControllerModuleDescriptor()); return this; } } \ No newline at end of file diff --git a/Toolkit.Foundation/MicrocontrollerConfiguration.cs b/Toolkit.Foundation/MicrocontrollerConfiguration.cs index e2bfe94..d4413b9 100644 --- a/Toolkit.Foundation/MicrocontrollerConfiguration.cs +++ b/Toolkit.Foundation/MicrocontrollerConfiguration.cs @@ -2,8 +2,8 @@ namespace Toolkit.Foundation; -public class MicrocontrollerConfiguration : - IMicrocontrollerConfiguration +public class MicroControllerConfiguration : + ISerialConfiguration { [NotNull] public string? PortName { get; set; } diff --git a/Toolkit.Foundation/MicrocontrollerContext.cs b/Toolkit.Foundation/MicrocontrollerContext.cs index 1e6feba..f7818a5 100644 --- a/Toolkit.Foundation/MicrocontrollerContext.cs +++ b/Toolkit.Foundation/MicrocontrollerContext.cs @@ -2,10 +2,11 @@ namespace Toolkit.Foundation; -public class MicrocontrollerContext(IReadOnlyCollection modules, +public class MicroControllerContext(IReadOnlyCollection modules, IMessenger messenger, ISerialContext serialContext) : - IMicrocontrollerContext where TReadDeserializer : IMicrocontrollerModuleDeserializer, new() + IMicroControllerContext + where TEvent : ISerialEventArgs { public async Task InitializeAsync() { diff --git a/Toolkit.Foundation/MicrocontrollerFactory.cs b/Toolkit.Foundation/MicrocontrollerFactory.cs deleted file mode 100644 index 34aa9b0..0000000 --- a/Toolkit.Foundation/MicrocontrollerFactory.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace Toolkit.Foundation; - -public class MicrocontrollerFactory(IServiceFactory factory, - ISerialFactory serialFactory) : - IMicrocontrollerFactory -{ - private readonly Dictionary cache = new(); - - public IMicrocontrollerContext Create(IMicrocontrollerConfiguration configuration, IReadOnlyCollection modules) where TSerialReader : SerialReader where TReadDeserializer : IMicrocontrollerModuleDeserializer, new() - { - if (cache.TryGetValue(configuration, out IMicrocontrollerContext? context)) - { - return (IMicrocontrollerContext)context; - } - - ISerialContext serialContext = serialFactory.Create(configuration); - - context = factory.Create>(modules, serialContext); - cache.Add(configuration, context); - - return (IMicrocontrollerContext)context; - } -} diff --git a/Toolkit.Foundation/MicrocontrollerModuleDescriptor.cs b/Toolkit.Foundation/MicrocontrollerModuleDescriptor.cs index c405340..c154e8b 100644 --- a/Toolkit.Foundation/MicrocontrollerModuleDescriptor.cs +++ b/Toolkit.Foundation/MicrocontrollerModuleDescriptor.cs @@ -1,7 +1,7 @@ namespace Toolkit.Foundation; -public record MicrocontrollerModuleDescriptor : - IMicrocontrollerModuleDescriptor where TModule : IMicrocontrollerModule, new() +public record MicroControllerModuleDescriptor : + IMicroControllerModuleDescriptor where TModule : IMicroControllerModule, new() { public Type Type => typeof(TModule); diff --git a/Toolkit.Foundation/SerialFactory.cs b/Toolkit.Foundation/SerialFactory.cs index 81e0c57..aad2a74 100644 --- a/Toolkit.Foundation/SerialFactory.cs +++ b/Toolkit.Foundation/SerialFactory.cs @@ -1,31 +1,39 @@ -using System.IO.Ports; +using Microsoft.Extensions.DependencyInjection; +using System.IO.Ports; namespace Toolkit.Foundation; -public class SerialFactory(IServiceFactory factory) : +public class SerialFactory(IServiceProvider provider, + IServiceFactory factory) : ISerialFactory { private readonly Dictionary cache = []; - public ISerialContext Create(ISerialConfiguration configuration) - where TSerialReader : SerialReader + public ISerialContext? Create() + where TConfiguration : ISerialConfiguration + where TReader : SerialReader { - if (cache.TryGetValue(configuration, out ISerialContext? context)) + if (provider.GetRequiredService() is TConfiguration configuration) { - return (ISerialContext)context; + if (cache.TryGetValue(configuration, out ISerialContext? context)) + { + return (ISerialContext)context; + } + + SerialPort serialPort = new(configuration.PortName, configuration.BaudRate) + { + DtrEnable = true + }; + + SerialConnection connection = new(serialPort); + SerialStreamer streamer = new(serialPort); + + context = factory.Create>(connection, streamer); + cache.Add(configuration, context); + + return (ISerialContext)context; } - SerialPort serialPort = new(configuration.PortName, configuration.BaudRate) - { - DtrEnable = true - }; - - SerialConnection connection = new(serialPort); - SerialStreamer streamer = new(serialPort); - - context = factory.Create>(connection, streamer); - cache.Add(configuration, context); - - return (ISerialContext)context; + return default; } } diff --git a/Toolkit.Foundation/SerialReader.cs b/Toolkit.Foundation/SerialReader.cs index 4021b2a..2ad3e4e 100644 --- a/Toolkit.Foundation/SerialReader.cs +++ b/Toolkit.Foundation/SerialReader.cs @@ -1,8 +1,8 @@ namespace Toolkit.Foundation; -public abstract class SerialReader(Stream stream) +public abstract class SerialReader(Stream stream) { public Stream Stream { get; } = stream; - public abstract IAsyncEnumerable ReadAsync(); + public abstract IAsyncEnumerable ReadAsync(); }