private static void OnEffect(IntPtr data, IntPtr userData) { int id = 0; FFBPType type = 0; int DSize = 0; Byte[] arr = new Byte[20]; UInt32 wType = 0; IntPtr bytes = IntPtr.Zero; string TypeStr = ""; object obj = null; TesterForm form = null; // Converting user data from pointer to object if (userData != IntPtr.Zero) { // Convert userData from pointer to object GCHandle handle2 = (GCHandle)userData; obj = handle2.Target as object; form = obj as TesterForm; } // Get FFB packet raw data var result = joystick.Ffb_h_Packet(data, ref wType, ref DSize, ref arr); dlg.FfbTextBox_Write(String.Format("\r\n\r\n ============= FFB Packet size Size {0} =============", DSize + 8)); // Get the ID of the device that this DDB packet refers to result = joystick.Ffb_h_DeviceID(data, ref id); dlg.FfbTextBox_Write(String.Format("\r\n > Device ID: {0}", id)); // Get the type of the packet result = joystick.Ffb_h_Type(data, ref type); if (result == 0) { bool ok = PacketType2Str(type, ref TypeStr); if (!ok) { dlg.FfbTextBox_Write(String.Format("\r\n > Packet Type: {0}", type)); } else { dlg.FfbTextBox_Write(String.Format("\r\n > Packet Type: {0}", TypeStr)); } } ; // Get the index of the effect block (Always 1) int iBlock = 0; result = joystick.Ffb_h_EBI(data, ref iBlock); if (result == 0) { dlg.FfbTextBox_Write(String.Format("\r\n > Effect Block Index: {0}", iBlock)); } // TODO: Add constant magnitude #region Effect Report // Effect Report vGen.FFB_EFF_REPORT Effect = new vGen.FFB_EFF_REPORT(); result = joystick.Ffb_h_Eff_Report(data, ref Effect); if (result == 0) { ///// This is an Effect Block // Effect type if (!EffectType2Str(Effect.EffectType, ref TypeStr)) { dlg.FfbTextBox_Write(String.Format("\r\n >> Effect Report: {0}", Effect.EffectType)); } else { dlg.FfbTextBox_Write(String.Format("\r\n >> Effect Report: {0}", TypeStr)); } // Effect Direction if (Effect.Polar) { dlg.FfbTextBox_Write(String.Format("\r\n >> Direction: {0} deg ({1:D2})", Polar2Deg(Effect.Direction), Effect.Direction)); } else { dlg.FfbTextBox_Write(String.Format("\r\n >> X Direction: {0:X2}", Effect.DirX)); dlg.FfbTextBox_Write(String.Format("\r\n >> Y Direction: {0:X2}", Effect.DirY)); }; // Duration of the effect if (Effect.Duration == 0xFFFF) { dlg.FfbTextBox_Write(String.Format("\r\n >> Duration: Infinit")); } else { dlg.FfbTextBox_Write(String.Format("\r\n >> Duration: {0} MilliSec", (int)(Effect.Duration))); } // Trigger Repeat if (Effect.TrigerRpt == 0xFFFF) { dlg.FfbTextBox_Write(String.Format("\r\n >> Trigger Repeat: Infinit")); } else { dlg.FfbTextBox_Write(String.Format("\r\n >> Trigger Repeat: {0}", (int)(Effect.TrigerRpt))); } // Sample Period if (Effect.SamplePrd == 0xFFFF) { dlg.FfbTextBox_Write(String.Format("\r\n >> Sample Period: Infinit")); } else { dlg.FfbTextBox_Write(String.Format("\r\n >> Sample Period: {0}", (int)(Effect.SamplePrd))); } // Gain dlg.FfbTextBox_Write(String.Format("\r\n >> Gain: {0}%", Byte2Percent(Effect.Gain))); } ; #endregion Effect Report #region PID Device Control // Device Control (Global controls such as Device Reset, Device Pause ..... FFB_CTRL Control = FFB_CTRL.CTRL_STOPALL; string CtrlStr = ""; if ((0 == joystick.Ffb_h_DevCtrl(data, ref Control)) && DevCtrl2Str(Control, ref CtrlStr)) { dlg.FfbTextBox_Write(String.Format("\r\n >> PID Device Control: {0}", CtrlStr)); } #endregion #region Effect Operation vGen.FFB_EFF_OP Operation = new vGen.FFB_EFF_OP(); string EffOpStr = ""; if (0 == joystick.Ffb_h_EffOp(data, ref Operation) && EffectOpStr(Operation.EffectOp, ref EffOpStr)) { dlg.FfbTextBox_Write(String.Format("\r\n >> Effect Operation: {0}", EffOpStr)); if (Operation.LoopCount == 0xFF) { dlg.FfbTextBox_Write(String.Format("\r\n >> Loop until stopped")); } else { dlg.FfbTextBox_Write(String.Format("\r\n >> Loop {0} times", (int)(Operation.LoopCount))); } } ; #endregion #region Global Device Gain Byte Gain = 0; if (0 == joystick.Ffb_h_DevGain(data, ref Gain)) { dlg.FfbTextBox_Write(String.Format("\r\n >> Global Device Gain: {0}", Byte2Percent(Gain))); } #endregion #region Condition vGen.FFB_EFF_COND Condition = new vGen.FFB_EFF_COND(); if (0 == joystick.Ffb_h_Eff_Cond(data, ref Condition)) { if (Condition.isY) { dlg.FfbTextBox_Write(String.Format("\r\n >> Y Axis")); } else { dlg.FfbTextBox_Write(String.Format("\r\n >> X Axis")); } dlg.FfbTextBox_Write(String.Format("\r\n >> Center Point Offset: {0}", Condition.CenterPointOffset)); dlg.FfbTextBox_Write(String.Format("\r\n >> Positive Coefficient: {0}", Condition.PosCoeff)); dlg.FfbTextBox_Write(String.Format("\r\n >> Negative Coefficient: {0}", Condition.NegCoeff)); dlg.FfbTextBox_Write(String.Format("\r\n >> Positive Saturation: {0}", Condition.PosSatur)); dlg.FfbTextBox_Write(String.Format("\r\n >> Negative Saturation: {0}", Condition.NegSatur)); dlg.FfbTextBox_Write(String.Format("\r\n >> Dead Band: {0}", Condition.DeadBand)); } #endregion #region Envelope vGen.FFB_EFF_ENVLP Envelope = new vGen.FFB_EFF_ENVLP(); if (0 == joystick.Ffb_h_Eff_Envlp(data, ref Envelope)) { dlg.FfbTextBox_Write(String.Format("\r\n >> Attack Level: {0}", Envelope.AttackLevel)); dlg.FfbTextBox_Write(String.Format("\r\n >> Fade Level: {0}", Envelope.FadeLevel)); dlg.FfbTextBox_Write(String.Format("\r\n >> Attack Time: {0}", (int)(Envelope.AttackTime))); dlg.FfbTextBox_Write(String.Format("\r\n >> Fade Time: {0}", (int)(Envelope.FadeTime))); } ; #endregion #region Periodic vGen.FFB_EFF_PERIOD EffPrd = new vGen.FFB_EFF_PERIOD(); if (0 == joystick.Ffb_h_Eff_Period(data, ref EffPrd)) { dlg.FfbTextBox_Write(String.Format("\r\n >> Magnitude: {0}", EffPrd.Magnitude)); dlg.FfbTextBox_Write(String.Format("\r\n >> Offset: {0}", EffPrd.Offset)); dlg.FfbTextBox_Write(String.Format("\r\n >> Phase: {0}", EffPrd.Phase)); dlg.FfbTextBox_Write(String.Format("\r\n >> Period: {0}", (int)(EffPrd.Period))); } ; #endregion #region Effect Type FFBEType EffectType = FFBEType.ET_NONE; if (0 == joystick.Ffb_h_EffNew(data, ref EffectType)) { if (EffectType2Str(EffectType, ref TypeStr)) { dlg.FfbTextBox_Write(String.Format("\r\n >> Effect Type: {0}", TypeStr)); } else { dlg.FfbTextBox_Write(String.Format("\r\n >> Effect Type: Unknown")); } } #endregion #region Ramp Effect vGen.FFB_EFF_RAMP RampEffect = new vGen.FFB_EFF_RAMP(); if (0 == joystick.Ffb_h_Eff_Ramp(data, ref RampEffect)) { dlg.FfbTextBox_Write(String.Format("\r\n >> Ramp Start: {0}", RampEffect.Start)); dlg.FfbTextBox_Write(String.Format("\r\n >> Ramp End: {0}", RampEffect.End)); } ; #endregion #region Constant Effect vGen.FFB_EFF_CONSTANT ConstantEffect = new vGen.FFB_EFF_CONSTANT(); if (0 == joystick.Ffb_h_Eff_Constant(data, ref ConstantEffect)) { dlg.FfbTextBox_Write(String.Format("\r\n >> Constant Magnitude: {0}", ConstantEffect.Magnitude)); } ; #endregion dlg.FfbTextBox_Write(String.Format("\r\n ==============================================\r\n")); }