public static byte[] ReadToBytes(GattReadResult result) 
		{
			var data = new byte[result.Value.Length];
			DataReader.FromBuffer(result.Value).ReadBytes(data);
			return data;
		}
Esempio n. 2
0
        internal static async Task <TAPProperties> GetTAPPropertiesAsync(BluetoothLEDevice d)
        {
            GattCharacteristic tapData  = null;
            GattCharacteristic tapMouse = null;
            GattCharacteristic nusRx    = null;
            int fwVersion = 0;

            GattDeviceServicesResult tapServicesResult = await GetServicesAsync(d, 10, 800);

            foreach (GattDeviceService ser in tapServicesResult.Services)
            {
                if (ser.Uuid == TAPGuids.service_tap)
                {
                    GattCharacteristicsResult tapCharacteristicsResult = await GetCharacteristicsAsync(ser, 10, 800);

                    foreach (GattCharacteristic ch in tapCharacteristicsResult.Characteristics)
                    {
                        if (ch.Uuid == TAPGuids.characteristic_tapdata)
                        {
                            tapData = ch;
                        }
                        else if (ch.Uuid == TAPGuids.characteristic_mousedata)
                        {
                            tapMouse = ch;
                        }
                    }
                }

                if (ser.Uuid == TAPGuids.service_nus)
                {
                    GattCharacteristicsResult nusCharacteristicsResult = await GetCharacteristicsAsync(ser, 10, 800);

                    foreach (GattCharacteristic ch in nusCharacteristicsResult.Characteristics)
                    {
                        if (ch.Uuid == TAPGuids.characteristic_rx)
                        {
                            nusRx = ch;
                        }
                    }
                }

                if (ser.Uuid == TAPGuids.service_device_information)
                {
                    GattCharacteristicsResult fwCharacteristicsResult = await GetCharacteristicsAsync(ser, 10, 800);

                    foreach (GattCharacteristic ch in fwCharacteristicsResult.Characteristics)
                    {
                        if (ch.Uuid == TAPGuids.characteristic_fw_version)
                        {
                            GattReadResult fwRead = await ch.ReadValueAsync();

                            if (fwRead.Status == GattCommunicationStatus.Success)
                            {
                                DataReader reader = DataReader.FromBuffer(fwRead.Value);
                                string     str    = reader.ReadString(fwRead.Value.Length);
                                fwVersion = VersionNumber.FromString(str);
                            }
                        }
                    }
                }
            }

            return(new TAPProperties(tapData, tapMouse, nusRx, fwVersion));
        }
        private async void ReadBattery()
        {
            if (pairedGamepad != null && batteryCharacteristic != null)
            {
                if (pairedGamepad.ConnectionStatus == BluetoothConnectionStatus.Connected)
                {
                    GattReadResult result = await batteryCharacteristic.ReadValueAsync();

                    if (result.Status == GattCommunicationStatus.Success)
                    {
                        var    reader = DataReader.FromBuffer(result.Value);
                        int    val    = reader.ReadByte();
                        string notify = val.ToString() + "% - " + pairedGamepad.Name;
                        notifyIcon.Text = "XBatteryStatus: " + notify;
                        if (val < 5)
                        {
                            notifyIcon.Icon = Properties.Resources.icon00;
                        }
                        else if (val < 15)
                        {
                            notifyIcon.Icon = Properties.Resources.icon10;
                        }
                        else if (val < 25)
                        {
                            notifyIcon.Icon = Properties.Resources.icon20;
                        }
                        else if (val < 35)
                        {
                            notifyIcon.Icon = Properties.Resources.icon30;
                        }
                        else if (val < 45)
                        {
                            notifyIcon.Icon = Properties.Resources.icon40;
                        }
                        else if (val < 55)
                        {
                            notifyIcon.Icon = Properties.Resources.icon50;
                        }
                        else if (val < 65)
                        {
                            notifyIcon.Icon = Properties.Resources.icon60;
                        }
                        else if (val < 75)
                        {
                            notifyIcon.Icon = Properties.Resources.icon70;
                        }
                        else if (val < 85)
                        {
                            notifyIcon.Icon = Properties.Resources.icon80;
                        }
                        else if (val < 95)
                        {
                            notifyIcon.Icon = Properties.Resources.icon90;
                        }
                        else
                        {
                            notifyIcon.Icon = Properties.Resources.icon100;
                        }

                        if ((lastBattery > 15 && val <= 15) || (lastBattery > 10 && val <= 10) || (lastBattery > 5 && val <= 5))
                        {
                            new ToastContentBuilder().AddText("Low Battery").AddText(notify)
                            .Show();
                        }
                        lastBattery = val;
                    }
                }
            }
        }
