diff --git a/BrickController2/BrickController2/DeviceManagement/DI/DeviceManagementModule.cs b/BrickController2/BrickController2/DeviceManagement/DI/DeviceManagementModule.cs index f9e9d3741..24c17c5c5 100644 --- a/BrickController2/BrickController2/DeviceManagement/DI/DeviceManagementModule.cs +++ b/BrickController2/BrickController2/DeviceManagement/DI/DeviceManagementModule.cs @@ -11,13 +11,11 @@ public class DeviceManagementModule : Module protected override void Load(ContainerBuilder builder) { builder.RegisterType().As().SingleInstance(); - builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().SingleInstance(); - builder.RegisterType().Keyed(DeviceType.Infrared); builder.RegisterType().Keyed(DeviceType.CircuitCubes); builder.RegisterType().Keyed(DeviceType.PfxBrick); diff --git a/BrickController2/BrickController2/DeviceManagement/DeviceFactoryData.cs b/BrickController2/BrickController2/DeviceManagement/DeviceFactoryData.cs index cd94e88f2..72183f18b 100644 --- a/BrickController2/BrickController2/DeviceManagement/DeviceFactoryData.cs +++ b/BrickController2/BrickController2/DeviceManagement/DeviceFactoryData.cs @@ -19,6 +19,7 @@ public DeviceFactoryData(TVendor vendor, string name, string address, byte[] dev public DeviceType DeviceType => TDevice.Type; + public bool IsAvailable => Vendor.IsAvailable; public TVendor Vendor { get; } public string Name { get; } public string Address { get; } diff --git a/BrickController2/BrickController2/DeviceManagement/DeviceManager.cs b/BrickController2/BrickController2/DeviceManagement/DeviceManager.cs index e542dccb8..0202ce5e7 100644 --- a/BrickController2/BrickController2/DeviceManagement/DeviceManager.cs +++ b/BrickController2/BrickController2/DeviceManagement/DeviceManager.cs @@ -1,4 +1,5 @@ -using BrickController2.Helpers; +using BrickController2.DeviceManagement.InfraredDevice; +using BrickController2.Helpers; using BrickController2.UI.Services.MainThread; using Microsoft.Extensions.Logging; using System; @@ -12,7 +13,6 @@ namespace BrickController2.DeviceManagement internal class DeviceManager : NotifyPropertyChangedSource, IDeviceManager { private readonly IBluetoothDeviceManager _bluetoothDeviceManager; - private readonly IInfraredDeviceManager _infraredDeviceManager; private readonly IDeviceRepository _deviceRepository; private readonly DeviceFactory _deviceFactory; private readonly IMainThreadService _uiThreadService; @@ -25,14 +25,12 @@ internal class DeviceManager : NotifyPropertyChangedSource, IDeviceManager public DeviceManager( IBluetoothDeviceManager bluetoothDeviceManager, - IInfraredDeviceManager infraredDeviceManager, IDeviceRepository deviceRepository, DeviceFactory deviceFactory, IMainThreadService uiThreadService, ILogger logger) { _bluetoothDeviceManager = bluetoothDeviceManager; - _infraredDeviceManager = infraredDeviceManager; _deviceRepository = deviceRepository; _deviceFactory = deviceFactory; _uiThreadService = uiThreadService; @@ -88,12 +86,7 @@ public async Task ScanAsync(CancellationToken token) try { - var infraScan = _infraredDeviceManager.ScanAsync(CreateDeviceAsync!, token); - var bluetoothScan = _bluetoothDeviceManager.ScanAsync(CreateDeviceAsync!, token); - - await Task.WhenAll(infraScan, bluetoothScan); - - return infraScan.Result && bluetoothScan.Result; + return await _bluetoothDeviceManager.ScanAsync(CreateDeviceAsync!, token); } catch (Exception) { diff --git a/BrickController2/BrickController2/DeviceManagement/IDeviceFactoryData.cs b/BrickController2/BrickController2/DeviceManagement/IDeviceFactoryData.cs index 5af67008b..4441d3d4d 100644 --- a/BrickController2/BrickController2/DeviceManagement/IDeviceFactoryData.cs +++ b/BrickController2/BrickController2/DeviceManagement/IDeviceFactoryData.cs @@ -5,6 +5,7 @@ namespace BrickController2.DeviceManagement { public interface IDeviceFactoryData { + bool IsAvailable { get; } DeviceType DeviceType { get; } string Name { get; } string Address { get; } diff --git a/BrickController2/BrickController2/DeviceManagement/IInfraredDeviceManager.cs b/BrickController2/BrickController2/DeviceManagement/InfraRedDevice/IInfraredDeviceManager.cs similarity index 70% rename from BrickController2/BrickController2/DeviceManagement/IInfraredDeviceManager.cs rename to BrickController2/BrickController2/DeviceManagement/InfraRedDevice/IInfraredDeviceManager.cs index 9602ba020..015ce1d49 100644 --- a/BrickController2/BrickController2/DeviceManagement/IInfraredDeviceManager.cs +++ b/BrickController2/BrickController2/DeviceManagement/InfraRedDevice/IInfraredDeviceManager.cs @@ -1,8 +1,8 @@ using System.Threading.Tasks; -namespace BrickController2.DeviceManagement +namespace BrickController2.DeviceManagement.InfraredDevice { - internal interface IInfraredDeviceManager : IDeviceScanner + internal interface IInfraredDeviceManager { Task ConnectDevice(InfraredDevice device); Task DisconnectDevice(InfraredDevice device); diff --git a/BrickController2/BrickController2/DeviceManagement/InfraRedDevice/InfraRedDeviceVendor.cs b/BrickController2/BrickController2/DeviceManagement/InfraRedDevice/InfraRedDeviceVendor.cs new file mode 100644 index 000000000..30a648f58 --- /dev/null +++ b/BrickController2/BrickController2/DeviceManagement/InfraRedDevice/InfraRedDeviceVendor.cs @@ -0,0 +1,36 @@ +using Autofac; +using BrickController2.DeviceManagement.DI; +using BrickController2.DeviceManagement.Vendors; +using BrickController2.PlatformServices.Infrared; + +namespace BrickController2.DeviceManagement.InfraredDevice; + +/// +/// fake Vendor for infrared devices +/// +internal class InfraRedDeviceVendor : Vendor +{ + private IInfraredService? _infraredService; + + public override string VendorName => "IRDevice"; + + public override bool IsAvailable => _infraredService != null && _infraredService.IsInfraredSupported && _infraredService.IsCarrierFrequencySupported(InfraredDeviceManager.IR_FREQUENCY); + + protected override void Register(VendorBuilder builder) + { + // device manager + builder.ContainerBuilder.RegisterType().As().SingleInstance(); + + builder.ContainerBuilder.RegisterBuildCallback(scope => + { + _infraredService = scope.Resolve(); + }); + + // manually added devices + builder.RegisterDevice() + .WithDeviceFactory("0", "PF Infra 1") + .WithDeviceFactory("1", "PF Infra 2") + .WithDeviceFactory("2", "PF Infra 3") + .WithDeviceFactory("3", "PF Infra 4"); + } +} diff --git a/BrickController2/BrickController2/DeviceManagement/InfraredDevice.cs b/BrickController2/BrickController2/DeviceManagement/InfraRedDevice/InfraredDevice.cs similarity index 84% rename from BrickController2/BrickController2/DeviceManagement/InfraredDevice.cs rename to BrickController2/BrickController2/DeviceManagement/InfraRedDevice/InfraredDevice.cs index 03ecd0f1f..2bf58b406 100644 --- a/BrickController2/BrickController2/DeviceManagement/InfraredDevice.cs +++ b/BrickController2/BrickController2/DeviceManagement/InfraRedDevice/InfraredDevice.cs @@ -3,9 +3,9 @@ using System.Threading; using System.Threading.Tasks; -namespace BrickController2.DeviceManagement +namespace BrickController2.DeviceManagement.InfraredDevice { - internal class InfraredDevice : Device + internal class InfraredDevice : Device, IDeviceType { private readonly IInfraredDeviceManager _infraredDeviceManager; @@ -15,7 +15,10 @@ public InfraredDevice(string name, string address, byte[] deviceData, IInfraredD _infraredDeviceManager = infraredDeviceManager; } - public override DeviceType DeviceType => DeviceType.Infrared; + public static DeviceType Type => DeviceType.Infrared; + + public static string TypeName => "InfraredDevice"; + public override DeviceType DeviceType => Type; public override int NumberOfChannels => 2; public override async Task ConnectAsync( diff --git a/BrickController2/BrickController2/DeviceManagement/InfraredDeviceManager.cs b/BrickController2/BrickController2/DeviceManagement/InfraRedDevice/InfraredDeviceManager.cs similarity index 88% rename from BrickController2/BrickController2/DeviceManagement/InfraredDeviceManager.cs rename to BrickController2/BrickController2/DeviceManagement/InfraRedDevice/InfraredDeviceManager.cs index 2b2cd24eb..3fc859b34 100644 --- a/BrickController2/BrickController2/DeviceManagement/InfraredDeviceManager.cs +++ b/BrickController2/BrickController2/DeviceManagement/InfraRedDevice/InfraredDeviceManager.cs @@ -4,11 +4,11 @@ using BrickController2.PlatformServices.Infrared; using BrickController2.Helpers; -namespace BrickController2.DeviceManagement +namespace BrickController2.DeviceManagement.InfraredDevice { internal class InfraredDeviceManager : IInfraredDeviceManager { - private const int IR_FREQUENCY = 38000; + public const int IR_FREQUENCY = 38000; private const int IR_MARK_US = 158; private const int IR_START_GAP_US = 1026; @@ -34,27 +34,6 @@ public InfraredDeviceManager(IInfraredService infraredService) _infraredService = infraredService; } - public async Task ScanAsync(Func deviceFoundCallback, CancellationToken token) - { - using (await _asyncLock.LockAsync()) - { - if (_infraredService.IsInfraredSupported && _infraredService.IsCarrierFrequencySupported(IR_FREQUENCY)) - { - for (int i = 0; i < 4; i++) - { - if (token.IsCancellationRequested) - { - break; - } - - await deviceFoundCallback(DeviceType.Infrared, $"PF Infra {i + 1}", $"{i}", null); - } - } - } - - return true; - } - public async Task ConnectDevice(InfraredDevice device) { using (await _asyncLock.LockAsync()) diff --git a/BrickController2/BrickController2/DeviceManagement/Vendors/Vendor.cs b/BrickController2/BrickController2/DeviceManagement/Vendors/Vendor.cs index 76cd92c49..24fd0b357 100644 --- a/BrickController2/BrickController2/DeviceManagement/Vendors/Vendor.cs +++ b/BrickController2/BrickController2/DeviceManagement/Vendors/Vendor.cs @@ -12,6 +12,8 @@ public abstract class Vendor : Module, IVendorModule { public abstract string VendorName { get; } + public virtual bool IsAvailable => true; + protected abstract void Register(VendorBuilder builder); protected sealed override void Load(ContainerBuilder builder) diff --git a/BrickController2/BrickController2/UI/ViewModels/ManualDeviceListPageViewModel.cs b/BrickController2/BrickController2/UI/ViewModels/ManualDeviceListPageViewModel.cs index ddf253ca1..627f0425c 100644 --- a/BrickController2/BrickController2/UI/ViewModels/ManualDeviceListPageViewModel.cs +++ b/BrickController2/BrickController2/UI/ViewModels/ManualDeviceListPageViewModel.cs @@ -56,6 +56,7 @@ public ManualDeviceListPageViewModel( var groups = manualDeviceManager.FactoryDataList // apply ordering per vendor and device type + .Where(o => o.IsAvailable) .OrderBy(o => o.VendorName) .ThenBy(o => o.DeviceTypeName) .GroupBy(o => (o.VendorName, o.DeviceType, o.DeviceTypeName), x => new DeviceEntry(x, GetDeviceInstance(x)));