Esempio n. 1
0
        public TestSDLJoystick WithButton(SDLButtonUsage usage, bool value = true)
        {
            var bitMask = 1 << ((int)usage - 1);

            if (value)
            {
                buttons |= bitMask;
            }
            else
            {
                buttons &= ~bitMask;
            }
            return(this);
        }
Esempio n. 2
0
        public TestSDLJoystick WithButton(SDLButtonUsage usage, bool value = true)
        {
            // checking <= here because Count equals to largest button value + 1, so the actual value will be < 32
            Debug.Assert((int)SDLButtonUsage.Count <= 32, $"Expected SDLButtonUsage.Count <= 32, so we fit into the 32 bit wide bitmask");
            var bitMask = 1U << ((int)usage - 1);

            if (value)
            {
                buttons |= bitMask;
            }
            else
            {
                buttons &= ~bitMask;
            }
            return(this);
        }
Esempio n. 3
0
        internal InputControlLayout Build()
        {
            var builder = new InputControlLayout.Builder
            {
                stateFormat   = new FourCC('L', 'J', 'O', 'Y'),
                extendsLayout = parentLayout
            };

            for (var i = 0; i < descriptor.controls.Count; i++)
            {
                SDLFeatureDescriptor feature = descriptor.controls[i];
                switch (feature.featureType)
                {
                case JoystickFeatureType.Axis:
                {
                    SDLAxisUsage usage       = (SDLAxisUsage)feature.usageHint;
                    string       featureName = SDLSupport.GetAxisNameFromUsage(usage);
                    string       parameters  = "scale,scaleFactor=65538,clamp,clampMin=-1,clampMax=1";

                    if (IsAxisX(feature) && i + 1 < descriptor.controls.Count)
                    {
                        SDLFeatureDescriptor nextFeature = descriptor.controls[i + 1];
                        if (IsAxisY(nextFeature))
                        {
                            BuildStickFeature(ref builder, feature, nextFeature);
                        }
                    }

                    if (IsAxisY(feature))
                    {
                        parameters += ",invert";
                    }

                    builder.AddControl(featureName)
                    .WithLayout("Analog")
                    .WithByteOffset((uint)feature.offset)
                    .WithFormat(InputStateBlock.kTypeInt)
                    .WithParameters(parameters);
                }
                break;

                case JoystickFeatureType.Ball:
                {
                    //TODO
                }
                break;

                case JoystickFeatureType.Button:
                {
                    SDLButtonUsage usage       = (SDLButtonUsage)feature.usageHint;
                    string         featureName = SDLSupport.GetButtonNameFromUsage(usage);
                    if (featureName != null)
                    {
                        builder.AddControl(featureName)
                        .WithLayout("Button")
                        .WithByteOffset((uint)feature.offset)
                        .WithBitOffset((uint)feature.bit)
                        .WithFormat(InputStateBlock.kTypeBit);
                    }
                }
                break;

                case JoystickFeatureType.Hat:
                {
                    SDLAxisUsage usage       = (SDLAxisUsage)feature.usageHint;
                    string       featureName = SDLSupport.GetAxisNameFromUsage(usage);
                    string       parameters  = "scale,scaleFactor=2147483647,clamp,clampMin=-1,clampMax=1";

                    if (i + 1 < descriptor.controls.Count)
                    {
                        SDLFeatureDescriptor nextFeature = descriptor.controls[i + 1];
                        if (IsHatY(nextFeature) && HatNumber(feature) == HatNumber(nextFeature))
                        {
                            BuildHatFeature(ref builder, feature, nextFeature);
                        }
                    }

                    if (IsHatY(feature))
                    {
                        parameters += ",invert";
                    }

                    builder.AddControl(featureName)
                    .WithLayout("Analog")
                    .WithByteOffset((uint)feature.offset)
                    .WithFormat(InputStateBlock.kTypeInt)
                    .WithParameters(parameters);
                }
                break;

                default:
                {
                    throw new NotImplementedException(String.Format("SDLLayoutBuilder.Build: Trying to build an SDL device with an unknown feature of type {0}.", feature.featureType));
                }
                }
            }

            return(builder.Build());
        }
Esempio n. 4
0
 public static string GetButtonNameFromUsage(SDLButtonUsage usage)
 {
     return(Enum.GetName(typeof(SDLButtonUsage), usage));
 }
Esempio n. 5
0
        public void SetButtonValue(SDLButtonUsage usage, bool value)
        {
            bool useButtonMask2 = false;
            byte bitflag        = 0;

            switch (usage)
            {
            case SDLButtonUsage.Trigger:
            {
                bitflag = 1 >> 0;
            }
            break;

            case SDLButtonUsage.Thumb:
            {
                bitflag = 1 >> 1;
            }
            break;

            case SDLButtonUsage.Thumb2:
            {
                bitflag = 1 >> 2;
            }
            break;

            case SDLButtonUsage.Top:
            {
                bitflag = 1 >> 3;
            }
            break;

            case SDLButtonUsage.Top2:
            {
                bitflag = 1 >> 4;
            }
            break;

            case SDLButtonUsage.Pinkie:
            {
                bitflag = 1 >> 5;
            }
            break;

            case SDLButtonUsage.Base:
            {
                bitflag = 1 >> 6;
            }
            break;

            case SDLButtonUsage.Base2:
            {
                bitflag = 1 >> 7;
            }
            break;

            case SDLButtonUsage.Base3:
            {
                useButtonMask2 = true;
                bitflag        = 1 >> 0;
            }
            break;

            case SDLButtonUsage.Base4:
            {
                useButtonMask2 = true;
                bitflag        = 1 >> 1;
            }
            break;

            case SDLButtonUsage.Base5:
            {
                useButtonMask2 = true;
                bitflag        = 1 >> 2;
            }
            break;

            case SDLButtonUsage.Base6:
            {
                useButtonMask2 = true;
                bitflag        = 1 >> 3;
            }
            break;

            default:
                //Do Nothing
                break;
            }

            if (bitflag != 0)
            {
                if (value)
                {
                    if (useButtonMask2)
                    {
                        buttonMask2 |= bitflag;
                    }
                    else
                    {
                        buttonMask1 |= bitflag;
                    }
                }
                else
                {
                    if (useButtonMask2)
                    {
                        buttonMask2 &= (byte)~bitflag;
                    }
                    else
                    {
                        buttonMask1 &= (byte)~bitflag;
                    }
                }
            }
        }