예제 #1
0
        private void button1_Click_1(object sender, EventArgs e)
        {
            this.DoOnSelected(sender, (cont) => {
                Task.Run(() => {
                    var ff     = new PhysicalFFBEffect();
                    var effpar = new PhysEffectParameters()
                    {
                        Duration              = 100000,
                        Flags                 = EffectFlags.Cartesian | EffectFlags.ObjectIds,
                        Gain                  = 1567,
                        SamplePeriod          = 0,
                        StartDelay            = 0,
                        TriggerButton         = -1,
                        TriggerRepeatInterval = 0,
                        Envelope              = null,

                        Parameters = new ConstantForce()
                        {
                            Magnitude = 8345,
                        }
                    };
                    effpar.SetAxes(new int[1] {
                        cont.FFBAxes[0]
                    }, new int[1] {
                        1
                    });
                    ff.Parameters       = effpar;
                    ff.Parameters.Index = 0;
                    ff.Parameters.FType = ForceType.Constant;
                    ff.Parameters.Type  = EffectGuid.ConstantForce;

                    ff.Object          = new Effect(cont.joystick, EffectGuid.ConstantForce, effpar);
                    cont.FFBEffects[0] = ff;
                    cont.RunExclusive(() => ff.Object.Start(1, EffectPlayFlags.NoDownload));
                    logger.Info($"Run={ff.Object.Status}");
                    Thread.Sleep(10000);
                    logger.Info($"Wait={ff.Object.Status}");
                    ff.Object.Stop();
                    logger.Info($"Stop={ff.Object.Status}");
                });
            });
        }
        private void InternalHandlerFFBPacket(VirtualFFBPacket packet)
        {
            uint eID = packet.BlockIndex - 1;

            switch (packet._FFBPType)
            {
            case FFBPType.PT_NEWEFREP: {
                if (packet.BlockIndex == 0 || packet.NextBlockIndex == 0)
                {
                    break;
                }
                //this.RunExclusive(() => {
                if (FFBEffects[eID] != null)
                {
                    FFBEffects[eID].Dispose();
                    FFBEffects[eID] = null;
                }
                PhysicalFFBEffect effect = new PhysicalFFBEffect();
                FFBEffects[eID] = effect;
                effect.InitFromFFBPacket(packet);
                FFBEffects[eID].Parameters.SetAxes(new int[1] {
                        this.FFBAxes[0]
                    }, FFBEffects[eID].Parameters.Directions);
                FFBEffects[eID].Object = new Effect(this.joystick, FFBEffects[eID].Parameters.Type, FFBEffects[eID].Parameters);
                logger.Info($"Created effect [EBI={eID + 1}] {VirtualController.virtualEffectGuidMapToString[FFBEffects[eID].Parameters.Type]} from packet {packet.CreationTime.ToString("o")}");
                //});
                break;
            }

            case FFBPType.PT_EFFREP: {
                if (packet.BlockIndex == 0)
                {
                    break;
                }
                logger.Info($"Starting update effect [EBI={eID + 1}] __ from packet {packet.CreationTime.ToString("o")}");
                if (FFBEffects[eID] == null)
                {
                    PhysicalFFBEffect effect = new PhysicalFFBEffect();
                    FFBEffects[eID] = effect;
                    effect.InitFromFFBPacket(packet);
                    FFBEffects[eID].Parameters.SetAxes(new int[1] {
                            this.FFBAxes[0]
                        }, FFBEffects[eID].Parameters.Directions);
                    try {
                        FFBEffects[eID].Object = new Effect(this.joystick, FFBEffects[eID].Parameters.Type, FFBEffects[eID].Parameters);
                    }
                    catch (Exception ex) {
                        ;
                    }
                }
                FFBEffects[eID].UpdateFromFFBPacket(packet);
                FFBEffects[eID].Parameters.SetAxes(new int[1] {
                        this.FFBAxes[0]
                    }, FFBEffects[eID].Parameters.Directions);
                //this.RunExclusive(() => {
                FFBEffects[eID].Object.SetParameters(FFBEffects[eID].Parameters,
                                                     EffectParameterFlags.TypeSpecificParameters |
                                                     //EffectParameterFlags.Axes |
                                                     EffectParameterFlags.Direction |
                                                     EffectParameterFlags.Duration |
                                                     //EffectParameterFlags.Envelope |
                                                     EffectParameterFlags.Gain |
                                                     EffectParameterFlags.SamplePeriod |
                                                     EffectParameterFlags.StartDelay |
                                                     EffectParameterFlags.TriggerButton |
                                                     EffectParameterFlags.TriggerRepeatInterval
                                                     );
                logger.Info($"Updated effect [EBI={eID + 1}] {VirtualController.virtualEffectGuidMapToString[FFBEffects[eID].Parameters.Type]} from packet {packet.CreationTime.ToString("o")}");
                //FFBEffects[eID].Object.Start(1);
                //FFBEffects[eID].Object.Stop();
                //});

                break;
            }

            case FFBPType.PT_CONSTREP: {
                if (packet.BlockIndex == 0)
                {
                    break;
                }
                if (FFBEffects[eID] == null)
                {
                    break;
                }
                if (FFBEffects[eID].Parameters.Parameters == null)
                {
                    FFBEffects[eID].Parameters.Parameters = new ConstantForce();
                }
                FFBEffects[eID].Parameters.Parameters.As <ConstantForce>().Magnitude = packet.FFB_EFF_CONSTANT.Magnitude;
                if (FFBEffects[eID].Object != null)
                {
                    //this.RunExclusive(() => {
                    FFBEffects[eID].Object.SetParameters(FFBEffects[eID].Parameters, EffectParameterFlags.TypeSpecificParameters);
                    //});
                }
                break;
            }

            case FFBPType.PT_CONDREP: {
                if (packet.BlockIndex == 0)
                {
                    break;
                }
                if (FFBEffects[eID] == null)
                {
                    break;
                }
                if (FFBEffects[eID].Parameters.Parameters == null)
                {
                    FFBEffects[eID].Parameters.Parameters = new ConditionSet();
                    FFBEffects[eID].Parameters.Parameters.As <ConditionSet>().Conditions = new Condition[1];
                }
                ConditionSet set = FFBEffects[eID].Parameters.Parameters.As <ConditionSet>();
                if (set.Conditions != null)
                {
                    set.Conditions[0].DeadBand            = packet.FFB_EFF_COND.DeadBand;
                    set.Conditions[0].NegativeCoefficient = packet.FFB_EFF_COND.NegCoeff;
                    set.Conditions[0].NegativeSaturation  = (int)packet.FFB_EFF_COND.NegSatur;
                    set.Conditions[0].PositiveCoefficient = packet.FFB_EFF_COND.PosCoeff;
                    set.Conditions[0].PositiveSaturation  = (int)packet.FFB_EFF_COND.PosSatur;
                    set.Conditions[0].Offset = packet.FFB_EFF_COND.CenterPointOffset;
                }
                if (FFBEffects[eID].Object != null)
                {
                    //this.RunExclusive(() => {
                    FFBEffects[eID].Object.SetParameters(FFBEffects[eID].Parameters, EffectParameterFlags.TypeSpecificParameters);
                    //});
                }
                break;
            }

            case FFBPType.PT_PRIDREP: {
                if (packet.BlockIndex == 0)
                {
                    break;
                }
                if (FFBEffects[eID] == null)
                {
                    break;
                }
                if (FFBEffects[eID].Parameters.Parameters == null)
                {
                    FFBEffects[eID].Parameters.Parameters = new PeriodicForce();
                }
                PeriodicForce force = FFBEffects[eID].Parameters.Parameters.As <PeriodicForce>();
                force.Magnitude = (int)packet.FFB_EFF_PERIOD.Magnitude;
                force.Offset    = packet.FFB_EFF_PERIOD.Offset;
                force.Period    = (int)packet.FFB_EFF_PERIOD.Period * 1000;
                force.Phase     = (int)packet.FFB_EFF_PERIOD.Phase;
                if (FFBEffects[eID].Object != null)
                {
                    //this.RunExclusive(() => {
                    FFBEffects[eID].Object.SetParameters(FFBEffects[eID].Parameters, EffectParameterFlags.TypeSpecificParameters);
                    //});
                }
                break;
            }

            case FFBPType.PT_RAMPREP: {
                if (packet.BlockIndex == 0)
                {
                    break;
                }
                if (FFBEffects[eID] == null)
                {
                    break;
                }
                if (FFBEffects[eID].Parameters.Parameters == null)
                {
                    FFBEffects[eID].Parameters.Parameters = new RampForce();
                }
                RampForce force = FFBEffects[eID].Parameters.Parameters.As <RampForce>();
                force.Start = packet.FFB_EFF_RAMP.Start;
                force.End   = packet.FFB_EFF_RAMP.End;
                if (FFBEffects[eID].Object != null)
                {
                    //this.RunExclusive(() => {
                    FFBEffects[eID].Object.SetParameters(FFBEffects[eID].Parameters, EffectParameterFlags.TypeSpecificParameters);
                    //});
                }
                break;
            }

            case FFBPType.PT_EFOPREP: {
                if (packet.BlockIndex == 0)
                {
                    break;
                }
                if (FFBEffects[eID] == null)
                {
                    break;
                }
                //this.RunExclusive(() => {
                switch (packet.FFB_EFF_OP.EffectOp)
                {
                case FFBOP.EFF_START: {
                    //logger.Debug($"Trying run object {FFBEffects[eID].ToString()} from packet {packet.CreationTime.ToString("o")}");
                    FFBEffects[eID].Object?.Start(packet.FFB_EFF_OP.LoopCount, EffectPlayFlags.NoDownload);
                    break;
                }

                case FFBOP.EFF_STOP: {
                    FFBEffects[eID].Object?.Stop();
                    break;
                }

                case FFBOP.EFF_SOLO: {
                    logger.Warn($"EFF_SOLO on {eID} not implemented");
                    break;
                }
                }
                //});
                break;
            }

            case FFBPType.PT_BLKFRREP: {
                if (packet.BlockIndex == 0)
                {
                    break;
                }
                if (FFBEffects[eID] == null)
                {
                    break;
                }
                FFBEffects[eID].Dispose();
                FFBEffects[eID] = null;
                break;
            }

            case FFBPType.PT_CTRLREP: {
                //this.RunExclusive(() => {
                this.SendFFBCommand(packet.GetFFBCommand());
                switch (packet.FFB_CTRL)
                {
                case FFB_CTRL.CTRL_STOPALL: {
                    for (int i = 0; i < this.FFBEffects.Length; i++)
                    {
                        if (FFBEffects[i] != null)
                        {
                            //FFBEffects[i].UpdateEffectStatus();
                            //if (FFBEffects[i].Status == FFB.EffectStatus.Playing && FFBEffects[i].Parameters.TriggerButton == -1)
                            if (FFBEffects[i] != null)
                            {
                                FFBEffects[i].Object?.Stop();
                            }
                        }
                    }
                    break;
                }

                case FFB_CTRL.CTRL_DEVRST: {
                    for (int i = 0; i < this.FFBEffects.Length; i++)
                    {
                        if (FFBEffects[i] != null)
                        {
                            //FFBEffects[i].UpdateEffectStatus();
                            //if (FFBEffects[i].Status == FFB.EffectStatus.Playing && FFBEffects[i].Parameters.TriggerButton == -1)
                            if (FFBEffects[i] != null)
                            {
                                FFBEffects[i].Dispose();
                                FFBEffects[i] = null;
                            }
                        }
                    }
                    break;
                }

                default: { break; }
                }
                //});
                break;
            }

            case FFBPType.PT_GAINREP: {
                //this.RunExclusive(() => {  });
                this.joystick.Properties.ForceFeedbackGain = (int)(packet.Gain * (10000 / 255.0));
                break;
            }

            default:
                break;
            }
        }