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; })); }
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); });
/// <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());
public abstract IObservable <bool> SetNotificationValue(CharacteristicConfigDescriptorValue value);