Notice: This forum has been recovered from an old backup, so some content, links, and dates may be outdated. The forum is currently read-only while we restore sign-in and registration functionality. Details

If you find this forum valuable and would like to help keep it online, donations to help cover hosting and domain costs are greatly appreciated, but never expected. You can support the forum through Buy Me a Coffee or Ko-fi. Thank you for helping preserve the EventGhost community.

HID-Plugin Abfrage analoger Werte

Allgemeines zum Thema EventGhost
Post Reply
Kupferdings
Posts: 3
Joined: Sun Jan 31, 2010 10:02 am

HID-Plugin Abfrage analoger Werte

Post by Kupferdings »

Hallo zusammen!

Ich nutze seit l├ñngerem Eventghost auf meinem HTPC und bin bisher sehr begeistert von dem M├Âgichkeiten.
Scheinbar bin ich jetzt jedoch an einem Punkt angekommen, an dem ich ein wenig Hilfe ben├Âtige.
Die Ausgangssituation:
Ich besitze einen Modellflugsimulator, bei dem das Flugzeug ├╝ber eine richtige Fernsteuerung im Simulator gesteuert wird. Diese wird ├╝ber USB an den PC angeschlossen und wird dort von Windows als HID-Device (so wie Gamepads, Joysticks) gef├╝hrt. Es gibt bei diesem Device keinerlei Buttons sondern nur 7 analoge Kan├ñle, die Werte von 1000-2000 annehmen k├Ânnen. Mit dem HID-Plugin wird in Eventghost auch alles sch├Ân erkannt und es werden auch die entsprechenden Events (z.B. HID.value.0 1097) ausgel├Âst.

Mein Problem:
Ich kann momentan mit der Fernsteuerung nur fliegen, nicht aber den Simulator bedienen, z.B. ein anderes Flugzeug w├ñhlen. Dazu wird eine Maus ben├Âtigt, die an einem HTPC eigentlich ├╝berfl├╝ssig und somit nicht vorhanden ist. Ich m├Âchte also mit einem Kn├╝ppel der Fernsteuerung den Mauszeiger bewegen und Klicks ausl├Âsen.

Ich habe mir das so vorgestellt, dass ich in Eventghost die Values abfrage und dann bei ├╝berschreiten eines Schwellwertes den Mauszeiger bewege. Also z.B. Wenn HID.value.0 > 1800 bewege Maus nach rechts, wenn HID.value.0 < 1100 bewege Maus nach rechts.
Genauso dann nach oben / unten und f├╝r die Klicks.
Leider scheint mir Eventghost standardm├ñ├ƒig keine M├Âglichkeit zu geben, den value abzufragen. Hier aus dem Forum lese ich, dass ich wohl eine Art Script machen muss, habe aber ├╝berhaupt keine Ahnung, wie ich das angehen soll (null Erfahrung mit Scripts oder Python). Ein Tutorial habe ich bisher nicht gefunden.

Recht vielversprechend klang für mich dieser Thread, wo der value mit in das Event eingearbeitet wird, allerdings fehlt mit auch dort der Ansatz, wo ich die beschriebene Stelle zum Ändern des Scripts finde.

Ich hoffe sehr, dass jemand mein Problem versteht und mir helfen kann!

Viele Grüße

P.S.: Für die Vollständigkeit: Ich nutze Eventghost 0.3.7.r1387 und WinXP SP3
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Re: HID-Plugin Abfrage analoger Werte

Post by Bartman »

Im einfachsten Fall geht das mit einem Einzeiler als Skript und dem bedingten Sprungbefehl.
ich hab das hier mal mit meinem Gamepad nachgestellt. Du m├╝sstest halt noch den Wert im Befehl anpassen und die Beschreibung durch den gew├╝nschten Wert ersetzen.

Code: Select all

<?xml version="1.0" encoding="UTF-8" ?>
<EventGhost Version="0">
    <Folder Name="HID Value" Expanded="True">
        <Macro Name="Value event" Expanded="True">
            <Event Name="RumblePad2.Value.0" />
            <Action>
                EventGhost.PythonCommand(u'eg.result = eg.event.payload > 192')
            </Action>
            <Action>
                EventGhost.NewJumpIf(XmlIdLink(1433), 1, False)
            </Action>
            <Action Name="high value">
                EventGhost.Comment()
            </Action>
        </Macro>
        <Macro Name="low Value" id="1433" Expanded="True">
            <Action Name="low Value">
                EventGhost.Comment()
            </Action>
        </Macro>
    </Folder>
