Mausbewegung (ehem:USB-Schnittstelle)
-
- Beiträge: 282
- Registriert: 03.01.2005 11:36
Mausbewegung (ehem:USB-Schnittstelle)
Einen schönen guten Tag!
Da ich nicht recht versiert im programmieren bin, hoffe ich dass ich hier Hilfe finde.
Kann mir jemand mal ein Beispiel geben, wie man Daten von einem USB-Port einlesen kann. Z.B. An einer USB-Schnittstelle ist eine Maus angeschlossen und nun möchte ich wissen wie man die Impulse zählen kann, wenn man die Maus bewegt.
Danke für eure Hilfe.
Martin
Topic korrigiert, siehe unten - Kaeru fecit
Da ich nicht recht versiert im programmieren bin, hoffe ich dass ich hier Hilfe finde.
Kann mir jemand mal ein Beispiel geben, wie man Daten von einem USB-Port einlesen kann. Z.B. An einer USB-Schnittstelle ist eine Maus angeschlossen und nun möchte ich wissen wie man die Impulse zählen kann, wenn man die Maus bewegt.
Danke für eure Hilfe.
Martin
Topic korrigiert, siehe unten - Kaeru fecit
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: USB-Schnittstelle
Das ist leider nicht so einfach. Was verstehst du denn unter Impulse?! Zwischen dem Prozessor und dem USB Port steht meistens ein UART o.ä. und die Originalimpulse gehen verloren auf dem Weg zum Prozessor. Das einzige was du machen kannst sind die HID Deskriptoren auslesen, aber selbst das ist mehr als aufwändig und mit PureBasic kaum möglich, da man dazu einen USB Treiber zwischenrein stellen müsste.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Re: USB-Schnittstelle
Habe kein Beispiel zur Hand und wie man direkt von USB liest, weiß ich auch nicht. Derzeit kann ich Dir nur ein paar Infos drumherum geben.
Vielleicht hilft Dir, daß seit den Zeiten der Seriell-Mäuse keine Impulse mehr übertragen werden, sondern Datenpakete, die die Anzahl der vertikalen und horizontalen Impulse enthalten. Das wird durch das BIOS 75-120 mal pro Sekunde abgefragt. Ein Datenprotokoll, das in P/S-2 verwendet wird und evtl. auch noch in USB, ist hier zu finden: http://www.computer-engineering.org/ps2mouse/.
Wenn es sich um eine andere Übertragung handeln sollte, etwa irgendwelche Werte per Seriell-zu-USB-Umsetzer, wird PC-intern die Verbindung mit einer emulierten Seriell-Verbindung hergestellt. Somit kannste einen Datentransfer mit dem Mikrokontroller machen, wie ich bei einem Mini-Digital-Oszilloskop mit µC.
Sag bitte Bescheid, ob das etwas weiterhalf.
Grüße - WPo
Vielleicht hilft Dir, daß seit den Zeiten der Seriell-Mäuse keine Impulse mehr übertragen werden, sondern Datenpakete, die die Anzahl der vertikalen und horizontalen Impulse enthalten. Das wird durch das BIOS 75-120 mal pro Sekunde abgefragt. Ein Datenprotokoll, das in P/S-2 verwendet wird und evtl. auch noch in USB, ist hier zu finden: http://www.computer-engineering.org/ps2mouse/.
Wenn es sich um eine andere Übertragung handeln sollte, etwa irgendwelche Werte per Seriell-zu-USB-Umsetzer, wird PC-intern die Verbindung mit einer emulierten Seriell-Verbindung hergestellt. Somit kannste einen Datentransfer mit dem Mikrokontroller machen, wie ich bei einem Mini-Digital-Oszilloskop mit µC.
Sag bitte Bescheid, ob das etwas weiterhalf.
Grüße - WPo
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
-
- Beiträge: 282
- Registriert: 03.01.2005 11:36
Re: USB-Schnittstelle
Hallo und einen schönen guten Tag!
Bin leider heute erst dazugekommen im Forum nachzuschauen. Folgendes wollte ich machen.
Im "Hardware-Forum" ist ein Thema eingestellt bei dem es um die Messung einer Wegstrecke mit der Mouse geht.
Nundachte ich, dass es in PB eine Funktion oder auch einen "recht einfachen Code" gibt, mit dem man die Bewegung der Mouse (z.B. wie viel cm wurde die Mouse über das Mousepad" bewegt) ermitteln kann.
Grüße
Martin
Bin leider heute erst dazugekommen im Forum nachzuschauen. Folgendes wollte ich machen.
Im "Hardware-Forum" ist ein Thema eingestellt bei dem es um die Messung einer Wegstrecke mit der Mouse geht.
Nundachte ich, dass es in PB eine Funktion oder auch einen "recht einfachen Code" gibt, mit dem man die Bewegung der Mouse (z.B. wie viel cm wurde die Mouse über das Mousepad" bewegt) ermitteln kann.
Grüße
Martin
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: USB-Schnittstelle
der billigste "recht einfache Code" wäre, wenn du einen Fullscreen aufmachst und präzise getimert das MouseDeltaX() ermittelst.
ohne Screen kannst du auch die Delta ermitteln, aber da dann wohl nur über API, weil die Koordinate sich ja nicht mehr ändert wenn die Maus anstößt.
also, dein normaler Maustreiber liefert IMMER ein vernünftiges Delta, das bekommst du bloß aus der Desktopkoordinate nicht raus,
weil der sozusagen automatisch X = X - DeltaX : IF X < 0 : X = 0 macht.
du siehst, da auf USB zugreifen zu wollen bist du komplett aufm falschen Dampfer, hättest gleich nach Mausbewegung fragen können.
ohne Screen kannst du auch die Delta ermitteln, aber da dann wohl nur über API, weil die Koordinate sich ja nicht mehr ändert wenn die Maus anstößt.
also, dein normaler Maustreiber liefert IMMER ein vernünftiges Delta, das bekommst du bloß aus der Desktopkoordinate nicht raus,
weil der sozusagen automatisch X = X - DeltaX : IF X < 0 : X = 0 macht.
du siehst, da auf USB zugreifen zu wollen bist du komplett aufm falschen Dampfer, hättest gleich nach Mausbewegung fragen können.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
-
- Beiträge: 282
- Registriert: 03.01.2005 11:36
Re: Mausbewegung (ehem:USB-Schnittstelle)
Einen schönen guten Morgen!
An die Funktion MouseX hatte ich gedacht. Damit kann man aber doch nur die Mousebewegung ermitteln solange die Mouse auf dem Bildschirm ist. Wenn ich aber z.B. ein Stück Papier unbekannter Länge (z.B. 150cm) unter der Mouse hindurchziehe möchte ich aber gerne die Länge der Papiers ermitteln. Das Ergebnis sollte also 150cm sein.
Gruß
Martin
An die Funktion MouseX hatte ich gedacht. Damit kann man aber doch nur die Mousebewegung ermitteln solange die Mouse auf dem Bildschirm ist. Wenn ich aber z.B. ein Stück Papier unbekannter Länge (z.B. 150cm) unter der Mouse hindurchziehe möchte ich aber gerne die Länge der Papiers ermitteln. Das Ergebnis sollte also 150cm sein.
Gruß
Martin
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: USB-Schnittstelle
bitte lesen.Kaeru Gaman hat geschrieben:der billigste "recht einfache Code" wäre, wenn du einen Fullscreen aufmachst und präzise getimert das MouseDeltaX() ermittelst.
ohne Screen kannst du auch die Delta ermitteln, aber da dann wohl nur über API, weil die Koordinate sich ja nicht mehr ändert wenn die Maus anstößt.
also, dein normaler Maustreiber liefert IMMER ein vernünftiges Delta, das bekommst du bloß aus der Desktopkoordinate nicht raus
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Re: Mausbewegung (ehem:USB-Schnittstelle)
Ich glaube, dass das nicht das Problem lösen wird. Wenn ich es richtig verstehe, willst Du deine Maus als "Maßband" missbrauchen?!!? Du willst Deine Maus über ein Holzbrett ziehen können und die Software soll Dir die Länge des Brettes ausgeben? Eine lustige Idee. Wenn ich es richtig sehe, dann wirst Du hier mit MouseDeltaX() aber nicht weiterkommen, da hier ja nur die Pixel ausgegeben werden. Das ist aber eine relative Größe, denn wie groß ist ein Pixel? Das hängt schließlich von der Lochmaske des Bildschirms und der verwendeten Auflösung ab. Ich habe auch noch nie mit MouseDeltaX() gearbeitet. Ich wollte das mal testen, nun läuft der Mist aber nicht. Was hab ich denn falsch gemacht?
ExamineMouse() gibt nur beim ersten Aufruf 1 aus, sonst 0...
Code: Alles auswählen
; INITIALISIERUNG
InitSprite()
InitMouse()
; HAUPTPROGRAMM
OpenScreen(1024,768,32,"Test")
StartTime=ElapsedMilliseconds()+1000
Debug ExamineMouse()
Repeat
NowTime = ElapsedMilliseconds()
If NowTime >= StartTime
ClearScreen(0)
pixel=MouseDeltaX()
StartTime = ElapsedMilliseconds()+1000
z=z+1
StartDrawing(ScreenOutput())
BackColor(0)
FrontColor($ffffff)
DrawText(0,0,"Maus wurde in der letzen Sekunde um " + Str(pixel) + " Pixel bewegt.")
DrawText(0,30,"MouseX= " + Str(MouseX()))
DrawText(0,50,"MouseY= " + Str(MouseY()))
StopDrawing()
FlipBuffers()
Debug ExamineMouse()
EndIf
Until z=10
(Win 11 64-bit, PB 6.04 und 6.10)
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
Re: Mausbewegung (ehem:USB-Schnittstelle)
warum debuggst du den Rückgabewert von ExamineMouse?
außerdem muss das bei jedem Schleifendurchlauf aufgerufen werden, das aktualisiert die werte.
wieso debuggst du überhaupt was während eines Fullscreens?
... war das das erste mal dass du überhaupt was mit der Screen Mouse machst?
außerdem muss das bei jedem Schleifendurchlauf aufgerufen werden, das aktualisiert die werte.
wieso debuggst du überhaupt was während eines Fullscreens?
... war das das erste mal dass du überhaupt was mit der Screen Mouse machst?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Re: Mausbewegung (ehem:USB-Schnittstelle)
Ich musste feststellen, dass ich MouseDeltaX() nicht auslesen konnte (immer 0). Ich habe zuerst mit einem Fenster und einer Console, die die Daten ausgeben sollte, gearbeitet. Dann dachte ich, dass es wohl nur mit dem aktiven Screen geht, deshalb der OpenScreen(). Ich habe ExamineMouse() debugged, um zu sehen, ob 0 oder 1. Und schließlich ist das doch auch der Fehler. Wieso muss ich ExamineMouse() bei jedem Schleifendurchlauf aufrufen? Außerdem möchte ich doch die "Pixelstrecke" auslesen, die innerhalb von einer Sekunde verschoben wurde...
Wovon ist denn ExamineMouse() abhängig? Tatsächlich: Wenn ist den Befehl in die Schleife schreibe, dann funktioniert es, aber warum nur dann?
Wovon ist denn ExamineMouse() abhängig? Tatsächlich: Wenn ist den Befehl in die Schleife schreibe, dann funktioniert es, aber warum nur dann?
(Win 11 64-bit, PB 6.04 und 6.10)