internal static async Task <TAPProperties> GetTAPPropertiesAsync(BluetoothLEDevice d)
        {
            GattCharacteristic tapData     = null;
            GattCharacteristic tapMouse    = null;
            GattCharacteristic nusRx       = null;
            GattCharacteristic nusTx       = null;
            GattCharacteristic airGestures = null;
            GattCharacteristic uiCommands  = 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)
                    {
                        TAPManagerLog.Instance.Log(TAPManagerLogEvent.Info, String.Format("Found Characteristic {0} for Service {1}", TAPGuids.GetCharacteristicNameByGUID(ch.Uuid), TAPGuids.GetServiceNameByGUID(ser.Uuid)));
                        if (ch.Uuid == TAPGuids.characteristic_tapdata)
                        {
                            tapData = ch;
                        }
                        else if (ch.Uuid == TAPGuids.characteristic_mousedata)
                        {
                            tapMouse = ch;
                        }
                        else if (ch.Uuid == TAPGuids.characteristic_airgesturesdata)
                        {
                            airGestures = ch;
                        }
                        else if (ch.Uuid == TAPGuids.characteristic_uicommands)
                        {
                            uiCommands = ch;
                        }
                    }
                }

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

                    foreach (GattCharacteristic ch in nusCharacteristicsResult.Characteristics)
                    {
                        TAPManagerLog.Instance.Log(TAPManagerLogEvent.Info, String.Format("Found Characteristic {0} for Service {1}", TAPGuids.GetCharacteristicNameByGUID(ch.Uuid), TAPGuids.GetServiceNameByGUID(ser.Uuid)));
                        if (ch.Uuid == TAPGuids.characteristic_rx)
                        {
                            nusRx = ch;
                        }
                        else if (ch.Uuid == TAPGuids.characteristic_tx)
                        {
                            nusTx = ch;
                        }
                    }
                }

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

                    foreach (GattCharacteristic ch in fwCharacteristicsResult.Characteristics)
                    {
                        TAPManagerLog.Instance.Log(TAPManagerLogEvent.Info, String.Format("Found Characteristic {0} for Service {1}", TAPGuids.GetCharacteristicNameByGUID(ch.Uuid), TAPGuids.GetServiceNameByGUID(ser.Uuid)));
                        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, nusTx, uiCommands, airGestures, fwVersion));
        }
        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));
        }