</EventGhost>
Kupferdings
Posts: 3
Joined: Sun Jan 31, 2010 10:02 am

Re: HID-Plugin Abfrage analoger Werte

Post by Kupferdings »

Hallo
vielen Dank für die schnelle Antwort. Das funktioniert vom Prinzip her ganz wunderbar. Ich habe jetzt folgende Konfiguration erstellt, die soweit auch funktioniert. Kurze Erläuterung: Die Maus-Funktionen sollen nur dann aktiviert werden, wenn zwei Schalter an der Fernbedienung umgelegt sind, da die Maus sonst auch im Flug bedient würde. Daher wollte ich das abschaltbar machen.

Das Problem dabei: Eventghost kommt mit der Masse an Events nicht klar und hängt sich auf. Die Masse an Events kommt daher, dass für jede value-Änderung ein Event gefeuert wird und aufgrund der Empfindlichkeit der Steuerknüppel der Wert eigentlich permanent schwankt, in einer Position z.B. zwischen 1097 und 1096. Das führt dazu, dass im Log-Fenster nur noch schlieren zu sehen sind und Eventghost auf einem CPU-Kern etwa 70-90% CPU Last erzeugt.
Die L├Âsung funktioniert also, ist aber wegen der Eventghost Abst├╝rze und der hohen CPU Last noch optimierungsbed├╝rftig.

Wie kann das Problem eleganter und vor allem ohne eine so hohe CPU-Last gel├Âst werden?

Viele Grüße

Code: Select all

<Folder Name="Aerofly" Expanded="True">
        <Macro Name="Schalter 1" Enabled="False" Expanded="True">
            <Event Name="RC.Value.0" />
            <Action>
                EventGhost.PythonCommand(u'eg.result = eg.event.payload > 1800')
            </Action>
            <Action>
                EventGhost.NewJumpIf(XmlIdLink(34), 0, False)
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(36))
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(58))
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(53))
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(63))
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(68))
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(73))
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(79))
            </Action>
        </Macro>
        <Macro Name="Schalter 1 ein" id="34" Expanded="True">
            <Action>
                EventGhost.EnableItem(XmlIdLink(36))
            </Action>
        </Macro>
        <Macro Name="Schalter 2" id="36" Enabled="False" Expanded="True">
            <Event Name="RC.Value.1" />
            <Action>
                EventGhost.PythonCommand(u'eg.result = eg.event.payload > 1800')
            </Action>
            <Action>
                EventGhost.NewJumpIf(XmlIdLink(46), 0, False)
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(58))
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(53))
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(63))
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(68))
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(73))
            </Action>
            <Action>
                EventGhost.DisableItem(XmlIdLink(79))
            </Action>
        </Macro>
        <Macro Name="Schalter 2 ein" id="46" Expanded="True">
            <Action>
                EventGhost.EnableItem(XmlIdLink(58))
            </Action>
            <Action>
                EventGhost.EnableItem(XmlIdLink(53))
            </Action>
            <Action>
                EventGhost.EnableItem(XmlIdLink(63))
            </Action>
            <Action>
                EventGhost.EnableItem(XmlIdLink(68))
            </Action>
            <Action>
                EventGhost.EnableItem(XmlIdLink(73))
            </Action>
            <Action>
                EventGhost.EnableItem(XmlIdLink(79))
            </Action>
        </Macro>
        <Macro Name="Maus runter" id="53" Enabled="False" Expanded="True">
            <Event Name="RC.Value.4" />
            <Action>
                EventGhost.PythonCommand(u'eg.result = eg.event.payload < 1150')
            </Action>
            <Action>
                EventGhost.NewJumpIf(XmlIdLink(91), 1, False)
            </Action>
            <Action>
                Mouse.MoveRelative(0, 4)
            </Action>
        </Macro>
        <Macro Name="Maus hoch" id="58" Enabled="False" Expanded="True">
            <Event Name="RC.Value.4" />
            <Action>
                EventGhost.PythonCommand(u'eg.result = eg.event.payload > 1800')
            </Action>
            <Action>
                EventGhost.NewJumpIf(XmlIdLink(91), 1, False)
            </Action>
            <Action>
                Mouse.MoveRelative(0, -4)
            </Action>
        </Macro>
        <Macro Name="Maus rechts" id="63" Enabled="False" Expanded="True">
            <Event Name="RC.Value.5" />
            <Action>
                EventGhost.PythonCommand(u'eg.result = eg.event.payload > 1800')
            </Action>
            <Action>
                EventGhost.NewJumpIf(XmlIdLink(91), 1, False)
            </Action>
            <Action>
                Mouse.MoveRelative(-4, 0)
            </Action>
        </Macro>
        <Macro Name="Maus links" id="68" Enabled="False" Expanded="True">
            <Event Name="RC.Value.5" />
            <Action>
                EventGhost.PythonCommand(u'eg.result = eg.event.payload < 1150')
            </Action>
            <Action>
                EventGhost.NewJumpIf(XmlIdLink(91), 1, False)
            </Action>
            <Action>
                Mouse.MoveRelative(4, 0)
            </Action>
        </Macro>
        <Macro Name="Maus klick" id="73" Enabled="False" Expanded="True">
            <Event Name="RC.Value.3" />
            <Action>
                EventGhost.PythonCommand(u'eg.result = eg.event.payload > 1800')
            </Action>
            <Action>
                EventGhost.NewJumpIf(XmlIdLink(91), 1, False)
            </Action>
            <Action>
                Mouse.LeftButton()
            </Action>
            <Action>
                EventGhost.Wait(2.0)
            </Action>
        </Macro>
        <Macro Name="Taste Escape" id="79" Enabled="False" Expanded="True">
            <Event Name="RC.Value.3" />
            <Action>
                EventGhost.PythonCommand(u'eg.result = eg.event.payload < 1150')
            </Action>
            <Action>
                EventGhost.NewJumpIf(XmlIdLink(91), 1, False)
            </Action>
            <Action>
                Window.SendKeys(u'{Esc}', False)
            </Action>
            <Action>
                EventGhost.Wait(2.0)
            </Action>
        </Macro>
        <Macro Name="nichts" id="91" Expanded="True" />
    </Folder>
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Re: HID-Plugin Abfrage analoger Werte

