private void OnJoyConPairing(object sender, JoyConPairingEventArgs args) { lock (PairingMonitor) { if (args.PairingType == PairingType.ReadyToPair) { if (_readyToPairJoyCon == null) { Logger.Debug("JoyCon Ready to Pair: " + args.SourceJoyCon); _readyToPairJoyCon = args.SourceJoyCon; } else { if (_readyToPairJoyCon.Equals(args.SourceJoyCon) || _readyToPairJoyCon.Type == args.SourceJoyCon.Type) { return; //Detect same or same type (left / right) of joycon } Logger.Debug("Start pairing of: " + args.SourceJoyCon + " and " + _readyToPairJoyCon); //Run pairing var leftJoyCon = _readyToPairJoyCon.Type == JoyConType.Left ? _readyToPairJoyCon : args.SourceJoyCon; var rightJoyCon = _readyToPairJoyCon.Type == JoyConType.Right ? _readyToPairJoyCon : args.SourceJoyCon; lock (ListMonitor) { //Remove singles _singleJoyConList.Remove(leftJoyCon); JoyConUpdated?.Invoke(this, new JoyConUpdateEventArgs(leftJoyCon, JoyConUpdateType.Disconnected)); _singleJoyConList.Remove(rightJoyCon); JoyConUpdated?.Invoke(this, new JoyConUpdateEventArgs(rightJoyCon, JoyConUpdateType.Disconnected)); //Add pair as new var pairedJoyCon = new JoyConPair(leftJoyCon, rightJoyCon); leftJoyCon.PairWith(rightJoyCon); //TODO: In JoyConPair? _pairJoyConList.Add(pairedJoyCon); JoyConUpdated?.Invoke(this, new JoyConUpdateEventArgs(pairedJoyCon, JoyConUpdateType.Connected)); } _readyToPairJoyCon = null; } } else if (args.PairingType == PairingType.CancelPairing) { Logger.Debug("JoyCon Pairing canceled: " + args.SourceJoyCon); _readyToPairJoyCon = null; } else { throw new NotImplementedException(); } } }
private static void HandleJoyConPair(JoyConState joyConState, JoyConPair joyCon, ref VirtualJoystickData data) { if (joyConState is JoyConLeftState) { var state = (JoyConLeftState)joyConState; data.ButtonUp = state.ButtonUp; data.ButtonDown = state.ButtonDown; data.ButtonLeft = state.ButtonLeft; data.ButtonRight = state.ButtonRight; data.BackButtonLeft = state.BackButton; data.RearBackButtonLeft = state.RearBackButton; data.SelectButton = state.MinusButton; data.StickLeftButton = state.StickButton; data.LeftAxisX = JoyConConstants.LeftJoyConXMultiplier * state.StickHorizontal + JoyConConstants.LeftJoyConOffsetX; data.LeftAxisY = JoyConConstants.LeftJoyConYMultiplier * -state.StickVertical + JoyConConstants.LeftJoyConOffsetY; //Merge With Other JoyCon if (joyCon?.RightJoyCon.CurrentState != null) { HandleJoyConPair(joyCon.RightJoyCon.CurrentState, null, ref data); } } else if (joyConState is JoyConRightState) { var state = (JoyConRightState)joyConState; data.ButtonY = state.ButtonX; data.ButtonX = state.ButtonY; data.ButtonB = state.ButtonA; data.ButtonA = state.ButtonB; data.BackButtonRight = state.BackButton; data.RearBackButtonRight = state.RearBackButton; data.StartButton = state.PlusButton; data.StickRightButton = state.StickButton; data.RightAxisX = JoyConConstants.RightJoyConXMultiplier * state.StickHorizontal + JoyConConstants.RightJoyConOffsetX; data.RightAxisY = JoyConConstants.RightJoyConYMultiplier * state.StickVertical + JoyConConstants.RightJoyConOffsetY; //Merge With Other JoyCon if (joyCon?.LeftJoyCon.CurrentState != null) { HandleJoyConPair(joyCon.LeftJoyCon.CurrentState, null, ref data); } } else { throw new NotImplementedException(); } }