예제 #1
0
        private void OnJoyConSplitting(object sender, JoyConSplittingEventArgs args)
        {
            lock (SplittingMonitor)
            {
                if (args.SplittingType == SplittingType.ReadyToSplit)
                {
                    if (_readyToSplitJoyCon == null)
                    {
                        Logger.Debug("JoyCon Ready to Split: " + args.SourceJoyCon);
                        _readyToSplitJoyCon = args.SourceJoyCon;
                    }
                    else
                    {
                        if (_readyToSplitJoyCon.Equals(args.SourceJoyCon) ||
                            _readyToSplitJoyCon.Type == args.SourceJoyCon.Type)
                        {
                            return;
                        }

                        var joyConPair = _pairJoyConList.FirstOrDefault(
                            joyCon => (joyCon.LeftJoyCon.Equals(_readyToSplitJoyCon) ||
                                       joyCon.LeftJoyCon.Equals(args.SourceJoyCon)) &&
                            (joyCon.RightJoyCon.Equals(_readyToSplitJoyCon) ||
                             joyCon.LeftJoyCon.Equals(args.SourceJoyCon)));
                        if (joyConPair == null)
                        {
                            return;
                        }

                        Logger.Debug("Start splitting of: " + args.SourceJoyCon + " and " + _readyToSplitJoyCon);

                        lock (ListMonitor)
                        {
                            //Remove joycon pair
                            _pairJoyConList.Remove(joyConPair);
                            JoyConUpdated?.Invoke(this, new JoyConUpdateEventArgs(joyConPair, JoyConUpdateType.Disconnected));
                            //Add joycon singles
                            joyConPair.LeftJoyCon.UnPair();
                            _singleJoyConList.Add(joyConPair.LeftJoyCon);
                            JoyConUpdated?.Invoke(this,
                                                  new JoyConUpdateEventArgs(joyConPair.LeftJoyCon, JoyConUpdateType.Connected));
                            _singleJoyConList.Add(joyConPair.RightJoyCon);
                            JoyConUpdated?.Invoke(this,
                                                  new JoyConUpdateEventArgs(joyConPair.RightJoyCon, JoyConUpdateType.Connected));
                        }

                        _readyToSplitJoyCon = null;
                    }
                }
                else if (args.SplittingType == SplittingType.CancelSplitting)
                {
                    Logger.Debug("JoyCon Splitting canceled: " + args.SourceJoyCon);
                    _readyToSplitJoyCon = null;
                }
                else
                {
                    throw new NotImplementedException();
                }
            }
        }
예제 #2
0
        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();
                }
            }
        }