public Task <byte[]> WriteValue(string characteristicGuid, byte[] data, bool overrideExistingQueue = false) { var cbuuid = CBUUID.FromString(characteristicGuid); // TODO: Check for connected devices? if (_characteristics.ContainsKey(cbuuid) == false) { // TODO Error? return(null); } byte[] dataCopy = null; if (data != null) { dataCopy = new byte[data.Length]; Array.Copy(data, dataCopy, data.Length); } if (OWBoard.SerialWriteUUID.Equals(characteristicGuid, StringComparison.InvariantCultureIgnoreCase) == false && OWBoard.SerialReadUUID.Equals(characteristicGuid, StringComparison.InvariantCultureIgnoreCase) == false) { // If our system is little endian, reverse the array. if (BitConverter.IsLittleEndian) { Array.Reverse(dataCopy); } } var characteristic = _characteristics[cbuuid]; var nsData = NSData.FromArray(dataCopy); var taskCompletionSource = new TaskCompletionSource <byte[]>(); CharacteristicValueRequest characteristicValueRequest = new CharacteristicValueRequest(cbuuid, taskCompletionSource, nsData); if (overrideExistingQueue) { _writeQueue.RemoveAll(t => t.CharacteristicId.Equals(cbuuid)); } _writeQueue.Add(characteristicValueRequest); _peripheral.WriteValue(nsData, characteristic, CBCharacteristicWriteType.WithResponse); return(taskCompletionSource.Task); }
public Task <byte[]> WriteValue(string characteristicGuid, byte[] data, bool overrideExistingQueue = false) { Debug.WriteLine($"WriteValue: {characteristicGuid}"); if (_bluetoothGatt == null) { return(null); } if (data.Length > 20) { // TODO: Error, some Android BLE devices do not handle > 20byte packets well. return(null); } var uuid = characteristicGuid.ToLower(); // TODO: Check for connected devices? if (_characteristics.ContainsKey(uuid) == false) { // TODO Error? return(null); } // TODO: Handle this. /* * if (_readQueue.ContainsKey(uuid)) * { * return _readQueue[uuid].Task; * } */ var taskCompletionSource = new TaskCompletionSource <byte[]>(); CharacteristicValueRequest characteristicValueRequest = new CharacteristicValueRequest(uuid, taskCompletionSource, data); if (overrideExistingQueue) { _writeQueue.RemoveAll(t => t.CharacteristicId.Equals(uuid)); } _writeQueue.Add(characteristicValueRequest); byte[] dataBytes = null; if (data != null) { dataBytes = new byte[data.Length]; Array.Copy(data, dataBytes, data.Length); if (OWBoard.SerialWriteUUID.Equals(uuid, StringComparison.InvariantCultureIgnoreCase) == false && OWBoard.SerialReadUUID.Equals(uuid, StringComparison.InvariantCultureIgnoreCase) == false) { // If our system is little endian, reverse the array. if (BitConverter.IsLittleEndian) { Array.Reverse(dataBytes); } } } _gattOperationQueue.Enqueue(new OWBLE_QueueItem(_characteristics[uuid], OWBLE_QueueItemOperationType.Write, dataBytes)); ProcessQueue(); return(taskCompletionSource.Task); }