Post by Bartman »

Sicher dass EG sich aufhängt?
Du hast da ein Warte Makro drin und da EG die events streng seriell abarbeitet wird dann zwei Sekunden gewartet während die ganze Zeit neue Events auftauchen.

Wirklich gut wird das nur gehen, wenn du ein eigenes Plugin schreibst und die Werte spezifisch auswertest. Da k├Ânnst du die kleinen Schwankungen rausfiltern und auch direkt so sachen wie links oben erkennen, w├ñhrend so die Werte wahrscheinlich einzeln pro Achse gefeuert wird.
Außerdem gingen dann auch sogenannte Enduring events, die zum Beispiel eine Mausbeschleunigung erlauben würden.
Kupferdings
Posts: 3
Joined: Sun Jan 31, 2010 10:02 am

Re: HID-Plugin Abfrage analoger Werte

Post by Kupferdings »

Hallo,
ok, das klingt einleuchtend mit den Wartezeiten. Ich wusste mir nur nicht anders zu helfen, da sonst direkt tausende Mausklicks erzeugt wurden. Ich habe es nochmal ausprobiert und Eventghost hängt aber auch, wenn ich nur die oben/unten und rechts/links Events benutze. Die hohe CPU Last bleibt auch.

Wie schreibe ich denn ein Plugin? Gibt es dazu irgendwo ein Tutorial oder etwas ähnliches? Vielleicht bekomme ich es ja auf diesem Weg hin..

Viele Grüße
Bartman
Plugin Developer
Posts: 881
Joined: Sun Feb 12, 2006 9:03 am

Re: HID-Plugin Abfrage analoger Werte

Post by Bartman »

Du kannst dir mal das GameVoice Plugin anschauen. Das ist ein ziemlich minimalistisches PlugIn für ein HID Gerät. Es gibt noch ein paar Hinweise im Wiki und im Coding Forum.
Post Reply