public override IObservable <bool> SetNotificationValue(CharacteristicConfigDescriptorValue value)
        {
            this.AssertNotify();

            return(Observable.FromAsync(async ct =>
            {
                var tcs = new TaskCompletionSource <GattCommunicationStatus>();
                await CoreWindow
                .GetForCurrentThread()
                .Dispatcher
                .RunAsync(
                    CoreDispatcherPriority.Normal,
                    async() =>
                {
                    var desc = GetConfigValue(value);
                    var result = await this.Native.WriteClientCharacteristicConfigurationDescriptorAsync(desc);
                    tcs.TrySetResult(result);
                }
                    );

                var status = await tcs.Task;
                if (status == GattCommunicationStatus.Success)
                {
                    this.context.SetNotifyCharacteristic(this.Native, value != CharacteristicConfigDescriptorValue.None);
                    return true;
                }
                return false;
            }));
        }
Esempio n. 2
0
        public override IObservable <bool> SetNotificationValue(CharacteristicConfigDescriptorValue value)
        {
            this.AssertNotify();

            var enable = value != CharacteristicConfigDescriptorValue.None;

            this.Peripheral.SetNotifyValue(enable, this.NativeCharacteristic);
            return(Observable.Return(true));
        }
        static byte[] GetDescriptionConfigBytes(CharacteristicConfigDescriptorValue value)
        {
            switch (value)
            {
            case CharacteristicConfigDescriptorValue.Indicate:
                return(BluetoothGattDescriptor.EnableIndicationValue.ToArray());

            case CharacteristicConfigDescriptorValue.Notify:
                return(BluetoothGattDescriptor.EnableNotificationValue.ToArray());

            case CharacteristicConfigDescriptorValue.None:
            default:
                return(BluetoothGattDescriptor.DisableNotificationValue.ToArray());
            }
        }
        static GattClientCharacteristicConfigurationDescriptorValue GetConfigValue(CharacteristicConfigDescriptorValue value)
        {
            switch (value)
            {
            case CharacteristicConfigDescriptorValue.Indicate:
                return(GattClientCharacteristicConfigurationDescriptorValue.Indicate);

            case CharacteristicConfigDescriptorValue.Notify:
                return(GattClientCharacteristicConfigurationDescriptorValue.Notify);

            case CharacteristicConfigDescriptorValue.None:
                return(GattClientCharacteristicConfigurationDescriptorValue.None);

            default:
                throw new ArgumentException("Invalid characteristic config descriptor value");
            }
        }
        public override IObservable <bool> SetNotificationValue(CharacteristicConfigDescriptorValue value)
        => Observable.FromAsync(async ct =>
        {
            var enable     = value != CharacteristicConfigDescriptorValue.None;
            var descriptor = this.native.GetDescriptor(NotifyDescriptorId);
            if (descriptor == null)
            {
                throw new ArgumentException("Characteristic Client Configuration Descriptor not found");
            }

            var wrap    = new GattDescriptor(this, this.context, descriptor);
            var success = this.context.Gatt.SetCharacteristicNotification(this.native, enable);
            await Task.Delay(250, ct);

            if (success)
            {
                await wrap.Write(GetDescriptionConfigBytes(value));
                this.IsNotifying = enable;
            }
            return(success);
        });
Esempio n. 6
0
 /// <summary>
 /// Registers for notifications and subscribes to them
 /// </summary>
 /// <param name="characteristic"></param>
 /// <param name="value"></param>
 /// <returns></returns>
 public static IObservable <CharacteristicResult> RegisterAndNotify(this IGattCharacteristic characteristic, CharacteristicConfigDescriptorValue value = CharacteristicConfigDescriptorValue.Notify)
 => characteristic
 .SetNotificationValue(value)
 .Where(x => x)
 .Select(x => characteristic.WhenNotificationReceived())
 .Switch()
 .Finally(() => characteristic.SetNotificationValue(CharacteristicConfigDescriptorValue.None).Subscribe());
Esempio n. 7
0
 public abstract IObservable <bool> SetNotificationValue(CharacteristicConfigDescriptorValue value);