public void WriteCccd(BleCharacteristic characteristic, BleCccd cccd, BleRequestFlags requestFlags) { Throw.If.Null(characteristic, "characteristic"); BleDescriptor descriptor; if (!characteristic.TryGetDescriptor(BleUuids.Cccd, out descriptor)) { HidSharpDiagnostics.Trace("Characteristic {0} does not have a CCCD, so {1} could not be written.", characteristic, cccd); return; } if (cccd == BleCccd.Notification) { HidSharpDiagnostics.PerformStrictCheck(characteristic.IsNotifiable, "Characteristic doesn't support Notify."); } if (cccd == BleCccd.Indication) { HidSharpDiagnostics.PerformStrictCheck(characteristic.IsIndicatable, "Characteristic doesn't support Indicate."); } var value = new byte[2]; value[0] = (byte)((ushort)cccd >> 0); value[1] = (byte)((ushort)cccd >> 8); WriteDescriptor(descriptor, value); }
public override void WriteCharacteristicWithoutResponse(BleCharacteristic characteristic, byte[] value, int offset, int count, BleRequestFlags requestFlags) { Throw.If.Null(characteristic, "characteristic"); HidSharpDiagnostics.PerformStrictCheck(characteristic.IsWritableWithoutResponse, "Characteristic doesn't support Write Without Response."); var flags = GetGattFlags(requestFlags); WriteCharacteristic(characteristic, value, offset, count, flags | NativeMethods.BLUETOOTH_GATT_FLAGS.WRITE_WITHOUT_RESPONSE); }
public override void WriteCharacteristic(BleCharacteristic characteristic, byte[] value, int offset, int count, BleRequestFlags requestFlags) { Throw.If.Null(characteristic, "characteristic"); HidSharpDiagnostics.PerformStrictCheck(characteristic.IsWritable, "Characteristic doesn't support Write."); var flags = GetGattFlags(requestFlags); WriteCharacteristic(characteristic, value, offset, count, flags); }
public override unsafe byte[] ReadCharacteristic(BleCharacteristic characteristic, BleRequestFlags requestFlags) { Throw.If.Null(characteristic, "characteristic"); HidSharpDiagnostics.PerformStrictCheck(characteristic.IsReadable, "Characteristic doesn't support Read."); var flags = GetGattFlags(requestFlags); HandleAcquireIfOpenOrFail(); try { lock (_readSync) { int error; var wc = (WinBleCharacteristic)characteristic; ushort valueSize; error = NativeMethods.BluetoothGATTGetCharacteristicValue(_handle, ref wc.NativeData, 0, null, out valueSize, flags | ((requestFlags & BleRequestFlags.Cacheable) == 0 ? NativeMethods.BLUETOOTH_GATT_FLAGS.FORCE_READ_FROM_DEVICE : 0)); if (error != NativeMethods.ERROR_MORE_DATA || valueSize < NativeMethods.BTH_LE_GATT_CHARACTERISTIC_VALUE.Size) { var message = string.Format("Failed to read characteristic {0}.", characteristic); throw DeviceException.CreateIOException(Device, message, error); } var cb = stackalloc byte[valueSize]; var cv = (NativeMethods.BTH_LE_GATT_CHARACTERISTIC_VALUE *)cb; ushort valueSize2; error = NativeMethods.BluetoothGATTGetCharacteristicValue(_handle, ref wc.NativeData, valueSize, cv, out valueSize2, flags); if (error != 0 || valueSize != valueSize2 || cv->DataSize > valueSize - NativeMethods.BTH_LE_GATT_CHARACTERISTIC_VALUE.Size) { var message = string.Format("Failed to read characteristic {0}.", characteristic); throw DeviceException.CreateIOException(Device, message, error); } var bytes = new byte[cv->DataSize]; Marshal.Copy((IntPtr)(void *)&cv->Data[0], bytes, 0, checked ((int)cv->DataSize)); return(bytes); } } finally { HandleRelease(); } }