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.
Wir haben ja schon mal ├╝ber das HID-Thema geredet und ich habe heute noch mal nachgeforscht.
Anscheinend kann man das recht einfach mit Boardmitteln l├Âsen, da man die Ger├ñte einfach wie eine Datei ├Âffnen und lesen kann.
Damit kann ich z.B. einen Tastendruck auf meinem GameVoice auslesen. Zum PlugIn fehlt zwar noch einiges, aber ist ja schon mal ein Anfang.
Ja, das Problem ist nur, dass jedes Gerät anders arbeitet. Viele HID-FBs machen z.B. einen Teil der Tasten als HID-Keyboard und das wird dann nicht so einfach. Hatte ich hier mal erwähnt: http://www.eventghost.org/forum/viewtopic.php?t=167
Bei den generischen HID-Devices (die dann nach Maus und Keyboard übrig bleiben), gibt es dann kein festgelegtes Format der Daten. Da muss man also wieder für jedes Gerät experimentieren.
Über die HID-Descriptoren sollten solche FBs zwar ihre Tasten bekannt machen, aber da wird es dann kompliziert die zu enumerieren.
(Ich hab hier noch einen 600 Seiten Wälzer über USB/HID rumliegen. Aber noch nicht viel Lust gehabt ihn durchzulesen.)
Für den einfachen Fall wäre die einfache Bytefolge doch auch schon was.
Gibt es denn wirklich Fernbedienungen, die eine Standardtaste wie 1 oder einen Buchstaben als HID-Keyboard an Windows schicken?
Sowas wie Play/Pause oder Stopp wäre ja noch halbwegs sinnvoll und würden dann durch das Keyboard PlugIn erkennbar.
ich mach mich trotzdem mal dran, um wenigstens meine Zusatztasten nutzen zu k├Ânnen. Da m├╝ssen die Fernbedienungsnutzer dann mal testen, was passiert.
An die Ger├ñte, die sich als Tastatur oder Maus ausgeben kommt man anscheinend eh nicht per Standarddateizugriff ran, weil die exklusiv vom OS ge├Âffnet werden. Da muss dann wieder per RawInput dran. Vielleicht schau ich mir das mal irgendwann mal an, weil so wie es aussieht gibt es f├╝r neuere Betriebssysteme keine Treiber von Logitech f├╝r meine M├ñuse, so dass ich die ganzen zus├ñtzlichen Tasten nicht nutzen k├Ânnte.
Ich habe da aber grade zwei kleine Probleme:
Ich gebe in der Configure Methode des PlugIns ein dictionary zurück. Wenn dann die Startmethode aufgerufen wird scheinen die Einträge des Dictionary entpackt zu sein und die Anzahl der Argument passt entsprechend nicht.
Ich suche grade eine Eingabekomponente, die in einer Art Tabelle die Geräte auflistet, wo aber eine Spalte editierbar sein soll.
War es eigentlich schon immer so, dass PlugIns beim Aufruf des Konfigurationsdialogs gestoppt und dann wieder gestartet werden?
Das beendet nämlich beim Timer-Plugin effektiv alle laufenden Timer.
Und dann hab ich noch eine Frage, wie das mit dem HotPlug von Geräten gehandhabt werden soll. Zumindest beim USB_UIRT wird das bislang ja gar nicht gehandhabt und es knallt auch nach dem Wiederanstecken beim Senden und es wird nichts empfangen.
Bartman wrote:Ich habe da aber grade zwei kleine Probleme:
Ich gebe in der Configure Methode des PlugIns ein dictionary zurück. Wenn dann die Startmethode aufgerufen wird scheinen die Einträge des Dictionary entpackt zu sein und die Anzahl der Argument passt entsprechend nicht.
Gibst du denn das Dict auch als Teil des Return-Tupels zur├╝ck?
Bartman wrote:Ich suche grade eine Eingabekomponente, die in einer Art Tabelle die Geräte auflistet, wo aber eine Spalte editierbar sein soll.
Im wxPythonDemo ist so eine Liste unter "ListCtrl". Habe mir aber noch nicht genauer angesehen, wie die das gemacht haben. Anscheinend ├╝ber irgendwelche MixIn-Klassen.
Bartman wrote:War es eigentlich schon immer so, dass PlugIns beim Aufruf des Konfigurationsdialogs gestoppt und dann wieder gestartet werden?
Das beendet nämlich beim Timer-Plugin effektiv alle laufenden Timer.
Das sollte nur passieren, wenn sich die Parameter geändert haben. Das Timer Plugin hat doch eigentlich gar keine Parameter, oder?
Ich bekomme manchmal beim Starten von EG folgenden Fehler. Danach geht praktisch gar nichts mehr und ich kann EG nur noch per Taskmanager beenden.
Wenn ein einfacher Kompilierungsfehler vorliegt wird doch sonst auch sch├Ân die Zeile angezeigt.
22:14:28 Traceback (most recent call last):
22:14:28 File "D:\Media\EventGhost\eg\ThreadWorker.py", line 87, in DoOneEvent
22:14:28 File "D:\Media\EventGhost\eg\ThreadWorker.py", line 32, in __call__
22:14:28 File "D:\Media\EventGhost\eg\ActionThread.py", line 37, in StartSession
22:14:28 File "D:\Media\EventGhost\eg\MainFrame.py", line 421, in OnAutoLoad
22:14:28 File "D:\Media\EventGhost\eg\Document.py", line 106, in Load
22:14:28 File "D:\Media\EventGhost\eg\TreeItems\RootItem.py", line 31, in __init__
22:14:28 File "D:\Media\EventGhost\eg\TreeItems\ContainerItem.py", line 21, in __init__
22:14:28 File "D:\Media\EventGhost\eg\TreeItems\AutostartItem.py", line 9, in __init__
22:14:28 File "D:\Media\EventGhost\eg\TreeItems\ContainerItem.py", line 21, in __init__
22:14:28 File "D:\Media\EventGhost\eg\TreeItems\PluginItem.py", line 74, in __init__
22:14:28 File "pickle.pyc", line 1374, in loads
22:14:28 File "pickle.pyc", line 858, in load
22:14:28 File "pickle.pyc", line 1090, in load_global
22:14:28 File "pickle.pyc", line 1124, in find_class
22:14:28 ImportError: No module named HID
Sieht so aus, als ob du dem Plugin irgendeine Klassen-Instanz (namens HID) als Parameter ├╝bergibst. Als Parameter sind nur "built-in" Typen wie int, string, bool, sowie Listen, Tupel und Dictionarys daraus erlaubt.
ich habe eine Klasse HIDInfo in der ich die Infos zu ausgewählten Geräte speichere und ein paar Convenience-Funktionen eingebaut habe.
Ein Dictionary mit Instanzen der Klasse wollte ich dann als Datenstruktur abspeichern.
Geht das gar nicht?
Nein, das geht zur Zeit nicht. Vielleicht irgendwann mal, aber das wird ziemlich kompliziert. Denn die Pickle-Funktion erlaubt nur das erstellen von Instanzen, deren Klassen es vorher schon kennt.
Workaround:
Wenn du dein Dict in Configure speicherst, dann speichere die __dict__ der Instanzen:
Ich habe jetzt eine einfache Version, allerdings fliegt es mir meistens beim HidP_GetCaps Aufruf um die Ohren. Irgendwas stimmt da wohl mit dem Pointer nicht. Gelegentlich klappt es aber. Ich kapier aber nicht, was falsch ist.
Last edited by Bartman on Mon Feb 12, 2007 11:06 am, edited 1 time in total.
Bei mir scheint es eher in der win32file.ReadFile-Schleife zu knallen. Ich komme aber auch gerade nicht dahinter, was da los ist.
Probierst du das mit der normalen EG.exe aus oder welche Entwicklungsumgebung nutzt du? Solches Debugging mit "print" Anweisungen kann leicht t├╝ckisch sein, weil EG dann beim Absturz gar nicht die Zeit hat noch die letzten Ausgaben zu machen.
EDIT: Oder anders gesagt: die Ausgabe im Logger erfolgt asynchron.