public TestSDLJoystick WithButton(SDLButtonUsage usage, bool value = true) { var bitMask = 1 << ((int)usage - 1); if (value) { buttons |= bitMask; } else { buttons &= ~bitMask; } return(this); }
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); }
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()); }
public static string GetButtonNameFromUsage(SDLButtonUsage usage) { return(Enum.GetName(typeof(SDLButtonUsage), usage)); }
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; } } } }