diff --git a/Toolkit.Foundation/IHostBuilderExtension.cs b/Toolkit.Foundation/IHostBuilderExtension.cs index 7756323..1be1af4 100644 --- a/Toolkit.Foundation/IHostBuilderExtension.cs +++ b/Toolkit.Foundation/IHostBuilderExtension.cs @@ -5,6 +5,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.FileProviders.Physical; using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Options; using System.Text.Json; namespace Toolkit.Foundation; @@ -196,6 +197,21 @@ public static class IHostBuilderExtension return builder; } + public static IHostBuilder ConfigureSerial(this IHostBuilder hostBuilder, + Action configureDelegate) where TSerialReader : SerialReader + where TConfiguration : ISerialConfiguration, new() + { + hostBuilder.ConfigureServices((hostBuilderContext, serviceCollection) => + { + configureDelegate.Invoke(hostBuilderContext); + + serviceCollection.TryAddSingleton(); + serviceCollection.AddSingleton(provider => provider.GetService()!.Create(provider.GetService>()!.CurrentValue)); + }); + + return hostBuilder; + } + public static IHostBuilder UseContentRoot(this IHostBuilder hostBuilder, string contentRoot, bool createDirectory) diff --git a/Toolkit.Foundation/IMicrocontrollerBuilder.cs b/Toolkit.Foundation/IMicrocontrollerBuilder.cs new file mode 100644 index 0000000..4db6403 --- /dev/null +++ b/Toolkit.Foundation/IMicrocontrollerBuilder.cs @@ -0,0 +1,12 @@ +using Microsoft.Extensions.Configuration; + +namespace Toolkit.Foundation; + +public interface IMicrocontrollerBuilder +{ + IReadOnlyCollection Configurations { get; } + + IMicrocontrollerBuilderConfiguration Add(IConfiguration configuration) + where TConfiguration : IMicrocontrollerConfiguration, new() + where TSerialReader : SerialReader where TReadDeserializer : IMicrocontrollerModuleDeserializer, new(); +} diff --git a/Toolkit.Foundation/IMicrocontrollerBuilderConfiguration.cs b/Toolkit.Foundation/IMicrocontrollerBuilderConfiguration.cs new file mode 100644 index 0000000..751441d --- /dev/null +++ b/Toolkit.Foundation/IMicrocontrollerBuilderConfiguration.cs @@ -0,0 +1,17 @@ +namespace Toolkit.Foundation; + +public interface IMicrocontrollerBuilderConfiguration +{ + IReadOnlyCollection Modules { get; } + + Func Factory { get; } +} + +public interface IMicrocontrollerBuilderConfiguration : + IMicrocontrollerBuilderConfiguration where TConfiguration : IMicrocontrollerConfiguration, new() + where TSerialReader : SerialReader where TReadDeserializer : IMicrocontrollerModuleDeserializer, new() +{ + + IMicrocontrollerBuilderConfiguration AddModule() + where TModule : IMicrocontrollerModule, new(); +} diff --git a/Toolkit.Foundation/IMicrocontrollerConfiguration.cs b/Toolkit.Foundation/IMicrocontrollerConfiguration.cs new file mode 100644 index 0000000..75a01de --- /dev/null +++ b/Toolkit.Foundation/IMicrocontrollerConfiguration.cs @@ -0,0 +1,4 @@ +namespace Toolkit.Foundation; + +public interface IMicrocontrollerConfiguration : + ISerialConfiguration; diff --git a/Toolkit.Foundation/IMicrocontrollerContext.cs b/Toolkit.Foundation/IMicrocontrollerContext.cs new file mode 100644 index 0000000..8b1de04 --- /dev/null +++ b/Toolkit.Foundation/IMicrocontrollerContext.cs @@ -0,0 +1,6 @@ +namespace Toolkit.Foundation; + +public interface IMicrocontrollerContext : + IMicrocontrollerContext where TModuleDeserializer : IMicrocontrollerModuleDeserializer, new(); + +public interface IMicrocontrollerContext; \ No newline at end of file diff --git a/Toolkit.Foundation/IMicrocontrollerFactory.cs b/Toolkit.Foundation/IMicrocontrollerFactory.cs new file mode 100644 index 0000000..602930b --- /dev/null +++ b/Toolkit.Foundation/IMicrocontrollerFactory.cs @@ -0,0 +1,7 @@ +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 new file mode 100644 index 0000000..b5e2206 --- /dev/null +++ b/Toolkit.Foundation/IMicrocontrollerModule.cs @@ -0,0 +1,3 @@ +namespace Toolkit.Foundation; + +public interface IMicrocontrollerModule; \ No newline at end of file diff --git a/Toolkit.Foundation/IMicrocontrollerModuleDescriptor.cs b/Toolkit.Foundation/IMicrocontrollerModuleDescriptor.cs new file mode 100644 index 0000000..ec45a33 --- /dev/null +++ b/Toolkit.Foundation/IMicrocontrollerModuleDescriptor.cs @@ -0,0 +1,12 @@ +namespace Toolkit.Foundation; + +public interface IMicrocontrollerModuleDescriptor : + IMicrocontrollerModuleDescriptor where TModule : IMicrocontrollerModule +{ + Func? Factory { get; } +} + +public interface IMicrocontrollerModuleDescriptor +{ + Type Type { get; } +} diff --git a/Toolkit.Foundation/IMicrocontrollerModuleDeserializer.cs b/Toolkit.Foundation/IMicrocontrollerModuleDeserializer.cs new file mode 100644 index 0000000..c032760 --- /dev/null +++ b/Toolkit.Foundation/IMicrocontrollerModuleDeserializer.cs @@ -0,0 +1,6 @@ +namespace Toolkit.Foundation; + +public interface IMicrocontrollerModuleDeserializer +{ + public TRead? Read { get; set; } +} diff --git a/Toolkit.Foundation/ISerialContext.cs b/Toolkit.Foundation/ISerialContext.cs index 2f21b7a..10ca1b5 100644 --- a/Toolkit.Foundation/ISerialContext.cs +++ b/Toolkit.Foundation/ISerialContext.cs @@ -1,7 +1,9 @@ namespace Toolkit.Foundation; public interface ISerialContext : - ISerialContext where TSerialReader : SerialReader -{ + ISerialContext where TSerialReader : SerialReader; -} \ No newline at end of file +public interface ISerialContext +{ + void Open(); +} diff --git a/Toolkit.Foundation/ISerialContext1.cs b/Toolkit.Foundation/ISerialContext1.cs deleted file mode 100644 index 8271f2f..0000000 --- a/Toolkit.Foundation/ISerialContext1.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Toolkit.Foundation; - -public interface ISerialContext -{ - void Open(); -} diff --git a/Toolkit.Foundation/MicrocontrollerBuilder.cs b/Toolkit.Foundation/MicrocontrollerBuilder.cs new file mode 100644 index 0000000..0d99ec2 --- /dev/null +++ b/Toolkit.Foundation/MicrocontrollerBuilder.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.Configuration; +using System.Collections.ObjectModel; + +namespace Toolkit.Foundation; + +public class MicrocontrollerBuilder : + IMicrocontrollerBuilder +{ + private readonly List configurations = []; + + public IReadOnlyCollection Configurations => + new ReadOnlyCollection(configurations); + + public IMicrocontrollerBuilderConfiguration Add(IConfiguration configuration) + where TConfiguration : IMicrocontrollerConfiguration, new() + where TSerialReader : SerialReader + where TReadDeserializer : IMicrocontrollerModuleDeserializer, new() + { + MicrocontrollerBuilderConfiguration? builderConfiguration = new(configuration); + configurations.Add(builderConfiguration); + + return builderConfiguration; + } +} \ No newline at end of file diff --git a/Toolkit.Foundation/MicrocontrollerBuilderConfiguration.cs b/Toolkit.Foundation/MicrocontrollerBuilderConfiguration.cs new file mode 100644 index 0000000..e9d81ce --- /dev/null +++ b/Toolkit.Foundation/MicrocontrollerBuilderConfiguration.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.Configuration; +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() +{ + private readonly List modules = new(); + + public Func Factory => (IServiceProvider provider) => provider.GetService()!.Create(configuration.Get(), Modules); + + public IReadOnlyCollection Modules => new ReadOnlyCollection(modules); + + public IMicrocontrollerBuilderConfiguration AddModule() + where TModule : IMicrocontrollerModule, new() + { + modules.Add(new MicrocontrollerModuleDescriptor()); + return this; + } +} \ No newline at end of file diff --git a/Toolkit.Foundation/MicrocontrollerConfiguration.cs b/Toolkit.Foundation/MicrocontrollerConfiguration.cs new file mode 100644 index 0000000..e2bfe94 --- /dev/null +++ b/Toolkit.Foundation/MicrocontrollerConfiguration.cs @@ -0,0 +1,12 @@ +using System.Diagnostics.CodeAnalysis; + +namespace Toolkit.Foundation; + +public class MicrocontrollerConfiguration : + IMicrocontrollerConfiguration +{ + [NotNull] + public string? PortName { get; set; } + + public int BaudRate { get; set; } +} \ No newline at end of file diff --git a/Toolkit.Foundation/MicrocontrollerContext.cs b/Toolkit.Foundation/MicrocontrollerContext.cs new file mode 100644 index 0000000..1e6feba --- /dev/null +++ b/Toolkit.Foundation/MicrocontrollerContext.cs @@ -0,0 +1,23 @@ +using CommunityToolkit.Mvvm.Messaging; + +namespace Toolkit.Foundation; + +public class MicrocontrollerContext(IReadOnlyCollection modules, + IMessenger messenger, + ISerialContext serialContext) : + IMicrocontrollerContext where TReadDeserializer : IMicrocontrollerModuleDeserializer, new() +{ + public async Task InitializeAsync() + { + //eventAggregator.Subscribe>(OnEvent, null, args => args.Context.Equals(serialContext)); + serialContext.Open(); + + await Task.CompletedTask; + } + + private async void OnEvent(SerialResponse args) + { + //IMicrocontrollerModule? module = await messenger.SendAsync(new TReadDeserializer { Read = args.Content }, modules); + //messenger.Send((dynamic?)module); + } +} \ No newline at end of file diff --git a/Toolkit.Foundation/MicrocontrollerFactory.cs b/Toolkit.Foundation/MicrocontrollerFactory.cs new file mode 100644 index 0000000..34aa9b0 --- /dev/null +++ b/Toolkit.Foundation/MicrocontrollerFactory.cs @@ -0,0 +1,23 @@ +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 new file mode 100644 index 0000000..c405340 --- /dev/null +++ b/Toolkit.Foundation/MicrocontrollerModuleDescriptor.cs @@ -0,0 +1,9 @@ +namespace Toolkit.Foundation; + +public record MicrocontrollerModuleDescriptor : + IMicrocontrollerModuleDescriptor where TModule : IMicrocontrollerModule, new() +{ + public Type Type => typeof(TModule); + + public Func? Factory => new(() => new TModule()); +} diff --git a/Toolkit.Foundation/SerialContext.cs b/Toolkit.Foundation/SerialContext.cs index 822aafd..94735aa 100644 --- a/Toolkit.Foundation/SerialContext.cs +++ b/Toolkit.Foundation/SerialContext.cs @@ -22,4 +22,4 @@ public class SerialContext(IMessenger messenger, } } } -} \ No newline at end of file +} diff --git a/Toolkit.Foundation/SerialReaderHandler.cs b/Toolkit.Foundation/SerialReaderHandler.cs new file mode 100644 index 0000000..b3e1cb9 --- /dev/null +++ b/Toolkit.Foundation/SerialReaderHandler.cs @@ -0,0 +1,9 @@ +using System.Buffers; + +namespace Toolkit.Foundation; + +public abstract class SerialReaderHandler : + IAsyncHandler> where TRead : class +{ + public abstract Task> Handle(TRead args, CancellationToken cancellationToken = default); +} \ No newline at end of file