Esempio n. 4
0
        /// <summary>
        /// This function reads data from the specific BLE characteristic
        /// </summary>
        /// <param name="param"></param>
        public async Task <ERROR_CODE> ReadCharacteristic(string devName, string param)
        {
            ERROR_CODE task_result = ERROR_CODE.UNKNOWN_ERROR;

            try
            {
                if (ConnnectionStatus(devName) != ERROR_CODE.BLE_CONNECTED)
                {
                    task_result = ERROR_CODE.BLE_NO_CONNECTED;
                    Console.WriteLine("No BLE device connected.");
                    return(task_result);
                }
                if (string.IsNullOrEmpty(param))
                {
                    task_result = ERROR_CODE.CMD_WRONG_PARAMETER;
                    Console.WriteLine("Nothing to read, please specify characteristic name or #.");
                    return(task_result);
                }

                List <BluetoothLEAttributeDisplay> chars = new List <BluetoothLEAttributeDisplay>();

                string charName = string.Empty;
                var    parts    = param.Split('/');
                // Do we have parameter is in "service/characteristic" format?
                if (parts.Length == 2)
                {
                    string serviceName = Utilities.GetIdByNameOrNumber(_services, parts[0]);
                    charName = parts[1];

                    // If device is found, connect to device and enumerate all services
                    if (!string.IsNullOrEmpty(serviceName))
                    {
                        var attr = _services.FirstOrDefault(s => s.Name.Equals(serviceName));
                        IReadOnlyList <GattCharacteristic> characteristics = new List <GattCharacteristic>();

                        try
                        {
                            // Ensure we have access to the device.
                            var accessStatus = await attr.service.RequestAccessAsync();

                            if (accessStatus == DeviceAccessStatus.Allowed)
                            {
                                var result = await attr.service.GetCharacteristicsAsync(BluetoothCacheMode.Uncached);

                                if (result.Status == GattCommunicationStatus.Success)
                                {
                                    characteristics = result.Characteristics;
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine($"READ_EXCEPTION_2. Can't read characteristics: {ex.Message}");
                            task_result = ERROR_CODE.READ_EXCEPTION_2;
                        }

                        foreach (var c in characteristics)
                        {
                            chars.Add(new BluetoothLEAttributeDisplay(c));
                        }
                    }
                }
                else if (parts.Length == 1)
                {
                    if (_selectedService == null)
                    {
                        Console.WriteLine("No service is selected.");
                        task_result = ERROR_CODE.NO_SELECTED_SERVICE;
                    }
                    chars    = new List <BluetoothLEAttributeDisplay>(_characteristics);
                    charName = parts[0];
                }

                // Read characteristic
                if (chars.Count == 0)
                {
                    Console.WriteLine("No Characteristics");
                    task_result = ERROR_CODE.READ_NOTHING_TO_READ;
                    return(task_result);
                }
                if (chars.Count > 0 && !string.IsNullOrEmpty(charName))
                {
                    string useName = Utilities.GetIdByNameOrNumber(chars, charName);
                    var    attr    = chars.FirstOrDefault(c => c.Name.Equals(useName));
                    if (attr != null && attr.characteristic != null)
                    {
                        // Read characteristic value
                        GattReadResult result = await attr.characteristic.ReadValueAsync(BluetoothCacheMode.Uncached);

                        if (result.Status == GattCommunicationStatus.Success)
                        {
                            Console.WriteLine(Utilities.FormatValue(result.Value, _dataFormat));
                            _resultCharacteristic = Utilities.FormatValue(result.Value, _dataFormat);
                            task_result           = ERROR_CODE.NONE;
                        }
                        else
                        {
                            Console.WriteLine($"Read failed: {result.Status}");
                            task_result = ERROR_CODE.READ_FAIL;
                        }
                    }
                    else
                    {
                        Console.WriteLine($"Invalid characteristic {charName}");
                        task_result = ERROR_CODE.READ_INVALID_CHARACTERISTIC;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"READ_EXCEPTION_1. Can't read characteristics: {ex.Message}");
                task_result = ERROR_CODE.READ_EXCEPTION_1;
            }
            return(task_result);
        }