protected virtual void OnWatcherEventReached(BtleWatcherEventsArgs e)
        {
            // Fire the event
            EventHandler <BtleWatcherEventsArgs> handler = WacherEvent;

            handler?.Invoke(this, e);
        }
        public void InitializeBtleWatcher(string aqsFilter)
        {
            if (Watcher != null)
            {
                return;
            }

            ResultCollection.Clear();

            Debug.WriteLine("BTLEWatcher aqsFilter: " + aqsFilter);


            ////////////////////////////////////////////////////////////////
            // Create the Watcher for the BTLE - GATT_STREAM_SERVICE_UUID //
            ////////////////////////////////////////////////////////////////
            // List of additional properties
            // https://msdn.microsoft.com/en-us/windows/uwp/devices-sensors/device-information-properties
            Watcher = DeviceInformation.CreateWatcher(aqsFilter);       // An AQS string that filters the DeviceInformation objects to enumerate


            /////////////////////////////////////////////////////////////////////////
            // Hook up handlers for the watcher events before starting the watcher //
            /////////////////////////////////////////////////////////////////////////

            ///////////
            // Added //
            ///////////
            _handlerAdded = async(watcher, deviceInfo) =>
            {
                // Since we have the collection databound to a UI element, we need to update the collection on the UI thread.
                await RootPage.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
                {
                    // Check for duplicate entry
                    var isDuplicate = ResultCollection.Any(bleInfoDisp => deviceInfo.Id == bleInfoDisp.Id);
                    if (isDuplicate)
                    {
                        return;
                    }

                    // DeviceID W4 - \\?\BTHLEDevice#{151c0000-4580-4111-9ca1-5056f3454fbc}_f7a30813de8a#6&2e59d2a&f9&000c#{6e3bb679-4372-40c8-9eaa-4509df260cd8}
                    Debug.WriteLine(Name + " - " + deviceInfo.Id);
                    ResultCollection.Add(new DeviceInformationDisplay(deviceInfo));

                    //MainPage.Debug_DisplayDeviceParams( deviceInfo, ResultCollection.Count );

                    RootPage.NotifyUser(string.Format(Name + "-{0} devices found.", ResultCollection.Count), NotifyType.StatusMessage);

                    // Fire Event
                    var args = new BtleWatcherEventsArgs
                    {
                        Event       = WatcherEvents.Added,
                        TimeReached = DateTime.Now
                    };
                    OnWatcherEventReached(args);
                });
            };
            Watcher.Added += _handlerAdded;


            /////////////
            // Updated //
            /////////////
            _handlerUpdated = async(watcher, deviceInfoUpdate) =>
            {
                // Since we have the collection databound to a UI element, we need to update the collection on the UI thread.
                await RootPage.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
                {
                    // Find the corresponding updated DeviceInformation in the collection and pass the update object
                    // to the Update method of the existing DeviceInformation. This automatically updates the object for us.
                    foreach (DeviceInformationDisplay deviceInfoDisp in ResultCollection)
                    {
                        if (deviceInfoDisp.Id != deviceInfoUpdate.Id)
                        {
                            continue;
                        }

                        deviceInfoDisp.Update(deviceInfoUpdate, Name);
                        break;
                    }

                    // Fire Event
                    var args = new BtleWatcherEventsArgs
                    {
                        Event       = WatcherEvents.Updated,
                        TimeReached = DateTime.Now
                    };
                    OnWatcherEventReached(args);
                });
            };
            Watcher.Updated += _handlerUpdated;


            /////////////
            // Removed //
            /////////////
            _handlerRemoved = async(watcher, deviceInfoUpdate) =>
            {
                // Since we have the collection databound to a UI element, we need to update the collection on the UI thread.
                await RootPage.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
                {
                    // Find the corresponding DeviceInformation in the collection and remove it
                    foreach (DeviceInformationDisplay deviceInfoDisp in ResultCollection)
                    {
                        if (deviceInfoDisp.Id != deviceInfoUpdate.Id)
                        {
                            continue;
                        }

                        if (ResultCollection.Contains(deviceInfoDisp))
                        {
                            ResultCollection.Remove(deviceInfoDisp);
                        }
                        break;
                    }

                    RootPage.NotifyUser(string.Format(Name + "-{0} devices found.", ResultCollection.Count), NotifyType.StatusMessage);

                    // Fire Event
                    var args = new BtleWatcherEventsArgs
                    {
                        Event       = WatcherEvents.Removed,
                        TimeReached = DateTime.Now
                    };
                    OnWatcherEventReached(args);
                });
            };
            Watcher.Removed += _handlerRemoved;


            //////////////////////////
            // EnumerationCompleted //
            //////////////////////////
            _handlerEnumCompleted = async(watcher, obj) =>
            {
                await RootPage.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
                {
                    EnumCompleted = true;
                    Debug.WriteLine(Name + " Enumeration completed: {0} devices found .... Watching for updates...", ResultCollection.Count);
                    RootPage.NotifyUser(string.Format(Name + "-{0} devices found.\n{1}-Enumeration completed.\n{1}-Watching for updates...", ResultCollection.Count, Name), NotifyType.StatusMessage);
                    Utility.VibratePhone();

                    // Fire Event
                    var args = new BtleWatcherEventsArgs
                    {
                        Event       = WatcherEvents.EnumerationCompleted,
                        TimeReached = DateTime.Now
                    };
                    OnWatcherEventReached(args);
                });
            };
            Watcher.EnumerationCompleted += _handlerEnumCompleted;


            /////////////
            // Stopped //
            /////////////
            _handlerStopped = async(watcher, obj) =>
            {
                await RootPage.Dispatcher.RunAsync(CoreDispatcherPriority.Low, () =>
                {
                    RootPage.NotifyUser(string.Format(Name + "-{0} devices found. Watcher {1}.",
                                                      ResultCollection.Count, DeviceWatcherStatus.Aborted == watcher.Status ? "aborted" : "stopped"),
                                        NotifyType.StatusMessage);

                    // Fire Event
                    var args = new BtleWatcherEventsArgs
                    {
                        Event       = WatcherEvents.Stopped,
                        TimeReached = DateTime.Now
                    };
                    OnWatcherEventReached(args);
                });
            };
            Watcher.Stopped += _handlerStopped;
        }