| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | using BluetoothLENet;using InABox.Core;namespace InABox.Avalonia.Platform.Desktop;public class Desktop_Bluetooth : IBluetooth, IDisposable{    public Logger? Logger { get; set; }    private BLE _adapter;        public Action<IBluetoothDevice>? DeviceFound { get; set; }    public CoreObservableCollection<IBluetoothDevice> Devices { get; } = new();    public event EventHandler? Changed;        public Desktop_Bluetooth()    {        Devices.CollectionChanged += (_,_) => Changed?.Invoke(this, EventArgs.Empty);                _adapter = new BLE();        _adapter.Changed += (_,_) =>        {            var found = _adapter.Devices.Select(x => x.MacAddress).ToArray();            var cache = Devices.OfType<Desktop_BluetoothDevice>().Select(x => x.ID).ToArray();            if (found.Except(cache).Any() || cache.Except(found).Any())            {                var devices = _adapter.Devices                    .ToArray()                    .Select(x => new Desktop_BluetoothDevice(x));                Devices.ReplaceRange(devices);            }        };    }    public async Task<bool> IsAvailable()    {        return await Task.FromResult(true);       }        public async Task<bool> StartScanningAsync(Guid configServiceId)    {        if (await IsAvailable())            return await _adapter.StartScanningAsync(configServiceId);        return false;    }    public async Task<bool> StopScanningAsync()    {        if (await IsAvailable())            return await _adapter.StopScanningAsync();        return false;    }    public async Task<IConnectedBluetoothDevice?> Connect(IBluetoothDevice device)    {        if (await IsAvailable())        {            if (device is Desktop_BluetoothDevice d)            {                var result = await _adapter.Connect(d.Device);                if (result == ConnectDeviceResult.Ok)                    return new Desktop_ConnectedBluetoothDevice(d.Device);            }        }        return null;            }    public async Task<bool> Disconnect(IConnectedBluetoothDevice device)    {        if (await IsAvailable())        {            if (device is Desktop_BluetoothDevice { Device: not null } d)            {                _adapter.Disconnect(d.Device);            }        }        return true;    }    public void Dispose()    {        foreach (var device in Devices)            device.Dispose();        Devices.Clear();    }}
 |