Пример #1
0
        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);
        }
Пример #2
0
        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);
        }