/// <summary>Moves a slider to the specified position</summary> /// <param name="slider">Slider that will be moved</param> /// <param name="position"> /// Position the slider will be moved to in the range from 0.0 to 1.0 /// </param> public void MoveSlider(ExtendedSliders slider, float position) { if ((slider & this.availableSliders) != slider) { throw new ArgumentException( "Not such slider - did you forget to assign the AvailableAxes property?", "slider" ); } switch (slider) { case ExtendedSliders.Slider1: { this.sliderStates[0] = position; break; } case ExtendedSliders.Slider2: { this.sliderStates[1] = position; break; } case ExtendedSliders.Velocity1: { this.sliderStates[2] = position; break; } case ExtendedSliders.Velocity2: { this.sliderStates[3] = position; break; } case ExtendedSliders.Acceleration1: { this.sliderStates[4] = position; break; } case ExtendedSliders.Acceleration2: { this.sliderStates[5] = position; break; } case ExtendedSliders.Force1: { this.sliderStates[6] = position; break; } case ExtendedSliders.Force2: { this.sliderStates[7] = position; break; } default: { throw new ArgumentException("Invalid slider specified", "slider"); } } }
/// <summary>Creates a slider reader for the specified object</summary> /// <param name="joystick">Joystick providing the control object</param> /// <param name="slider">Slider a reader will be created for</param> /// <param name="control">Control description for the axis</param> /// <returns>A new slider reader for the specified axis</returns> private static ISliderReader createSliderReader( Joystick joystick, ExtendedSliders slider, DeviceObjectInstance control ) { int id = (int)control.ObjectType; ObjectProperties properties = joystick.GetObjectPropertiesById(id); int min = properties.LowerRange; int max = properties.UpperRange; switch (slider) { case ExtendedSliders.Slider1: { return(new SliderReader(0, min, max)); } case ExtendedSliders.Slider2: { return(new SliderReader(1, min, max)); } case ExtendedSliders.Velocity1: { return(new VelocitySliderReader(0, min, max)); } case ExtendedSliders.Velocity2: { return(new VelocitySliderReader(1, min, max)); } case ExtendedSliders.Acceleration1: { return(new AccelerationSliderReader(0, min, max)); } case ExtendedSliders.Acceleration2: { return(new AccelerationSliderReader(1, min, max)); } case ExtendedSliders.Force1: { return(new ForceSliderReader(0, min, max)); } case ExtendedSliders.Force2: { return(new ForceSliderReader(1, min, max)); } default: { return(null); } } }
/// <summary>Returns the slider index from a value in the slider enumeration</summary> /// <param name="slider">Slider enumeration values whose index will be returned</param> /// <returns>The index of the specified slider enumeration value</returns> private static int indexFromSlider(ExtendedSliders slider) { switch (slider) { case ExtendedSliders.Slider1: { return(0); } case ExtendedSliders.Slider2: { return(1); } case ExtendedSliders.Velocity1: { return(2); } case ExtendedSliders.Velocity2: { return(3); } case ExtendedSliders.Acceleration1: { return(4); } case ExtendedSliders.Acceleration2: { return(5); } case ExtendedSliders.Force1: { return(6); } case ExtendedSliders.Force2: { return(7); } default: { return(-1); } } }
/// <summary>Retrieves the state of the specified slider</summary> /// <param name="slider">Slider whose state will be retrieved</param> /// <returns>The state of the specified slider</returns> public float GetSlider(ExtendedSliders slider) { switch (slider) { case ExtendedSliders.Slider1: { return(this.Slider1); } case ExtendedSliders.Slider2: { return(this.Slider2); } case ExtendedSliders.Velocity1: { return(this.VelocitySlider1); } case ExtendedSliders.Velocity2: { return(this.VelocitySlider2); } case ExtendedSliders.Acceleration1: { return(this.AccelerationSlider1); } case ExtendedSliders.Acceleration2: { return(this.AccelerationSlider2); } case ExtendedSliders.Force1: { return(this.ForceSlider1); } case ExtendedSliders.Force2: { return(this.ForceSlider2); } default: { throw new ArgumentOutOfRangeException("slider", "Invalid slider"); } } }
/// <summary>Initializes a new extended game pas state to the provided values</summary> /// <param name="availableAxes">Bit mask of the axes made available in the state</param> /// <param name="axes"> /// Values of all 24 axes in the order they appear in the ExtendedAxes enumeration /// </param> /// <param name="availableSliders">Bit mask of the slider provided by the state</param> /// <param name="sliders"> /// Values of all 8 sliders in the order they appear in the ExtendedSliders enumeration /// </param> /// <param name="buttonCount">Number of buttons provided by the state</param> /// <param name="buttons">State of all 128 buttons in the state</param> /// <param name="povCount">Number of Point-of-View controllers in the state</param> /// <param name="povs">State of all 4 Point-of-View controllers</param> public ExtendedGamePadState( ExtendedAxes availableAxes, float[] /*24*/ axes, ExtendedSliders availableSliders, float[] /*8*/ sliders, int buttonCount, bool[] /*128*/ buttons, int povCount, int[] /*4*/ povs ) { // Take over all axes this.AvailableAxes = availableAxes; this.X = axes[0]; this.Y = axes[1]; this.Z = axes[2]; this.VelocityX = axes[3]; this.VelocityY = axes[4]; this.VelocityZ = axes[5]; this.AccelerationX = axes[6]; this.AccelerationY = axes[7]; this.AccelerationZ = axes[8]; this.ForceX = axes[9]; this.ForceY = axes[10]; this.ForceZ = axes[11]; this.RotationX = axes[12]; this.RotationY = axes[13]; this.RotationZ = axes[14]; this.AngularVelocityX = axes[15]; this.AngularVelocityY = axes[16]; this.AngularVelocityZ = axes[17]; this.AngularAccelerationX = axes[18]; this.AngularAccelerationY = axes[19]; this.AngularAccelerationZ = axes[20]; this.TorqueX = axes[21]; this.TorqueY = axes[22]; this.TorqueZ = axes[23]; // Take over all sliders this.AvailableSliders = availableSliders; this.Slider1 = sliders[0]; this.Slider2 = sliders[1]; this.VelocitySlider1 = sliders[2]; this.VelocitySlider2 = sliders[3]; this.AccelerationSlider1 = sliders[4]; this.AccelerationSlider2 = sliders[5]; this.ForceSlider1 = sliders[6]; this.ForceSlider2 = sliders[7]; // Take over all buttons this.ButtonCount = buttonCount; this.buttonState1 = 0; for (int index = 0; index < Math.Min(64, buttonCount); ++index) { if (buttons[index]) { this.buttonState1 |= (1UL << index); } } this.buttonState2 = 0; for (int index = 0; index < (buttonCount - 64); ++index) { if (buttons[index + 64]) { this.buttonState2 |= (1UL << index); } } // Take over all PoV controllers this.PovCount = povCount; this.Pov1 = povs[0]; this.Pov2 = povs[1]; this.Pov3 = povs[2]; this.Pov4 = povs[3]; }
/// <summary>Returns the slider index from a value in the slider enumeration</summary> /// <param name="slider">Slider enumeration values whose index will be returned</param> /// <returns>The index of the specified slider enumeration value</returns> private static int indexFromSlider(ExtendedSliders slider) { switch (slider) { case ExtendedSliders.Slider1: { return 0; } case ExtendedSliders.Slider2: { return 1; } case ExtendedSliders.Velocity1: { return 2; } case ExtendedSliders.Velocity2: { return 3; } case ExtendedSliders.Acceleration1: { return 4; } case ExtendedSliders.Acceleration2: { return 5; } case ExtendedSliders.Force1: { return 6; } case ExtendedSliders.Force2: { return 7; } default: { return -1; } } }
/// <summary>Creates a slider reader for the specified object</summary> /// <param name="joystick">Joystick providing the control object</param> /// <param name="slider">Slider a reader will be created for</param> /// <param name="control">Control description for the axis</param> /// <returns>A new slider reader for the specified axis</returns> private static ISliderReader createSliderReader( Joystick joystick, ExtendedSliders slider, DeviceObjectInstance control ) { int id = (int)control.ObjectType; ObjectProperties properties = joystick.GetObjectPropertiesById(id); int min = properties.LowerRange; int max = properties.UpperRange; switch (slider) { case ExtendedSliders.Slider1: { return new SliderReader(0, min, max); } case ExtendedSliders.Slider2: { return new SliderReader(1, min, max); } case ExtendedSliders.Velocity1: { return new VelocitySliderReader(0, min, max); } case ExtendedSliders.Velocity2: { return new VelocitySliderReader(1, min, max); } case ExtendedSliders.Acceleration1: { return new AccelerationSliderReader(0, min, max); } case ExtendedSliders.Acceleration2: { return new AccelerationSliderReader(1, min, max); } case ExtendedSliders.Force1: { return new ForceSliderReader(0, min, max); } case ExtendedSliders.Force2: { return new ForceSliderReader(1, min, max); } default: { return null; } } }
/// <summary>Maps the sliders of the joystick</summary> /// <param name="joystick">Joystick for which sliders are mapped</param> private void mapSliders(Joystick joystick) { IList <DeviceObjectInstance> sliders = joystick.GetObjects( ObjectDeviceType.AbsoluteAxis ); var unmappedReaders = new Queue <ISliderReader>(); for (int index = 0; index < sliders.Count; ++index) { if (sliders[index].ObjectTypeGuid == ObjectGuid.Slider) { ExtendedSliders slider = identifySlider( sliders[index].Aspect, sliders[index].ObjectTypeGuid ); // If this slider could not be identified but were still missing one // of the two standard sliders, remember it so we can use it in case // no exact matches are found for sliders 1 and 2. if (slider == 0) { if (unmappedReaders.Count < 2) { unmappedReaders.Enqueue(createSliderReader(joystick, slider, sliders[index])); } } else // Slider was identified, assign it to the next free slot { if ((this.availableSliders & slider) != 0) { ++slider; if ((this.availableSliders & slider) != 0) { slider = 0; } } } // If we identified this slider (exactly or by fallback), build a reader // for it and store it in the appropriate slot. if (slider != 0) { this.availableSliders |= slider; this.sliderReaders[indexFromSlider(slider)] = createSliderReader( joystick, slider, sliders[index] ); } } // if } // for // If sliders 1 and/or 2 are still not provided, use the unidentified // sliders we remembered earlier as a fallback solution. These could very // well be null, too, in which case the sliders simply aren't there. if ((this.sliderReaders[0] == null) && (unmappedReaders.Count > 0)) { this.availableSliders |= ExtendedSliders.Slider1; this.sliderReaders[0] = unmappedReaders.Dequeue(); } if ((this.sliderReaders[1] == null) && (unmappedReaders.Count > 0)) { this.availableSliders |= ExtendedSliders.Slider2; this.sliderReaders[1] = unmappedReaders.Dequeue(); } }
/// <summary>Initializes a new mocked game pad</summary> public MockedGamePad() { this.states = new Queue<ExtendedGamePadState>(); this.current = new ExtendedGamePadState(); this.buttonStates = new bool[128]; this.axisStates = new float[24]; this.sliderStates = new float[8]; this.povStates = new int[4] { -1, -1, -1, -1 }; this.buttonCount = 11; this.availableAxes = ExtendedAxes.X | ExtendedAxes.Y | ExtendedAxes.RotationX | ExtendedAxes.RotationY; this.availableSliders = ExtendedSliders.Slider1 | ExtendedSliders.Slider2; this.povCount = 1; }
/// <summary>Maps the sliders of the joystick</summary> /// <param name="joystick">Joystick for which sliders are mapped</param> private void mapSliders(Joystick joystick) { IList<DeviceObjectInstance> sliders = joystick.GetObjects( ObjectDeviceType.AbsoluteAxis ); var unmappedReaders = new Queue<ISliderReader>(); for (int index = 0; index < sliders.Count; ++index) { if (sliders[index].ObjectTypeGuid == ObjectGuid.Slider) { ExtendedSliders slider = identifySlider( sliders[index].Aspect, sliders[index].ObjectTypeGuid ); // If this slider could not be identified but were still missing one // of the two standard sliders, remember it so we can use it in case // no exact matches are found for sliders 1 and 2. if (slider == 0) { if (unmappedReaders.Count < 2) { unmappedReaders.Enqueue(createSliderReader(joystick, slider, sliders[index])); } } else { // Slider was identified, assign it to the next free slot if ((this.availableSliders & slider) != 0) { ++slider; if ((this.availableSliders & slider) != 0) { slider = 0; } } } // If we identified this slider (exactly or by fallback), build a reader // for it and store it in the appropriate slot. if (slider != 0) { this.availableSliders |= slider; this.sliderReaders[indexFromSlider(slider)] = createSliderReader( joystick, slider, sliders[index] ); } } // if } // for // If sliders 1 and/or 2 are still not provided, use the unidentified // sliders we remembered earlier as a fallback solution. These could very // well be null, too, in which case the sliders simply aren't there. if ((this.sliderReaders[0] == null) && (unmappedReaders.Count > 0)) { this.availableSliders |= ExtendedSliders.Slider1; this.sliderReaders[0] = unmappedReaders.Dequeue(); } if ((this.sliderReaders[1] == null) && (unmappedReaders.Count > 0)) { this.availableSliders |= ExtendedSliders.Slider2; this.sliderReaders[1] = unmappedReaders.Dequeue(); } }