DirectInput, GamePad a vibrace   zodpovězená otázka

VB.NET, DirectX

Zdravím,

mám dotaz ve VB2008 si pomocí DirectInput čtu stav tlačítek na GamePadu + pozice os to je OK, ale potřeboval bych spustit vibrační motorky a ty mi nejdou. Když se o to pokusím vypíše mi to chybu aplikace (teď to sem nemůžu hodit přesně).

Nevíte někdo jak na to? Co jsem tam vygůglil tak by to mělo jít přes XNA ale s tím nejsem vůbec kamarád takže o tom nic nevím.

Předem díky za rady Martin

nahlásit spamnahlásit spam 0 odpovědětodpovědět

XNA podporuje pouze gamepady Xbox 360, žádné jiné. Ty vibrace by pomocí DirectInput měly jít, chtělo by to sem napsat tu chybu, ke které dochází.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takže při zavolání tohoto

joyDevice.SendForceFeedbackCommand(ForceFeedbackCommand.SetActuatorsOn)

to vypíše toto

A first chance exception of type 'Microsoft.DirectX.DirectInput.NotExclusivelyAcquiredException' occurred in Microsoft.DirectX.DirectInput.dll

Chyba v aplikaci.

-2147220987 (DIERR_NOTEXCLUSIVEACQUIRED & VFW_E_FILTER_ACTIVE & DMO_E_TYPE_NOT_ACCEPTED)

v Microsoft.DirectX.DirectInput.Device.SendForceFeedbackCommand(ForceFeedbackCommand command)

v Joystick.Form1.Button2_Click(Object sender, EventArgs e)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To vypadá, že gamepad je už používán nějakou jinou aplikací (například k němu dodávaný software jako třeba Logitech Profiler u RumblePadu 2) a nemůže být exkluzivně získán vaší aplikací.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Teď jsem našel že bych asi měl zavolat funkci SetCooperativeLevel ale nemůžu jí nikde najít :c( Hledám

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem našel kde to zavolat

            joyDevice.SetCooperativeLevel(Handle, CooperativeLevelFlags.Exclusive)

jen mi to vrací

A first chance exception of type 'System.ArgumentException' occurred in Microsoft.DirectX.DirectInput.dll

System.ArgumentException: Hodnota je mimo očekávaný rozsah.

v Microsoft.DirectX.DirectInput.Device.SetCooperativeLevel(IntPtr hwnd, CooperativeLevelFlags flags)

v Joystick.Form1.Form1_Load(Object sender, EventArgs e) v P:\VB2008\Joystick\Joystick\Form1.vb:řádek 25

No nic jdu spát a budu dále hledat a zkoušet zítra... Předem díky za případné nakopnutí :c)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak už jsem to rozvibroval pomocí kódu převedeného z C# a to takto:

Před řádek

    joyDevice.Acquire()

jsem přidal toto

    joyDevice.SetDataFormat(DeviceDataFormat.Joystick)
    joyDevice.SetCooperativeLevel(Me, CooperativeLevelFlags.Exclusive + CooperativeLevelFlags.Background)
    joyDevice.Properties.AxisModeAbsolute = True
    joyDevice.Properties.AutoCenter = False

dále funkce

    Public Shared Function InitializeForce(ByVal Dev As Device, ByVal Type As EffectType, ByVal Axis As Integer(), ByVal Magnitude As Integer, ByVal Flags As EffectFlags, ByVal Duration As Integer) As EffectObject
        Dim eo As EffectObject = Nothing
        Dim e As Effect

        For Each ei As EffectInformation In Dev.GetEffects(EffectType.All)
            Debug.Print(ei.Name)
            If DInputHelper.GetTypeCode(ei.EffectType) = CInt(Type) Then
                e = New Effect()
                e.SetDirection(New Integer(Axis.Length - 1) {})
                e.SetAxes(New Integer(0) {})

                e.EffectType = Type
                e.ConditionStruct = New Condition(Axis.Length - 1) {}
                e.Duration = Duration
                e.Gain = 10000
                e.Constant = New ConstantForce()
                e.Constant.Magnitude = Magnitude
                e.SamplePeriod = 0
                e.TriggerButton = CInt(Microsoft.DirectX.DirectInput.Button.NoTrigger)
                e.TriggerRepeatInterval = CInt(DI.Infinite)
                e.Flags = Flags
                e.UsesEnvelope = False

                ' Create the effect, using the passed in guid.
                eo = New EffectObject(ei.EffectGuid, e, Dev)
            End If
        Next

        Return eo
    End Function

kterou volám takto

    Dim EO As EffectObject = InitializeForce(joyDevice, EffectType.ConstantForce, axis, 10000, EffectFlags.ObjectOffsets Or EffectFlags.Spherical, 2000000)
    EO.Start(1)

GamePad sice zavibruje ale né tak jak bych potřeboval. Ve volání té funkce je poslední paramatr doba trvání v microsekundách a i když tam dám hodnotu třeba 10000000 tedy mělo by to být 10s tak po spuštění vibrace si gamepad zavibruje jak chce treba 2s nebo 4s apod. A navíc mi jedou oba motorky, ale já bych chtěl abych mohl spouštět každý zvlášť.

Dokáže mi někdo poradit jak to upravit abych mohl pouštět každý motor zvlášť na dobu jasně stanovenou?

Předem moc díky

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Opravdu nedokáže nikdo pomoci :c( Stále gůglim ale furt nic použitelného :c( Dokonce jsem si stáhl jakýsi USB monitor ve snaze vysledovat jaký příkaz gamepad obdrží ale absolutně se v tom nevyznám :c( Prosím někoho o pomoc

Dík moc Martin

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jestliže na nic nepřijdete, zkusil bych ještě poslední věc: Součástí DirectX SDK je vizuální editor Force Feedback efektů, jehož soubor se potom dá importovat pomocí nějaké metody v tom API. V tom editoru jde jednoduše naklikat libovolný efekt pomocí všech dostupných parametrů.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak jsem našel použití vibrací sice je to v C ale pomocí online převodníků jsem si to hodil do VB a vypadá to že to funguje. Teď si jenom večer musím ověřit rozebráním gamepadu jestli skutečně vibruje jen požadovaný motor.

http://msdn.microsoft.com/en-us/library/...

a pak jsem k tomu použil ten force editor stažený z netu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak se mi nepodařilo rozvibrovat jen požadovaný motor ale když tak oba. Pro moje účely by to stačit mohlo sice to není tak jak bych chtěl ale žít by se s tím dalo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A podporuje to vůbec ten gamepad? Co je to přesně za gamepad?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je to obyčejný gamepad a zkoušel jsem dokonce dva. EU3C FreePlayer a pak nějaký Speed-link Thunder Strike. K oboum mám nainstalované ovladače a v nich lze otestovat jednotlivé motorky tedy levý a pravý takže to ten gamepad podporovat si myslím umí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback