public string RemoveDevice(string UniqueKey)
        {
            lock (Controllers)
            {
                //Console.WriteLine($"Removing {UniqueKey}");
                if (Controllers.ContainsKey(UniqueKey))
                {
                    FlydigiController ctrl = Controllers[UniqueKey];
                    string            UniqueControllerId = ctrl.ConnectionUniqueID;

                    ctrl.DeInitalize();
                    ctrl.Dispose();
                    Controllers.Remove(UniqueKey);

                    return(UniqueControllerId);
                }
            }
            return(null);
        }
        public IController NewDevice(IDevice device)
        {
            HidDevice    _device  = device as HidDevice;
            XInputDevice _deviceX = device as XInputDevice;

            if (_device == null && _deviceX == null)
            {
                return(null);
            }

            // TODO this check system should only run if FullControl mode is enabled
            //      this is all irrelevent if we have a system where we can get the true ProductName, VID, and PID of the XInput controller
            //      if we ever gain access to that info, we will have to make sure the below logic is still present for if the XInput provider
            //      doesn't have that info (check presence of Properties perhapse?)
            //      It might be simpler to keep the XInputDevice handling as is if the VID/PID/ProductName are null but if they are known immediately rumble
            //      In this design, if we see a HID device for the controller and we want to correct it, we'd start a count-down and if we didn't see any XInput
            //      devices we could manually trigger within that time (inlcuding one that came through just ahead) we'd force run over all the memorized ones
            //      Note that for some reason this doesn't work properly for an APEX2 on USB, it switches right back to XInput again.
            if (_device != null)
            {
                if (device.VendorId == 0x045E && device.ProductId == 0x028E)
                {
                    if (this.AccessMode != AccessMode.FullControl)
                    {
                        return(null);
                    }

                    if (device.Properties["ProductName"] == "Controller (Flydigi 2.4G x360)" ||
                        device.Properties["ProductName"] == "Controller (Flydigi 2.4G Android)") // APEX2 on USB does this for some reason
                    {
                        lock (CandidateXInputLock)
                            SawCandidateHidDeviceForXInput = DateTime.UtcNow;
                        CheckXInputData();
                    }
                    return(null);
                }
            }
            else if (_deviceX != null)
            {
                if (this.AccessMode != AccessMode.FullControl)
                {
                    return(null);
                }

                lock (CandidateXInputLock)
                {
                    CandidateXInputDevicesX[(byte)_deviceX.UserIndex]        = new WeakReference <XInputDevice>(_deviceX);
                    CandidateXInputDevicesLastSeen[(byte)_deviceX.UserIndex] = DateTime.UtcNow;
                }
                CheckXInputData();
                return(null);
            }

            // if we are in full control mode, check for xbox here and if it is a flydigi controller send the command that changes the mode here and return null

            if (_device.VendorId == FlydigiController.VENDOR_FLYDIGI)
            {
                if (!new int[] {
                    FlydigiController.PRODUCT_FLYDIGI_DONGLE_1,
                    FlydigiController.PRODUCT_FLYDIGI_DONGLE_2,
                    FlydigiController.PRODUCT_FLYDIGI_DONGLE_3,
                    FlydigiController.PRODUCT_FLYDIGI_USB,
                }.Contains(_device.ProductId))
                {
                    return(null);
                }
            }
            else
            {
                return(null);
            }

            //string bt_hid_id = @"00001124-0000-1000-8000-00805f9b34fb";

            string devicePath = _device.DevicePath.ToString();

            uint[]          Usages  = device.Properties.ContainsKey("Usages") ? device.Properties["Usages"] as uint[] : null;
            EConnectionType ConType = EConnectionType.Unknown;

            switch (_device.VendorId)
            {
            case FlydigiController.VENDOR_FLYDIGI:
                if (_device.Properties.ContainsKey("ProductName") && (((_device.Properties["ProductName"] as string)?.ToLowerInvariant()?.Contains("flydigi") ?? false) || ((_device.Properties["ProductName"] as string)?.ToLowerInvariant()?.Contains("feizhi") ?? false)))
                {
                    //&& devicePath.Contains("mi_02")
                    if (Usages.Contains(0xffa00001u))
                    {
                    }
                    else
                    {
                        return(null);
                    }
                    //if (devicePath.Contains(bt_hid_id))
                    //{
                    //    ConType = EConnectionType.Bluetooth;
                    //}
                    //else
                    //{
                    //    ConType = EConnectionType.USB;
                    //}
                }
                //else if (_device.ProductId == FlydigiController.PRODUCT_FLYDIGI_USB && devicePath.Contains("mi_00"))
                //{
                //
                //}
                else
                {
                    return(null);
                }
                break;
            }

            lock (Controllers)
            {
                FlydigiController ctrl = new FlydigiController(_device, ConType);
                Controllers[_device.UniqueKey] = ctrl;
                //Console.WriteLine($"Controllers[\"{_device.UniqueKey}\"] = {ctrl};");
                return(ctrl);
            }
        }