public void CheckForNewControllers()
        {
            CleanUp();

            // move all code for initializing devices here and well as the initial code from Start()
            bool   isLeft = false;
            IntPtr ptr    = HIDapi.hid_enumerate(vendor_id, 0x0);
            //IntPtr top_ptr = ptr;

            hid_device_info enumerate;             // Add device to list
            bool            foundNew = false;

            while (ptr != IntPtr.Zero)
            {
                enumerate = (hid_device_info)Marshal.PtrToStructure(ptr, typeof(hid_device_info));

                if (enumerate.serial_number == null)
                {
                    ptr = enumerate.next;                     // can't believe it took me this long to figure out why USB connections used up so much CPU.
                    // it was getting stuck in an inf loop here!
                    continue;
                }

                if (mActivity.nonOriginal)
                {
                    enumerate.product_id = product_pro;
                }

                bool validController = (enumerate.product_id == product_l || enumerate.product_id == product_r ||
                                        enumerate.product_id == product_pro || enumerate.product_id == product_snes);
                if (validController && !ControllerAlreadyAdded(enumerate.path))
                {
                    switch (enumerate.product_id)
                    {
                    case product_l:
                        isLeft = true;
                        mActivity.AppendTextBox("Left Joy-Con connected.\r\n"); break;

                    case product_r:
                        isLeft = false;
                        mActivity.AppendTextBox("Right Joy-Con connected.\r\n"); break;

                    case product_pro:
                        isLeft = true;
                        mActivity.AppendTextBox("Pro controller connected.\r\n"); break;

                    case product_snes:
                        isLeft = true;
                        mActivity.AppendTextBox("SNES controller connected.\r\n"); break;

                    default:
                        mActivity.AppendTextBox("Non Joy-Con Nintendo input device skipped.\r\n"); break;
                    }

                    IntPtr handle = HIDapi.hid_open_path(enumerate.path);
                    try
                    {
                        HIDapi.hid_set_nonblocking(handle, 1);
                    }
                    catch
                    {
                        mActivity.AppendTextBox("Unable to open path to device - are you using the correct (64 vs 32-bit) version for your PC?\r\n");
                        break;
                    }

                    bool isPro  = enumerate.product_id == product_pro;
                    bool isSnes = enumerate.product_id == product_snes;
                    j.Add(new Joycon(handle, EnableIMU, EnableLocalize & EnableIMU, 0.05f, isLeft, enumerate.path, enumerate.serial_number, j.Count, isPro, isSnes));

                    foundNew = true;
                    j.Last().mActivity = mActivity;

                    if (j.Count < 5)
                    {
                        int ii = -1;
                        foreach (Button v in mActivity.con)
                        {
                            ii++;
                            if (!v.Enabled)
                            {
                                int temp;
                                switch (enumerate.product_id)
                                {
                                case (product_l):
                                    temp = Resource.Drawable.jc_left_s; break;

                                case (product_r):
                                    temp = Resource.Drawable.jc_right_s; break;

                                case (product_pro):
                                    temp = Resource.Drawable.pro; break;

                                case (product_snes):
                                    temp = Resource.Drawable.snes; break;

                                default:
                                    temp = Resource.Drawable.cross; break;
                                }



                                v.Tag     = j.Last();                                     // assign controller to button
                                v.Enabled = true;
                                v.Click  += new EventHandler(mActivity.conBtnClick);

                                v.SetBackgroundResource(temp);



                                mActivity.loc[ii].Tag    = v;
                                mActivity.loc[ii].Click += new EventHandler(mActivity.locBtnClick);


                                break;
                            }
                        }
                    }

                    byte[] mac = new byte[6];
                    Console.WriteLine(string.Format("mac address =>      {0}", enumerate.serial_number));
                    //onsole.WriteLine("mac address => {0} , len => {1}",, enumerate.serial_number.Length);
                    for (int n = 0; n < 6; n++)
                    {
                        mac[n] = byte.Parse(enumerate.serial_number.Substring(n * 2, 2), System.Globalization.NumberStyles.HexNumber);                         //TODO
                    }
                    j[j.Count - 1].PadMacAddress = new PhysicalAddress(mac);
                }

                ptr = enumerate.next;
            }



            if (foundNew)
            {             // attempt to auto join-up joycons on connection
                Joycon temp = null;
                foreach (Joycon v in j)
                {
                    if (!v.isPro)
                    {
                        if (temp == null)
                        {
                            temp = v;
                        }
                        else if (temp.isLeft != v.isLeft && v.other == null)
                        {
                            temp.other = v;
                            v.other    = temp;

                            //Set both Joycon LEDs to the one with the lowest ID
                            byte led = temp.LED <= v.LED ? temp.LED : v.LED;
                            temp.LED = led;
                            v.LED    = led;
                            temp.SetPlayerLED(led);
                            v.SetPlayerLED(led);

                            /*
                             * if (temp.xin != null)
                             * {
                             *      try
                             *      {
                             *              temp.xin.Disconnect();
                             *      }
                             *      catch (Exception e)
                             *      {
                             *              // it wasn't connected in the first place, go figure
                             *      }
                             * }
                             * if (temp.ds4 != null)
                             * {
                             *      try
                             *      {
                             *              temp.ds4.Disconnect();
                             *      }
                             *      catch (Exception e)
                             *      {
                             *              // it wasn't connected in the first place, go figure
                             *      }
                             * }
                             * temp.xin = null;
                             * temp.ds4 = null;
                             */

                            foreach (Button b in mActivity.con)
                            {
                                if (b.Tag == (Object)v || b.Tag == (Object)temp)
                                {
                                    Joycon tt = (b.Tag == (Object)v) ? v : (b.Tag == (Object)temp) ? temp : v;
                                    //b.BackgroundImage = tt.isLeft ? Properties.Resources.jc_left : Properties.Resources.jc_right;
                                    b.SetBackgroundResource(tt.isLeft ? Resource.Drawable.jc_left : Resource.Drawable.jc_right);
                                }
                            }

                            temp = null;                                // repeat
                        }
                    }
                }
            }

            HIDapi.hid_free_enumeration(ptr);

            foreach (Joycon jc in j)
            {             // Connect device straight away
                if (jc.state == Joycon.state_.NOT_ATTACHED)
                {
                    /*
                     * if (jc.xin != null)
                     *      jc.xin.Connect();
                     * if (jc.ds4 != null)
                     *      jc.ds4.Connect();
                     */
                    jc.Attach(leds_: jc.LED);

                    bool on = ConfigurationManager.AppSettings["HomeLEDOn"].ToLower() == "true";                      //TODO
                    foreach (Joycon j in Program.mgr.j)
                    {
                        j.SetHomeLight(on);
                    }

                    jc.Begin();
                    if (mActivity.nonOriginal)
                    {
                        jc.getActiveData();
                    }
                }
            }
        }
        public void conBtnClick(object sender, EventArgs e)
        {
            Button button = sender as Button;

            if (button.Tag.GetType() == typeof(Joycon))
            {
                Joycon v = (Joycon)button.Tag;

                if (v.other == null && !v.isPro)
                {                 // needs connecting to other joycon (so messy omg)
                    bool succ = false;

                    if (Program.mgr.j.Count == 1)
                    {                     // when want to have a single joycon in vertical mode
                        v.other = v;      // hacky; implement check in Joycon.cs to account for this
                        succ    = true;
                    }
                    else
                    {
                        foreach (Joycon jc in Program.mgr.j)
                        {
                            if (!jc.isPro && jc.isLeft != v.isLeft && jc != v && jc.other == null)
                            {
                                v.other  = jc;
                                jc.other = v;

                                //Set both Joycon LEDs to the one with the lowest ID
                                byte led = jc.LED <= v.LED ? jc.LED : v.LED;
                                jc.LED = led;
                                v.LED  = led;
                                jc.SetPlayerLED(led);
                                v.SetPlayerLED(led);

                                //v.xin.Disconnect();
                                //v.xin = null;

                                // setting the other joycon's button image
                                foreach (Button b in con)
                                {
                                    if (b.Tag == (Object)jc)
                                    {
                                        //b.BackgroundImage = jc.isLeft ? Properties.Resources.jc_left : Properties.Resources.jc_right;
                                        b.SetBackgroundResource(jc.isLeft ? Resource.Drawable.jc_left : Resource.Drawable.jc_right);
                                    }
                                }

                                succ = true;
                                break;
                            }
                        }
                    }

                    if (succ)
                    {
                        foreach (Button b in con)
                        {
                            if (b.Tag == (Object)v)
                            {
                                //b.BackgroundImage = v.isLeft ? Properties.Resources.jc_left : Properties.Resources.jc_right;
                                b.SetBackgroundResource(v.isLeft ? Resource.Drawable.jc_left : Resource.Drawable.jc_right);
                            }
                        }
                    }
                }
                else if (v.other != null && !v.isPro)
                {                 // needs disconnecting from other joycon
                    /*
                     * if (v.xin == null)
                     * {
                     *      ReenableXinput(v);
                     *      v.xin.Connect();
                     * }
                     *
                     * if (v.other.xin == null)
                     * {
                     *      ReenableXinput(v.other);
                     *      v.other.xin.Connect();
                     * }
                     */

                    //button.BackgroundImage = v.isLeft ? Properties.Resources.jc_left_s : Properties.Resources.jc_right_s;
                    button.SetBackgroundResource(v.isLeft ? Resource.Drawable.jc_left_s : Resource.Drawable.jc_right_s);

                    foreach (Button b in con)
                    {
                        if (b.Tag == (Object)v.other)
                        {
                            //b.BackgroundImage = v.other.isLeft ? Properties.Resources.jc_left_s : Properties.Resources.jc_right_s;
                            b.SetBackgroundResource(v.other.isLeft ? Resource.Drawable.jc_left_s : Resource.Drawable.jc_right_s);
                        }
                    }

                    //Set original Joycon LEDs
                    v.other.LED = (byte)(0x1 << v.other.PadId);
                    v.LED       = (byte)(0x1 << v.PadId);
                    v.other.SetPlayerLED(v.other.LED);
                    v.SetPlayerLED(v.LED);

                    v.other.other = null;
                    v.other       = null;
                }
            }
        }