private async void BaseControllerReader_ControllerStateChanged(IControllerReader sender, ControllerState state) { if (!disposedValue) { await Task.Delay(delayInMilliseconds); var controllerStateChanged = ControllerStateChanged; if (controllerStateChanged != null) controllerStateChanged(this, state); } }
void reader_ControllerStateChanged (IControllerReader reader, ControllerState state) { foreach (var binding in _bindings) { bool allRequiredButtonsDown = true; foreach (var requiredButton in binding.RequiredButtons) { allRequiredButtonsDown &= state.Buttons [requiredButton]; } if (allRequiredButtonsDown && !binding.CurrentlyDepressed) { SendKeys.PressKey (binding.OutputKey); binding.CurrentlyDepressed = true; } else if (!allRequiredButtonsDown && binding.CurrentlyDepressed) { SendKeys.ReleaseKey (binding.OutputKey); binding.CurrentlyDepressed = false; } } }
public ControllerState Process (ControllerState state) { if (!Enabled) return state; _states.RemoveAt (0); _states.Add (state); var stateIsNoise = false; foreach (var button in _states[0].Buttons.Keys) { if (_states[0].Buttons[button] == _states[2].Buttons[button] && _states[0].Buttons[button] != _states[1].Buttons[button]) { stateIsNoise = true; break; } } // TODO check analogs for erratic movement if no noise detected in buttons return stateIsNoise ? _states[2] : _states[1]; }
void reader_ControllerStateChanged (IControllerReader reader, ControllerState newState) { newState = _blinkFilter.Process (newState); foreach (var button in _buttonsWithImages) { if (!newState.Buttons.ContainsKey (button.Item1.Name)) continue; button.Item2.Visibility = newState.Buttons [button.Item1.Name] ? Visibility.Visible : Visibility.Hidden ; } foreach (var button in _rangeButtonsWithImages) { if (!newState.Analogs.ContainsKey (button.Item1.Name)) continue; var value = newState.Analogs [button.Item1.Name]; var visible = button.Item1.From <= value && value <= button.Item1.To; button.Item2.Visibility = visible ? Visibility.Visible : Visibility.Hidden ; } foreach (var stick in _sticksWithImages) { var skin = stick.Item1; var image = stick.Item2; float xrange = (skin.XReverse ? -1 : 1) * skin.XRange; float yrange = (skin.YReverse ? 1 : -1) * skin.YRange; var x = newState.Analogs.ContainsKey (skin.XName) ? skin.Config.X + xrange * newState.Analogs [skin.XName] : skin.Config.X ; var y = newState.Analogs.ContainsKey (skin.YName) ? skin.Config.Y + yrange * newState.Analogs [skin.YName] : skin.Config.Y ; image.Margin = new Thickness (x,y,0,0); } foreach (var trigger in _triggersWithGridImages) { var skin = trigger.Item1; var grid = trigger.Item2; if (!newState.Analogs.ContainsKey (skin.Name)) continue; var val = newState.Analogs [skin.Name]; if (skin.UseNegative) val *= -1; if (skin.IsReversed) val = 1 - val; if (val < 0) val = 0; switch (skin.Direction) { case Skin.AnalogTrigger.DirectionValue.Right: grid.Width = skin.Config.Width * val; break; case Skin.AnalogTrigger.DirectionValue.Left: var width = skin.Config.Width * val; var offx = skin.Config.Width - width; grid.Margin = new Thickness (skin.Config.X + offx, skin.Config.Y, 0, 0); grid.Width = width; break; case Skin.AnalogTrigger.DirectionValue.Down: grid.Height = skin.Config.Height * val; break; case Skin.AnalogTrigger.DirectionValue.Up: var height = skin.Config.Height * val; var offy = skin.Config.Height - height; grid.Margin = new Thickness (skin.Config.X, skin.Config.Y + offy, 0, 0); grid.Height = height; break; } } }