public vJoystick(vJoy joy, uint jID)
        {
            m_joy = joy;
            Index = jID;

            m_nButtons = m_joy.GetVJDButtonNumber(Index);
            m_nPov     = m_joy.GetVJDDiscPovNumber(Index);

            m_prodS = m_joy.GetvJoyProductString( );
            m_hasX  = GetState(HID_USAGES.HID_USAGE_X);
            m_hasY  = GetState(HID_USAGES.HID_USAGE_Y);
            m_hasZ  = GetState(HID_USAGES.HID_USAGE_Z);

            m_hasRX = GetState(HID_USAGES.HID_USAGE_RX);
            m_hasRY = GetState(HID_USAGES.HID_USAGE_RY);
            m_hasRZ = GetState(HID_USAGES.HID_USAGE_RZ);

            m_hasSL1 = GetState(HID_USAGES.HID_USAGE_SL0);
            m_hasSL2 = GetState(HID_USAGES.HID_USAGE_SL1);

            for (int i = 1; i <= m_nPov; i++)
            {
                m_hasPov[i] = GetState(HID_USAGES.HID_USAGE_POV, i);
            }
            for (int i = 1; i <= m_nButtons; i++)
            {
                m_hasBtn[i] = GetState(HID_USAGES.HID_USAGE_WHL, i); // Use WHL as button qualifier...
            }
        }
        private xState[] m_hasBtn = new xState[1 + 128]; // [0] is not used

        private xState GetState(HID_USAGES usage, int pindex = 0)
        {
            var ret = new xState {
                usage = usage, current = 0
            };

            if (usage == HID_USAGES.HID_USAGE_POV)
            {
                ret.has     = (pindex > 0 && pindex <= m_nPov);
                ret.pindex  = pindex;
                ret.current = (int)POVType.Nil;
            }
            else if (usage == HID_USAGES.HID_USAGE_WHL) // button
            {
                ret.has     = (pindex > 0 && pindex <= m_nPov);
                ret.pindex  = pindex;
                ret.current = 0; // == false...
            }
            else
            {
                ret.has = m_joy.GetVJDAxisExist(Index, usage);
                if (ret.has)
                {
                    long val = 0;
                    if (m_joy.GetVJDAxisMin(Index, usage, ref val))
                    {
                        ret.min = (int)val;
                    }
                    if (m_joy.GetVJDAxisMax(Index, usage, ref val))
                    {
                        ret.max = (int)val;
                    }
                    ret.range = (double)(ret.max - ret.min) / xState.MAXOUT;
                }
            }

            return(ret);
        }